当父节点stateset设置为osg::StateAttribute::OVERRIDE之后,子节点设置stateset还管用吗
时间: 2024-01-06 08:04:50 浏览: 143
当父节点的stateset设置为osg::StateAttribute::OVERRIDE时,子节点设置的stateset不再管用。因为当父节点的stateset设置为OVERRIDE时,它将覆盖所有子节点的stateset设置。此时,子节点设置的stateset将被忽略,只有父节点的stateset起作用。所以,如果你需要在子节点中设置stateset,请确保父节点的stateset没有设置为OVERRIDE。
相关问题
osg::ref_ptr<osg::StateSet> state = new osg::StateSet; osg::Material* mat = new osg::Material(); mat->setColorMode(osg::Material::ColorMode::AMBIENT_AND_DIFFUSE); state->setAttribute(mat);
这段代码的作用是创建一个 osg::StateSet 对象,并将一个 AMBIENT_AND_DIFFUSE 模式的 Material 附加到这个 StateSet 中,从而实现对节点的材质设置。
具体来说,首先我们创建了一个 osg::StateSet 对象 state,它用来存储节点的渲染状态(如材质、纹理、混合模式等)。然后,我们创建了一个 osg::Material 对象 mat,并将它的颜色模式设置为 AMBIENT_AND_DIFFUSE。接着,我们将这个 Material 对象设置为 state 的属性,这样就可以将这个材质应用到节点的渲染中了。
这段代码中使用了 osg::ref_ptr 来管理指针,这是 OpenSceneGraph 中的一种智能指针(Smart Pointer)实现,用来自动管理对象的引用计数,避免内存泄漏等问题。因此,在使用 ref_ptr 创建对象时,不需要手动管理内存。
osg::StateSet::TRANSPARENT_BIN和osg::StateSet::OPAQUE_BIN和osg::StateSet::DEFAULT_BIN有什么区别
osg::StateSet 中的 TRANSPARENT_BIN、OPAQUE_BIN 和 DEFAULT_BIN 表示不同的渲染 bin,它们的区别主要在于渲染时的顺序和透明度处理。
- TRANSPARENT_BIN:透明渲染 bin,用于渲染具有透明效果的物体。在进行渲染时,透明物体需要先进行渲染,因此需要将它们放在透明渲染 bin 中。在渲染透明物体时,需要考虑物体的透明度,通常采用深度排序和 alpha 混合等方式来处理透明度。
- OPAQUE_BIN:不透明渲染 bin,用于渲染不具有透明效果的物体。在进行渲染时,不透明物体可以放在不透明渲染 bin 中。在渲染不透明物体时,不需要考虑透明度,通常只需要进行深度测试和深度写入等操作即可。
- DEFAULT_BIN:默认渲染 bin,用于普通的渲染效果。在进行渲染时,没有特殊需求的物体可以放在默认渲染 bin 中。
在进行渲染时,OpenGL 会按照渲染 bin 的顺序进行渲染,即先渲染 TRANSPARENT_BIN 中的物体,再渲染 OPAQUE_BIN 中的物体,最后渲染 DEFAULT_BIN 中的物体。这样可以确保透明物体不会遮挡不透明物体。
需要注意的是,TRANSPARENT_BIN 和 OPAQUE_BIN 只是一种约定俗成的习惯,实际上可以根据需要创建任意数量的渲染 bin,从而实现更加复杂的渲染效果。
阅读全文