osg背景图片设置

    xiaoxiao2021-03-25  93

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

    转载请注明原文地址: https://ju.6miu.com/read-18016.html

    最新回复(0)