osg渲染至纹理(rtt),不同几何体由于blend导致相交处“黑边”

“黑边”截图:
osg渲染至纹理(rtt),不同几何体由于blend导致相交处“黑边”_第1张图片
正常截图:
osg渲染至纹理(rtt),不同几何体由于blend导致相交处“黑边”_第2张图片
部分源码:

pStateSet->setMode(GL_BLEND, osg::StateAttribute::ON);
//pStateSet->setRenderBinDetails(1000, "RenderBin");
pStateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);

osg::StateSet::TRANSPARENT_BIN设置后黑边消失,但深层次原因待查。

setRenderingHint参数osg::StateSet::TRANSPARENT_BIN、OPAQUE_BIN将场景节点粗略的划分为透明和不透明两个层次,某种程度上上可以解决blend的问题,但当两个透明物体非常相近时可能就会失效,这时setRenderBinDetails就可以发挥作用了,实际上setRenderingHint(osg::StateSet::TRANSPARENT_BIN) 等价于 setRenderBinDetails(10, “DepthSortedBin”),所以可以用setRenderBinDetails对深度进行细分。

扩展阅读:https://blog.csdn.net/kasteluo/article/details/80807099

StateSet::setRenderBinDetails 用于控制对象绘制的顺序,函数第一个参数表示绘制优先级

第二个参数

RenderBin 表示在渲染树中新建分支进行渲染

DepthSortedBin 表示新建分支,并且所有要渲染的数据将按照深度值降序进行排序。

注意,当字符串参数不为“RenderBin”或“DepthSortedBin”时,渲染顺序的设定也是
无效的;当字符串参数和整型参数均有效时,OSG 系统将尝试寻找同类型的渲染元节点并
将StateSet 记录到此“渲染元”中,或者创建新的“渲染元”节点。

实例代码

// 缺省渲染方式,渲染顺序0,此时状态节点直接置入“渲染台”
stateSet->setRenderBinDetails( 0, “” );

// 渲染顺序-1(先渲染),此时渲染树中将新建一个“渲染元”节点
stateSet->setRenderBinDetails( -1, “RenderBin” );

// 渲染顺序10,此时将新建一个“渲染元”,并按深度值降序排序各元素
stateSet->setRenderBinDetails( 10, “DepthSortedBin” );

StateSet::setRenderingHint 简化版设置

为了简化操作,用户程序还可以使用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,前端,javascript,开发语言)