osg setRenderBinDetails 使用

StateSet::setRenderBinDetails 用于控制对象绘制的顺序,函数第一个参数表示绘制优先级,比如我们需要绘制文字:

HUDStateSet->setRenderBinDetails(1000, "RenderBin"); // 表示绘制文字显示在屏幕最前端

程序默认的优先级为0,该函数可以设置不同的优先级,大于0,表示最后绘制,小于0,表示优先绘制(显示在底层)


从osg论坛抄来一段:

http://forum.openscenegraph.org/viewtopic.php?t=12133&view=next

stateset->setRenderBinDetails(-1,"RenderBin"); 

When OSG traverses a scene for rendering, it organizes geometry into 

separate render bins. Each bin has an index and a sorting mode. When 
it comes time to actually draw the geometry, the render bins are 
traversed in order of index (lowest to highest), and the geometry in 

those bins are drawn after being sorted according to the sorting mode. 

In this case the index of -1 means that the geometry in this bin will be 
drawn before the rest of the geometry (which by default goes into bin 
0). "RenderBin" is the default sort order

当使用OSG遍历场景渲染时,会组织几何体到不同的渲染元中,每一个渲染元都包含索引值和排序模式,当真正需要绘制时,渲染元遍历索引(从低到高的顺序),

同时几何体使用预设的排序模式进行排序,然后绘制。

当索引值为 -1时,表示这个几何体在这个渲染元中比其他几何体更早绘制。


同时,还有国内大牛,王锐的解释:

很多时候我们需要某些几何体在其它对象之前被绘制,比如天空总是要被任何飞
过的物体所遮挡;很多时候我们也需要在大部分对象绘制完成之后才绘制某个几何体的数据
(例如HUD 文字总是显示在所有对象之上)。这种情况下,就有必要对“渲染台”中的数
据进行排序,甚至为其创建新的分支“渲染元”,以实现这种复杂的渲染顺序处理。
在用户程序中,渲染顺序通过StateSet::setRenderBinDetails 实现设置。这个函数有两个
传入参数,整型数表示渲染的顺序,以0 为标准,小于0 的渲染状态集(亦即包含了这个

StateSet 的StateGraph 状态节点)将排列在前(个人认为是在最前绘制,显示到屏幕后面),

大于0 的则排列在后(最后绘制,显示在屏幕最前面);字符串参数“RenderBin”

或者“DepthSortedBin”作为名称时有特殊含义,其中“RenderBin”表示在渲染树中新建分
支进行渲染,“DepthSortedBin”表示新建分支,并且所有要渲染的数据将按照深度值降序进
行排序。
注意,当字符串参数不为“RenderBin”或“DepthSortedBin”时,渲染顺序的设定也是
无效的;当字符串参数和整型参数均有效时,OSG 系统将尝试寻找同类型的渲染元节点并
将StateSet 记录到此“渲染元”中,或者创建新的“渲染元”节点。相关的示例代码如下:
// 缺省渲染方式,渲染顺序0,此时状态节点直接置入“渲染台”
stateSet->setRenderBinDetails( 0, “” );
// 渲染顺序-1(先渲染),此时渲染树中将新建一个“渲染元”节点
stateSet->setRenderBinDetails( -1, “RenderBin” );
// 渲染顺序10,此时将新建一个“渲染元”,并按深度值降序排序各元素
stateSet->setRenderBinDetails( 10, “DepthSortedBin” );
为了简化操作,用户程序还可以使用StateSet::setRenderingHint 来设置渲染的顺序,这
个函数的传入参数可以为枚举量OPAQUE_BIN 或TRANSPARENT_BIN。前者可以指定该
渲染状态用于不透明物体的渲染,后者则指定该渲染状态用于透明物体的渲染,此时OSG
自动将其渲染顺序置后,并设置它所管理的“状态节点”和“渲染叶”数据按照深度值降序
进行排序。
关于 setRenderBinDetails 与setRenderingHint 的关系,也可以这样解释:
stateSet->setRenderingHint ( OPAQUE_BIN );
stateSet->setRenderingHint ( TRANSPARENT_BIN );
分别等价于:
stateSet->setRenderBinDetails( 0, “RenderBin” );
stateSet->setRenderBinDetails( 10, “DepthSortedBin” );

你可能感兴趣的:(OSG)