osg::StateSet::TRANSPARENT_BIN和osg::StateSet::OPAQUE_BIN和osg::StateSet::DEFAULT_BIN有什么区别
时间: 2023-08-06 22:05:07 浏览: 134
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,从而实现更加复杂的渲染效果。
相关问题
state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
这段代码的作用是设置节点的渲染提示(Rendering Hint),使得节点在渲染时被放置在透明渲染队列(Transparent Bin)中。
在 OpenSceneGraph 中,渲染提示是一种用来控制节点渲染顺序和方式的机制。不同的渲染提示可以将节点放置在不同的渲染队列中,从而实现不同的渲染效果。其中,TRANSPARENT_BIN 是一种透明渲染队列,用来处理具有透明效果的节点。
通过调用 state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN) 这段代码,我们将节点的渲染提示设置为 TRANSPARENT_BIN,这样在渲染时该节点就会被放置在透明渲染队列中,从而实现透明效果。需要注意的是,设置节点为透明渲染队列时,需要将节点的混合模式设置为启用混合(Blending),以实现透明度的效果。
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 创建对象时,不需要手动管理内存。
阅读全文