查看: 1431|回复: 1

OSG为何截屏结果不对?

[复制链接]

该用户从未签到

发表于 2014-1-5 10:50:21 | 显示全部楼层 |阅读模式
请教一下,我之前定义了一个DrawCallBack类,用来截屏每一帧,并保存为图片。
在main函数里setPostDrawcallBack,当使用viewer.run时,可以成功截屏每一帧。但是当使用
while(!viewer.done())
{
viewer.frame():
}
时,截图结果不对,请问是什么情况?

  1. static long ii=1;
  2. class WindowCaptureCallback : public osg::Camera::DrawCallback
  3. //
  4. {
  5. public:   
  6.         WindowCaptureCallback(GLenum readBuffer, const std::string& name):
  7.                 _readBuffer(readBuffer),
  8.                 _fileName(name)
  9.         {
  10.                 _image = new osg::Image;
  11.         }

  12.         virtual void operator () (osg::RenderInfo& renderInfo) const
  13.         {
  14. #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE)
  15.                 glReadBuffer(_readBuffer);
  16. #else
  17.                 osg::notify(osg::NOTICE)<<"Error: GLES unable to do glReadBuffer"<<std::endl;
  18. #endif

  19.                 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
  20.                 osg::GraphicsContext* gc = renderInfo.getState()->getGraphicsContext();
  21.                 if (gc->getTraits())
  22.                 {
  23.                         GLenum pixelFormat;

  24.                         if (gc->getTraits()->alpha)
  25.                                 pixelFormat = GL_RGBA;
  26.                         else
  27.                                 pixelFormat = GL_RGB;

  28. #if defined(OSG_GLES1_AVAILABLE) || defined(OSG_GLES2_AVAILABLE)
  29.                         if (pixelFormat == GL_RGB)
  30.                         {
  31.                                 GLint value = 0;
  32. #ifndef GL_IMPLEMENTATION_COLOR_READ_FORMAT
  33. #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
  34. #endif
  35.                                 glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &value);
  36.                                 if ( value != GL_RGB ||
  37.                                         value != GL_UNSIGNED_BYTE )
  38.                                 {
  39.                                         pixelFormat = GL_RGBA;//always supported
  40.                                 }
  41.                         }
  42. #endif
  43.                         int width = gc->getTraits()->width;
  44.                         int height = gc->getTraits()->height;

  45.                         std::cout<<"Capture: size="<<width<<"x"<<height<<", format="<<(pixelFormat == GL_RGBA ? "GL_RGBA":"GL_RGB")<<std::endl;
  46.                         _image->readPixels(0, 0, width, height, pixelFormat, GL_UNSIGNED_BYTE);
  47.                 }

  48.                 if (!_fileName.empty())
  49.                 {
  50.                         char filename[20]={0};
  51.                         sprintf(filename,"OUTPUT_%05d.bmp",ii++);
  52.                         std::cout << "Writing to: " << filename << std::endl;
  53.                         osgDB::writeImageFile(*_image, filename);
  54.                 }
  55.         }

  56. protected:   
  57.         GLenum                      _readBuffer;
  58.         std::string                 _fileName;
  59.         osg::ref_ptr<osg::Image>    _image;
  60.         mutable OpenThreads::Mutex  _mutex;
  61. };



  62. int main( int argc, char** argv )
  63. {
  64.         osgViewer::Viewer viewer;
  65.         osg::ref_ptr<osg::Node> model = osgDB::readNodeFile( "cessna.osg" );
  66.        
  67.         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
  68.         traits->x = 40;
  69.         traits->y = 40;
  70.         traits->width = 600;
  71.         traits->height = 480;
  72.         traits->windowDecoration = true;
  73.         traits->doubleBuffer = true;
  74.         traits->sharedContext = 0;
  75.         traits->pbuffer=true;

  76.         osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  77.         viewer.getCamera()->setGraphicsContext(gc.get());
  78.         viewer.getCamera()->setViewport(0,0,600,480);
  79.         viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
  80.         viewer.setSceneData( model.get() );
  81.         viewer.realize();
  82.        

  83.         GLenum buffer = viewer.getCamera()->getGraphicsContext()->getTraits()->doubleBuffer ? GL_BACK : GL_FRONT;
  84.         viewer.getCamera()->setPostDrawCallback(new WindowCaptureCallback(buffer,"capture"));       
  85.         viewer.realize();

  86.         //将下面的语句改为viewer.run()就可以正常运行,请问是什么情况?
  87.         while(!viewer.done())
  88.         {

  89.                 viewer.frame();
  90.         }
  91.         return 0;


  92. }
复制代码

该用户从未签到

发表于 2014-1-18 20:38:23 | 显示全部楼层
我无法猜测什么,是否您的观察矩阵和漫游器都没有设置,所以模型不会一开始就出现在屏幕中央
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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