项目场景
osg显示模型 需要输出模型的高清正射图。
过程实现细节点
可以参考osg源码中rtt相机的创建以及使用 在源码中全局搜索FRAME_BUFFER_OBJECT必能找到。@Override
osg::ref_ptr<osg::camera> pCamera = new osg::camera;
pCamera->setClearColor(osg::vec4(0.0f, 0.f, 0.f, 0.f));
pCamera->setClearMask( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
pCamera->setRenderOrder( osg::Camera::PRE_RENDER ); //指定渲染顺序 PRE_RENDER
pCamera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT ); //指定实现方式 FBO
//设置投影矩阵 (平行投影 或 透视投影)
pCamera->setProjectionMatrixAsOrtho(xxx);
//设置相机姿态
pCamera->setViewMatrixAslookAt(xxx);
//设置相机视口大小
pCamera->setViewport(xxx);
//若一个相机连续输出多个模型正射图 改变相机位置后 需更新相机绑定纹理(卡点)
pCamera->dirtyAttachmentMap();
//图片的大小和相机宽高保持一致
osg::ref_ptr<osg::image> pImage = new osg::image;
pImage->allocateImage(nW, nH, GL_RGBA, GL_UNSIGNED_BYTE);
pCamer->attach(osg::camera::color_buffer, pImage, 0, 0);
//把模型添加相机中 否则输出图片黑色
pCamera->addChild(model);
osg::ref_ptr<osg::Group> pGroup = new osg::Group;
pGroup->addChild(pCamera);
细节点:
1.指定渲染顺序:PRE_RENDER
2.指定实现方式:FRAME_BUFFER_OBJECT (若使用FB, 超过显示视口宽高渲染部分的纹理会被裁切)
3.若使用一个相机 输出多个模型正射图像,需要在相机位置改变后,更新绑定纹理pCamera->dirtyAttachmentMap();
4.注意保持相机投影矩阵宽高比和相机视口宽高比保持一致(否则输出图片的纹理会扭曲拉花)