实例5:osgautocapture例子实现屏幕截图(OSG程序开发实例)

来源:互联网 发布:centos 关闭selinux 编辑:程序博客网 时间:2024/05/16 12:55


例子代码比较复杂,考虑了大场景节点调入时的情形,我们对示例进行简化,目的是体会OSGOpenGL的关系.

#include <osg\libs.h>

class finalDraw : public osg::Camera::DrawCallback//相机更新回调类
{
public:   
 finalDraw() {  _image = new osg::Image; }//构造函数,分配私有图片类变量内存
 virtual void operator () (osg::RenderInfo& renderInfo) const//虚函数,实现目的操作
 { static bool first;//控制文件只写入一次
  glReadBuffer(GL_BACK);//直接调用OpenGL函数,实现对后缓冲区的读取
  OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);//开启线程保护
  osg::GraphicsContext* gc = renderInfo.getState()->getGraphicsContext();//获取当前图形上下文
  int width = gc->getTraits()->width; int height = gc->getTraits()->height;//获取窗口的长宽
  if(!first)//首次可以执行下面语句
  { _image->readPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE);//数据填充到图片
   osgDB::writeImageFile(*_image, "autocapture.jpg");//图片写入到当前程序目录下
   first = true;//首次已经执行
  }
 }
protected:   
 osg::ref_ptr<osg::Image>     _image;//图片变量
 mutable OpenThreads::Mutex  _mutex;//线程保护对象变量
};
void main()
{ osgViewer::Viewer viewer;//创建视图类,实现建立窗口等操作
 osg::Node *loadedModel = osgDB::readNodeFile("glider.osgt");//应用osgDB文件读写类读入glider模型节点
 viewer.setSceneData(loadedModel);//为视图类设置场景,即观察glider模型
 viewer.setCameraManipulator( new osgGA::TrackballManipulator() ); //设置视点的操作类,类似Vega Prime的MotionDrive
 viewer.realize();//初始化
 while(!viewer.done())//程序没有终止,如按下Esc键,程序会终止
 { static bool once;//控制相机更新回调只加入一次
  viewer.frame();//更新一帧
  if(!once && (viewer.elapsedTime()>5) )//没有执行且时间大于5秒,执行下现语句
  { once = true;//相机更新回调已经执行
   viewer.getCamera()->setFinalDrawCallback(new finalDraw());//加入更新回调,输出图像
  }
 }
}

0 0