OSG 设置背景,前景

来源:互联网 发布:关于大数据的书 编辑:程序博客网 时间:2024/05/16 06:17

1。设置背景

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <osg/Group>  
  2. #include <osgViewer/Viewer>  
  3. #include <osgDB/ReadFile>  
  4. #include <osg/Camera>  
  5. #include <osg/Texture2D>  
  6. #include <iostream>  
  7.   
  8. /* 
  9. 方法: 
  10. HUD中的相机设置渲染顺序为PRE_RENDER,主相机清除深度缓存. 
  11.  */  
  12.   
  13. osg::Camera* createHUDBg(std::string imagePath){  
  14.   osg::ref_ptr<osg::Camera>camera=new osg::Camera;  
  15.   camera->setProjectionMatrixAsOrtho2D(0, 800, 0, 600);  
  16.   camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);  
  17.   camera->setRenderOrder(osg::Camera::PRE_RENDER);  
  18.   camera->setViewport(0,0,1300,800);  
  19.   camera->setClearMask(GL_DEPTH_BUFFER_BIT);  
  20.   camera->setAllowEventFocus(false);  
  21.   camera->setViewMatrix(osg::Matrix::identity());  
  22.   
  23.   osg::ref_ptr<osg::Geode>geode=new osg::Geode;  
  24.   geode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);  
  25.   
  26.   osg::ref_ptr<osg::Geometry>gm=new osg::Geometry;  
  27.   
  28. //亚入顶点  
  29.   osg::ref_ptr<osg::Vec3Array>vertex=new osg::Vec3Array;  
  30.   vertex->push_back(osg::Vec3(0,0,0));  
  31.   vertex->push_back(osg::Vec3(800,0,0));  
  32.   vertex->push_back(osg::Vec3(800,600,0));  
  33.   vertex->push_back(osg::Vec3(0,600,0));  
  34.   gm->setVertexArray(vertex);  
  35.   
  36. //压入法线  
  37.   
  38. //纹理坐标  
  39.   osg::ref_ptr<osg::Vec2Array>coord=new osg::Vec2Array;  
  40.   coord->push_back(osg::Vec2(0,0));  
  41.   coord->push_back(osg::Vec2(1,0));  
  42.   coord->push_back(osg::Vec2(1,1));  
  43.   coord->push_back(osg::Vec2(0,1));  
  44.   gm->setTexCoordArray(0, coord);  
  45.   gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));  
  46.   
  47.   osg::ref_ptr<osg::Image>image=osgDB::readImageFile(imagePath);  
  48.   if(!image.valid()){  
  49. //    std::cout<"read image faild "<<std::endl;  
  50.     return camera.release();  
  51.   }  
  52. //  osg::ref_ptr<osg::Texture2D>t2d=new osg::Texture2D;  
  53.   osg::Texture2D*t2d=new osg::Texture2D;  
  54.   t2d->setImage(0,image);  
  55.   
  56.   
  57.   gm->getOrCreateStateSet()->setTextureAttributeAndModes(0, t2d,osg::StateAttribute::ON);  
  58.   geode->addDrawable(gm);  
  59.   camera->addChild(geode);  
  60.   return camera.release();  
  61. }  
  62.   
  63. int main(int argc, char *argv[])  
  64. {  
  65.   osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;  
  66. //一定要有下面的语句,才能显示背景图;就是在显示背景图后,不要把背景图的颜色缓存给清空
  67.   viewer->getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT);  
  68.   osg::ref_ptr<osg::Group>root=new osg::Group;  
  69.   root->addChild(osgDB::readNodeFile("cow.osg"));  
  70.   root->addChild(createHUDBg("Images/skymap.jpg"));  
  71.   viewer->setSceneData(root.get());  
  72.   return viewer->run();  
  73.   }  

这个不能随着屏幕的缩放而缩放,当然解决办法有很多


前景,挺玄的,呵呵

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <osg/Group>  
  2. #include <osgViewer/Viewer>  
  3. #include <osgDB/ReadFile>  
  4. #include <osg/Camera>  
  5. #include <osg/Texture2D>  
  6. #include <iostream>  
  7.   
  8. /* 
  9. 前景方法: 
  10. HUD中的相机设置渲染顺序为POST_RENDER,主相机不清除深度缓存. 
  11.  */  
  12.   
  13. osg::Camera* createHUDBg(std::string imagePath){  
  14.   osg::ref_ptr<osg::Camera>camera=new osg::Camera;  
  15.   camera->setProjectionMatrixAsOrtho2D(0, 800, 0, 600);  
  16.   camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);  
  17.   camera->setRenderOrder(osg::Camera::POST_RENDER);  
  18.   camera->setViewport(0,0,1300,800);  
  19.   camera->setClearMask(GL_DEPTH_BUFFER_BIT);  
  20.   camera->setAllowEventFocus(false);  
  21.   camera->setViewMatrix(osg::Matrix::identity());  
  22.   
  23.   osg::ref_ptr<osg::Geode>geode=new osg::Geode;  
  24.   geode->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);  
  25.   geode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);  
  26.   
  27.   osg::ref_ptr<osg::Geometry>gm=new osg::Geometry;  
  28.   
  29. //亚入顶点  
  30.   osg::ref_ptr<osg::Vec3Array>vertex=new osg::Vec3Array;  
  31.   vertex->push_back(osg::Vec3(0,0,0));  
  32.   vertex->push_back(osg::Vec3(800,0,0));  
  33.   vertex->push_back(osg::Vec3(800,600,0));  
  34.   vertex->push_back(osg::Vec3(0,600,0));  
  35.   gm->setVertexArray(vertex);  
  36.   
  37. //压入法线  
  38.   
  39. //纹理坐标  
  40.   osg::ref_ptr<osg::Vec2Array>coord=new osg::Vec2Array;  
  41.   coord->push_back(osg::Vec2(0,0));  
  42.   coord->push_back(osg::Vec2(1,0));  
  43.   coord->push_back(osg::Vec2(1,1));  
  44.   coord->push_back(osg::Vec2(0,1));  
  45.   gm->setTexCoordArray(0, coord);  
  46.   gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));  
  47.   
  48.   osg::ref_ptr<osg::Image>image=osgDB::readImageFile(imagePath);  
  49.   if(!image.valid()){  
  50. //    std::cout<"read image faild "<<std::endl;  
  51.     return camera.release();  
  52.   }  
  53. //  osg::ref_ptr<osg::Texture2D>t2d=new osg::Texture2D;  
  54.   osg::Texture2D*t2d=new osg::Texture2D;  
  55.   t2d->setImage(0,image);  
  56.   
  57.   
  58.   gm->getOrCreateStateSet()->setTextureAttributeAndModes(0, t2d,osg::StateAttribute::ON);  
  59.   geode->addDrawable(gm);  
  60.   camera->addChild(geode);  
  61.   return camera.release();  
  62. }  
  63.   
  64. int main(int argc, char *argv[])  
  65. {  
  66.   osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;  
  67. //  viewer->getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT);  
  68.   osg::ref_ptr<osg::Group>root=new osg::Group;  
  69.   root->addChild(osgDB::readNodeFile("cow.osg"));  
  70.   root->addChild(createHUDBg("Images/smoke.rgb"));  
  71.   viewer->setSceneData(root.get());  
  72.   return viewer->run();  
  73.   }  


OSG 背景设置 (摘自王锐的cookbook)

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <osg/Geometry>  
  2. #include <osg/Geode>  
  3. #include <osg/Depth>  
  4. #include <osg/Texture2D>  
  5. #include <osgDB/ReadFile>  
  6. #include <osgViewer/Viewer>  
  7.   
  8. int main( int argc, char** argv )  
  9. {  
  10.     osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;  
  11.     osg::ref_ptr<osg::Image> image = osgDB::readImageFile( "D:/background1.png" );  
  12.     texture->setImage( image.get() );  
  13.       
  14.     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) );  
  15.     quad->getOrCreateStateSet()->setTextureAttributeAndModes( 0,texture.get());  
  16.       
  17.     osg::ref_ptr<osg::Geode> geode = new osg::Geode;  
  18.     geode->addDrawable( quad.get() );  
  19.       
  20.     osg::ref_ptr<osg::Camera> camera = new osg::Camera;  
  21.     camera->setClearMask( 0 );  
  22.     camera->setCullingActive( false );  
  23.     camera->setAllowEventFocus( false );  
  24.     camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );  
  25.     camera->setRenderOrder( osg::Camera::POST_RENDER );  
  26.     camera->setProjectionMatrix( osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0) );  
  27.     camera->addChild( geode.get() );  
  28.       
  29.     osg::StateSet* ss = camera->getOrCreateStateSet();  
  30.     ss->setMode( GL_LIGHTING, osg::StateAttribute::OFF );  
  31.     ss->setAttributeAndModes( new osg::Depth(osg::Depth::LEQUAL, 1.0, 1.0) );  
  32.       
  33.     osg::ref_ptr<osg::Group> root = new osg::Group;  
  34.     root->addChild( camera.get() );  
  35.     root->addChild( osgDB::readNodeFile("cessna.osg") );  
  36.       
  37.     osgViewer::Viewer viewer;  
  38.     viewer.setSceneData( root.get() );  
  39.     return viewer.run();  
  40. }  

上面的关键地方 就在

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 的时候就渲染了背景色。确保原有模型像素点不被覆盖。


0 0