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;
}
效果截图: