1。设置背景
[cpp] view plain copy print ? #include <osg/Group> #include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <osg/Camera> #include <osg/Texture2D> #include <iostream> /* 方法: HUD中的相机设置渲染顺序为PRE_RENDER,主相机清除深度缓存. */ osg::Camera* createHUDBg(std::string imagePath){ osg::ref_ptr<osg::Camera>camera=new osg::Camera; camera->setProjectionMatrixAsOrtho2D(0, 800, 0, 600); camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); camera->setRenderOrder(osg::Camera::PRE_RENDER); camera->setViewport(0,0,1300,800); camera->setClearMask(GL_DEPTH_BUFFER_BIT); camera->setAllowEventFocus(false); camera->setViewMatrix(osg::Matrix::identity()); osg::ref_ptr<osg::Geode>geode=new osg::Geode; geode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF); osg::ref_ptr<osg::Geometry>gm=new osg::Geometry; //亚入顶点 osg::ref_ptr<osg::Vec3Array>vertex=new osg::Vec3Array; vertex->push_back(osg::Vec3(0,0,0)); vertex->push_back(osg::Vec3(800,0,0)); vertex->push_back(osg::Vec3(800,600,0)); vertex->push_back(osg::Vec3(0,600,0)); gm->setVertexArray(vertex); //压入法线 //纹理坐标 osg::ref_ptr<osg::Vec2Array>coord=new osg::Vec2Array; coord->push_back(osg::Vec2(0,0)); coord->push_back(osg::Vec2(1,0)); coord->push_back(osg::Vec2(1,1)); coord->push_back(osg::Vec2(0,1)); gm->setTexCoordArray(0, coord); gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); osg::ref_ptr<osg::Image>image=osgDB::readImageFile(imagePath); if(!image.valid()){ // std::cout<"read image faild "<<std::endl; return camera.release(); } // osg::ref_ptr<osg::Texture2D>t2d=new osg::Texture2D; osg::Texture2D*t2d=new osg::Texture2D; t2d->setImage(0,image); gm->getOrCreateStateSet()->setTextureAttributeAndModes(0, t2d,osg::StateAttribute::ON); geode->addDrawable(gm); camera->addChild(geode); return camera.release(); } int main(int argc, char *argv[]) { osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer; //一定要有下面的语句,才能显示背景图;就是在显示背景图后,不要把背景图的颜色缓存给清空 viewer->getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT); osg::ref_ptr<osg::Group>root=new osg::Group; root->addChild(osgDB::readNodeFile("cow.osg")); root->addChild(createHUDBg("Images/skymap.jpg")); viewer->setSceneData(root.get()); return viewer->run(); }
这个不能随着屏幕的缩放而缩放,当然解决办法有很多
前景,挺玄的,呵呵
[cpp] view plain copy print ? #include <osg/Group> #include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <osg/Camera> #include <osg/Texture2D> #include <iostream> /* 前景方法: HUD中的相机设置渲染顺序为POST_RENDER,主相机不清除深度缓存. */ osg::Camera* createHUDBg(std::string imagePath){ osg::ref_ptr<osg::Camera>camera=new osg::Camera; camera->setProjectionMatrixAsOrtho2D(0, 800, 0, 600); camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); camera->setRenderOrder(osg::Camera::POST_RENDER); camera->setViewport(0,0,1300,800); camera->setClearMask(GL_DEPTH_BUFFER_BIT); camera->setAllowEventFocus(false); camera->setViewMatrix(osg::Matrix::identity()); osg::ref_ptr<osg::Geode>geode=new osg::Geode; geode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF); geode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON); osg::ref_ptr<osg::Geometry>gm=new osg::Geometry; //亚入顶点 osg::ref_ptr<osg::Vec3Array>vertex=new osg::Vec3Array; vertex->push_back(osg::Vec3(0,0,0)); vertex->push_back(osg::Vec3(800,0,0)); vertex->push_back(osg::Vec3(800,600,0)); vertex->push_back(osg::Vec3(0,600,0)); gm->setVertexArray(vertex); //压入法线 //纹理坐标 osg::ref_ptr<osg::Vec2Array>coord=new osg::Vec2Array; coord->push_back(osg::Vec2(0,0)); coord->push_back(osg::Vec2(1,0)); coord->push_back(osg::Vec2(1,1)); coord->push_back(osg::Vec2(0,1)); gm->setTexCoordArray(0, coord); gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); osg::ref_ptr<osg::Image>image=osgDB::readImageFile(imagePath); if(!image.valid()){ // std::cout<"read image faild "<<std::endl; return camera.release(); } // osg::ref_ptr<osg::Texture2D>t2d=new osg::Texture2D; osg::Texture2D*t2d=new osg::Texture2D; t2d->setImage(0,image); gm->getOrCreateStateSet()->setTextureAttributeAndModes(0, t2d,osg::StateAttribute::ON); geode->addDrawable(gm); camera->addChild(geode); return camera.release(); } int main(int argc, char *argv[]) { osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer; // viewer->getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT); osg::ref_ptr<osg::Group>root=new osg::Group; root->addChild(osgDB::readNodeFile("cow.osg")); root->addChild(createHUDBg("Images/smoke.rgb")); viewer->setSceneData(root.get()); return viewer->run(); }
OSG 背景设置 (摘自王锐的cookbook)
[cpp] view plain copy print ? #include <osg/Geometry> #include <osg/Geode> #include <osg/Depth> #include <osg/Texture2D> #include <osgDB/ReadFile> #include <osgViewer/Viewer> int main( int argc, char** argv ) { osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; osg::ref_ptr<osg::Image> image = osgDB::readImageFile( "D:/background1.png" ); texture->setImage( image.get() ); osg::ref_ptr<osg::Drawable> quad = osg::createTexturedQuadGeometry(osg::Vec3(), osg::Vec3(1.0f, 0.0f, 0.0f), osg::Vec3(0.0f, 1.0f, 0.0f) ); quad->getOrCreateStateSet()->setTextureAttributeAndModes( 0,texture.get()); osg::ref_ptr<osg::Geode> geode = new osg::Geode; geode->addDrawable( quad.get() ); osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setClearMask( 0 ); camera->setCullingActive( false ); camera->setAllowEventFocus( false ); camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF ); camera->setRenderOrder( osg::Camera::POST_RENDER ); camera->setProjectionMatrix( osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0) ); camera->addChild( geode.get() ); osg::StateSet* ss = camera->getOrCreateStateSet(); ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF ); ss->setAttributeAndModes( new osg::Depth(osg::Depth::LEQUAL, 1.0, 1.0) ); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild( camera.get() ); root->addChild( osgDB::readNodeFile("cessna.osg") ); osgViewer::Viewer viewer; viewer.setSceneData( root.get() ); return viewer.run(); }上面的关键地方 就在
setAttributeAndModes( new osg::Depth(osg::Depth::LEQUAL,1.0, 1.0) ); 这句话,
重新映射背景节点的深度值为1-1 ,这样就确保了每个后渲染(post-rendered)背景的深度值是1,osg::Depth::LEQUAL 确保除非原始深度缓存的值为1才会渲染上背景,否则此地方背景不会被渲染。
那么什么时候,原始缓存的深度值为1 ? 答案是:深度缓存在初始化的时候都是1,当有像素绘制后,此像素对应的深度缓存就不为1,也就是说所有没有被渲染的地方都是1. 这样没被渲染的地方,在post-rendered 的时候就渲染了背景色。确保原有模型像素点不被覆盖。
