osg::StateSet::TRANSPARENT_BIN和osg::StateSet::OPAQUE_BIN和osg::StateSet::DEFAULT_BIN有什么区别
时间: 2023-08-06 19:05:07 浏览: 56
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
set = node->getOrCreateStateSet() 是干什么用的?
这段代码是用来获取或者创建一个osg::ref_ptr<osg::StateSet>类型的状态集合,然后将其设置给一个节点。StateSet中包含了称为"状态属性"的各种信息,如材料属性、渲染属性等,这些信息用来控制OpenGL渲染状态机的状态,从而实现图形的渲染。