查看: 1258|回复: 5

osg屏幕截图 与 HUD冲突问题

[复制链接]

该用户从未签到

发表于 2014-8-11 10:01:48 | 显示全部楼层 |阅读模式
各位大哥:

问题是这样,我想将osg场景图截图保存为jpg,bmp等通用图片格式。
代码贴在下面,然后
mViewer->getCamera()->setPostDrawCallback(new PostDrawCallback(this));
经验证确实可以了。

但是HUD文字信息没有保存在jpg,bmp图片格式中。
我仔细查看HUD代码:其中camera->setRenderOrder(osg::CameraNode:OST_RENDER);
是不是因为这个post_render原因。所以屏幕截图保存之后,hud才绘制?所以hud信息没有在截图中?

哪位大哥知道如何解决此问题,小弟拜谢!!


       




  1. //用于将当前的场景图保持为png,jpg,bmp,tiff。
  2. class PostDrawCallback:public osg::Camera::DrawCallback
  3. {
  4. public:
  5.         PostDrawCallback(cOSG* s){
  6.                 this->_cosg =s;
  7.         };
  8.         virtual void operator()(const osg::Camera &camera) const;
  9.         void setPath(std::string p){
  10.                 this->path =p;
  11.         }
  12. private:
  13.         cOSG* _cosg;
  14.         std::string path;
  15. };
复制代码

  1. void PostDrawCallback::operator() (const osg::Camera &camera) const
  2. {
  3.         if(this->_cosg->m_saveScreenshot){
  4.                 osg::ref_ptr<osg::Image>image = new osg::Image;


  5.                 int width = _cosg->viewClientRect.right-_cosg->viewClientRect.left;
  6.                 int height = _cosg->viewClientRect.bottom-_cosg->viewClientRect.top;

  7.        
  8.                 image->readPixels(_cosg->viewClientRect.left, _cosg->viewClientRect.top, width, height, GL_RGB, GL_UNSIGNED_BYTE);
  9.                 boolean suc = osgDB::writeImageFile( *(image.get()), path); //是否保存了。
  10.                 this->_cosg->m_saveScreenshot = false;

  11.         }
  12. }
复制代码


该用户从未签到

 楼主| 发表于 2014-8-12 08:38:03 | 显示全部楼层

难道大家做屏幕截图不是这样做的?
也没有要保存截图中有hud吗?

求给点提示信息,

该用户从未签到

发表于 2014-8-12 17:51:38 | 显示全部楼层
你可以考虑在frame函数之后截图

该用户从未签到

 楼主| 发表于 2014-8-13 11:33:06 | 显示全部楼层
本帖最后由 rubby 于 2014-8-13 11:37 编辑
fenma3422 发表于 2014-8-12 17:51
你可以考虑在frame函数之后截图


多谢,我按照您的提示:


  1.         while(!viewer->done())
  2.         {

  3.                 osg->PreFrameUpdate();
  4.                 viewer->frame();
  5.                 osg->PostFrameUpdate();
  6.                 Sleep(10);                 }
复制代码


在PostFrameUpdate() 中写入了将场景图截屏程序。但是一片黑。。。。
求高手再指点下。

  1.                
  2.                 if(this->m_saveScreenshot){
  3.                 osg::ref_ptr<osg::Image>image = new osg::Image;


  4.                 int width = this->viewClientRect.right - this->viewClientRect.left;
  5.                 int height = this->viewClientRect.bottom - this->viewClientRect.top;

  6.        
  7.                 image->readPixels(this->viewClientRect.left, this->viewClientRect.top, width, height, GL_RGB, GL_UNSIGNED_BYTE); //Rubby 保存场景图
  8.                 boolean suc = osgDB::writeImageFile( *(image.get()), this->osgSavePath);
  9.                 this->m_saveScreenshot = false;
  10. }
复制代码

该用户从未签到

 楼主| 发表于 2014-8-13 23:10:56 | 显示全部楼层
本帖最后由 rubby 于 2014-8-13 23:12 编辑

此外,我实验如下方法:仍然是截屏是一篇黑。。。。。哪位大侠 指点迷津。。。

  1.         while(!viewer->done())
  2.         {
  3.                
  4.                 osg->PreFrameUpdate();
  5.                
  6.                 if(osg->m_saveScreenshot){
  7.                         osg::ref_ptr<osg::Image> image = new osg::Image;
  8.                         int width = osg->viewClientRect.right - osg->viewClientRect.left;
  9.                         int height = osg->viewClientRect.bottom - osg->viewClientRect.top;
  10.                         image->allocateImage(width, height, 24,GL_RGB, GL_UNSIGNED_BYTE);

  11.                         osg::ref_ptr<osg::Camera> camera = viewer->getCamera();
  12.                         camera->attach(osg::Camera::COLOR_BUFFER, image.get());

  13.                         viewer->frame(); //绘制此帧
  14.                         osgDB::writeImageFile(*(image.get()), osg->osgSavePath );
  15.            // camera->attach(osg::Camera::COLOR_BUFFER, NULL,0U,0U);
  16.                         osg->m_saveScreenshot =false;
  17.                 }else{
  18.                         viewer->frame();//绘制此帧
  19.                 }
  20.                 osg->PostFrameUpdate();
  21.                 Sleep(10);      
  22.         }
  23. ;
复制代码

该用户从未签到

 楼主| 发表于 2014-8-14 10:13:12 | 显示全部楼层

解决方案:

mViewer->getCamera()->setPostDrawCallback(new PostDrawCallback(this));
改为  mViewer->getCamera()->setFinalDrawCallback(new PostDrawCallback(this));
解决此问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表