OSG HUD (渲染屏幕上贴图和写字)

xiaoxiao2021-02-28  161

OSG HUD (渲染屏幕上贴图和写字) 前言:随便学学。 HUD,相机的一种,好比英雄联盟的小地图。 主要渲染流程如下: 实现步骤代码: osg::ref_ptr<osg::Camera> camera = new osg::Camera; //二维相机,设置观察矩阵始终是一个单位矩阵 camera->setViewMatrix(osg::Matrix::identity()); //最后渲染 camera->setRenderOrder(osg::Camera::POST_RENDER); //在其他相机的基础上渲染,清楚缓存 camera->setClearMask(GL_DEPTH_BUFFER_BIT); //不接受事件 camera->setAllowEventFocus(false); //始终显示,不受其他节点影响 //设置参考帧 camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); //设置视口 camera->setProjectionMatrixAsOrtho2D(0, 1920, 0, 1280); 实例代码: //HUD贴图和文字显示 #include <osgViewer/Viewer> #include <osgDB/ReadFile> #include <osg/Camera> #include <osgText/Text> #include <osgViewer/ViewerEventHandlers> #include <osg/Image> #include <osg/Geometry> #include <osg/PrimitiveSet> osg::Camera* CreateTextHUD() { osg::ref_ptr<osg::Camera> camera = new osg::Camera; //二维相机,设置观察矩阵始终是一个单位矩阵 camera->setViewMatrix(osg::Matrix::identity()); //最后渲染 camera->setRenderOrder(osg::Camera::POST_RENDER); //在其他相机的基础上渲染,清楚缓存 camera->setClearMask(GL_DEPTH_BUFFER_BIT); //不接受事件 camera->setAllowEventFocus(false); //始终显示,不受其他节点影响 //设置参考帧 camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); //设置视口 camera->setProjectionMatrixAsOrtho2D(0, 1920, 0, 1280); //设置字体 osg::ref_ptr<osg::Geode> gnode = new osg::Geode; osg::ref_ptr<osgText::Text> text = new osgText::Text; //关闭字体光照 gnode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); gnode->addDrawable(text); //微软雅黑 text->setFont("Fonts/msyh.ttc"); text->setCharacterSize(50.0); text->setText(L"测试字体"); text->setPosition(osg::Vec3(150.0,0.0,0.0)); camera->addChild(gnode); //添加纹理 osg::ref_ptr<osg::Geode> gnode2 = new osg::Geode; osg::ref_ptr<osg::Geometry> gm = new osg::Geometry(); gnode2->addDrawable(gm); //压入顶点 osg::ref_ptr<osg::Vec3Array> vertex = new osg::Vec3Array(); vertex->push_back(osg::Vec3(0.0, 0.0, 0.0)); vertex->push_back(osg::Vec3(100.0, 0.0, 0.0)); vertex->push_back(osg::Vec3(100.0, 100.0, 0.0)); vertex->push_back(osg::Vec3(0.0, 100.0, 0.0)); gm->setVertexArray(vertex); //法线 osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array(); normal->push_back(osg::Vec3(0.0, 0.0, 1.0)); gm->setNormalArray(normal); //设置绑定方式 gm->setNormalBinding(osg::Geometry::BIND_OVERALL); //设置纹理坐标 osg::ref_ptr<osg::Vec2Array> coord = new osg::Vec2Array(); coord->push_back(osg::Vec2(0.0, 0.0)); coord->push_back(osg::Vec2(1.0, 0.0)); coord->push_back(osg::Vec2(1.0, 1.0)); coord->push_back(osg::Vec2(0.0, 1.0)); gm->setTexCoordArray(0, coord); //设置关联 gm->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4)); //贴纹理 osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Images/blueFlowers.png"); osg::ref_ptr<osg::Texture2D> t2d = new osg::Texture2D(); t2d->setImage(0, image); gm->getOrCreateStateSet()->setTextureAttributeAndModes(0, t2d, osg::StateAttribute::ON); gm->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); camera->addChild(gnode2); return camera.release(); } int main() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); osg::ref_ptr<osg::Group> group = new osg::Group(); group->addChild(osgDB::readNodeFile("glider.osg")); group->addChild(CreateTextHUD()); viewer->setSceneData(group); viewer->run(); return 0; } 效果截图:
转载请注明原文地址: https://www.6miu.com/read-34140.html

最新回复(0)