OSG - 创建覆盖,始终在顶部渲染状态栏?

时间:2014-02-04 10:35:42

标签: rendering openscenegraph

我做了一个场景,在那里我发现了一些碰撞(交叉点),我想要显示那次碰撞的进展(比如与物体的交互)。例如,您指向灯光开关,并且根据指向开关所花费的时间填充圆圈,因此灯光会在一段计时器周期后打开/关闭。

“填充cricle /状态栏”保存在图像1.png,2.png ...

//that "filling circle progress" is saved in images
osg::ref_ptr<osg::Image> image1 = osgDB::readImageFile("1.png");
osg::ref_ptr<osg::Texture2D> texture1 = new osg::Texture2D;
texture1->setImage( image1.get() );

//create textured quad
osg::ref_ptr<osg::Geometry> quad1 = osg::createTexturedQuadGeometry( osg::Vec3(-0.5f, 0.0f,-0.5f),
                                                                            osg::Vec3(1.0f,0.0f,0.0f),
                                                                            osg::Vec3(0.0f,0.0f,1.0f) );

osg::StateSet* ss1 = quad1->getOrCreateStateSet();
ss1->setTextureAttributeAndModes( 0, texture1.get() );
ss1->setMode(GL_BLEND,osg::StateAttribute::ON); 
ss1->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); 

// I want that the "filling circle" will be always faced toward camera, so I use Billboards
osg::ref_ptr<osg::Billboard> timer1 = new osg::Billboard;
timer1->setMode(osg::Billboard::POINT_ROT_EYE);
timer1->addDrawable( quad1.get());

// I switch between 4 different states - 1/4 of circle, 2/4, 3/4, 4/4..
// thats why I use Switch
osg::Switch* switcher = new osg::Switch;
switcher->addChild( timer1.get(),true);

// just rootNode of scene
rootNode->addChild( switcher);

所以,这很有效,但问题是有时候“状态栏=填充圆圈”被其他一些对象覆盖(基于我猜的深度缓冲区)。我应该使用什么来使状态栏始终呈现在所有内容之上?

我试图制作HUD相机,但这对我没用(它只是没有渲染)而且我不知道它是否以正确的方式进行操作。

由于

1 个答案:

答案 0 :(得分:0)

通常你会关闭深度测试和深度写入,并将类似HUD的项目放入渲染箱中,渲染所有其他东西。我想有一些如何做到这一点的例子,可能是在osg HUD示例中。