查看: 705|回复: 2

osg抓屏

[复制链接]

该用户从未签到

发表于 2015-12-23 11:29:27 | 显示全部楼层 |阅读模式
本帖最后由 TwinkleStarlet 于 2015-12-23 11:43 编辑

#include <osg/Camera>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgGA/TrackballManipulator>
#include <osg/Image>
bool  snap(osg::ref_ptr<osgViewer::Viewer> v)
{
        int width = v->getCamera()->getViewport()->width();
        int height=v->getCamera()->getViewport()->height();

        double left,right,bottom,top,zNear,zFar;

        v->getCamera()->getProjectionMatrixAsFrustum(left,right,bottom,top,zNear,zFar);

        printf("left=%.2f\tright=%.2f\nbottom=%.2f\ttop=%.2f",left,right,bottom,top);

        v->getCamera()->setProjectionMatrixAsFrustum(left,right,bottom,top,zNear,zFar);
        v->renderingTraversals();

        osg::ref_ptr<osg::Image> image=new osg::Image;                       
        image->readPixels(0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE);
               
        osgDB::writeImageFile(*image,"d:\\pic.bmp");
        return true;
}
int main()
{
        osg::ref_ptr<osgViewer::Viewer>v=new osgViewer::Viewer;
        v->setSceneData(osgDB::readNodeFile("cow.osg"));
        v->setCameraManipulator(new osgGA::TrackballManipulator());
        v->frame();
        snap(v);
        return 1;
}

渲染效果没错,但是抓图 的效果如下,是白屏,有大侠知道吗?
pic.bmp

该用户从未签到

 楼主| 发表于 2015-12-23 11:31:59 | 显示全部楼层
本帖最后由 TwinkleStarlet 于 2015-12-23 11:51 编辑

但是用了回调模式后,下面这段代码就可以抓,在回调中会连续的抓图
难道必须这样做吗?
#include <osgViewer/Viewer>
#include <osgViewer/GraphicsWindow>
#include <osg/Node>
#include <osg/Camera>
#include <osg/Image>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>

//定义一个全局变量
osg::ref_ptr<osg::Image> image_c= new osg::Image() ;

//得到抓图
struct CaptureDrawCallback : public osg::Camera:rawCallback
{
        CaptureDrawCallback(osg::ref_ptr<osg::Image> image)
        {
                _image = image ;
        }

        ~CaptureDrawCallback(){}

        virtual void operator () (const osg::Camera& camera) const
        {
                //得到窗口系统接口
                osg::ref_ptr<osg::GraphicsContext::WindowingSystemInterface> wsi =
                                           osg::GraphicsContext::getWindowingSystemInterface();
                unsigned int width ,height ;
                //得到分辨率
                wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),width,height) ;
                //分配一个image
                _image->allocateImage(width,height,1,GL_RGB,GL_UNSIGNED_BYTE);
                //读取像素信息抓图
                _image->readPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE);

                osgDB::writeImageFile(*(image_c.get()),"test.bmp");
        }
        osg::ref_ptr<osg::Image> _image;
};

int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
        osg::ref_ptr<osg::Group> root = new osg::Group();
        //读取模型
        osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
        root->addChild(node.get());
        //优化场景数据
        osgUtil::Optimizer optimizer ;
        optimizer.optimize(root.get());       
        //设置绘制回调
        viewer->getCamera()->setPostDrawCallback(new CaptureDrawCallback(image_c.get())) ;
        viewer->setSceneData(root.get()) ;
        viewer->realize();
        viewer->run();
        return 0;
}

该用户从未签到

发表于 2016-1-5 17:34:46 | 显示全部楼层
这个看过一些资料, 好像是因为osg资源管理。 显示完之后可能会将已经显示的内存清理掉。 用来节省资源开销。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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