osg.UniformBase是一个虚基类,用于在OpenSceneGraph中表示Uniform。
Uniform是用来在Shader中传递数据的一种机制,常常被用于将模型的转换矩阵、光源信息等传递到Shader中进行处理。
OpenSceneGraph中提供了多种类型的Uniform,包括基础类型的Uniform(如float、int、vec3等)、矩阵类型的Uniform(如mat4等)以及纹理等高级类型的Uniform。
osg::Referenced -> osg::Object -> osg::UniformBase
osg::UniformBase是一个虚基类,不能直接实例化。OpenSceneGraph提供了多种类型的具体Uniform类。
获取Uniform的名称。名称通常是在Shader中定义的Uniform变量名。
获取Uniform的类型。类型决定了Uniform可以传递哪些数据。
获取Uniform可以传递的元素数量。对于非数组类型的Uniform,元素数量为1。
将Uniform的值应用到OpenGL状态中。这个函数会在绘制场景的时候被调用。
osg::Uniform* myUniform = new osg::Uniform("myUniform", osg::Vec3(1.0f, 0.0f, 0.0f));
myNode->getOrCreateStateSet()->addUniform(myUniform);
上面的代码创建了一个Vec3类型的Uniform,并将其值设置为红色。然后将这个Uniform添加到一个Node的StateSet中。
void MyNodeCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
{
osg::Vec3 cameraPos = ... ; // 获取相机位置
osg::Uniform* cameraPosUniform = node->getOrCreateStateSet()->getOrCreateUniform("cameraPos", osg::Uniform::FLOAT_VEC3);
cameraPosUniform->set(cameraPos);
traverse(node, nv);
}
上面的代码定义了一个NodeCallback,在其operator()中将相机位置传递给名为"cameraPos"的Uniform。