osg实现透明效果 正解

   最近某个项目中要用OSG画部分半透明效果的形状,绘制可参考OSG自带例子:Examples osggeometry

    但是半透明效果一直出不来,google一番之后 有位热心网友提供的方案是:

  osg::StateSet* stateset = _geometryFeild->getOrCreateStateSet();

  //Alpha混合开启
  stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
  //取消深度测试
   stateset->setMode( GL_DEPTH_TEST, osg::StateAttribute::OFF  );

  stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED );

  但每次 stateset->setMode( GL_DEPTH_TEST, osg::StateAttribute::OFF  );之后 绘制出来的区域不见了。。。。

 经过多次试验探索,发现是渲染级别的问题,默认情况下,OSG所有加载进来的node渲染级别都是-1,这样也就是所有节点的渲染级别是相同的。在这种情况下,取消深度测试后以实现半透明效果,但半透明效果的node节点会被其它node节点“覆盖”-----》其实是半透明部分被其它节点渲染替代,见下面两幅图中的GL_POLYGON部分,第一副就是默认渲染级别下,半透明图形被背景“覆盖”,第二幅就是正解了osg实现透明效果 正解 - 砖头不离身 - 砖头不离身

osg实现透明效果 正解_第1张图片
 

 

osg实现透明效果 正解_第2张图片
 
 

 所以,osg绘制半透明形状的正解如下:

  osg::StateSet* stateset = _geometryFeild->getOrCreateStateSet();
  //Alpha混合开启
  stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
  //取消深度测试
   stateset->setMode( GL_DEPTH_TEST, osg::StateAttribute::OFF  );
  stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED );
  stateset->setRenderBinDetails(11, "RenderBin");//设置渲染优先级------级别理论上来讲 比 背景的node 后就行,没设置过的是-1.

你可能感兴趣的:(osg实现透明效果 正解)