查看: 5168|回复: 13

求教FBO attach后截图为灰色。

[复制链接]

该用户从未签到

发表于 2012-2-25 23:20:14 | 显示全部楼层 |阅读模式
本帖最后由 wanghuisoftware 于 2012-2-25 23:22 编辑

请问,我将路径漫游过程的视图保存为图片序列,通过一个新建的相机实现。具体思路可参考下述代码:

                                  //建立动画路径
                osg::ref_ptr<osg::AnimationPath> _animationPath = new osg::AnimationPath(*(picker->_animPath));
                _animationPath->setLoopMode(osg::AnimationPath::NO_LOOPING);

                double periodsecond = 1/fps;//!<每一帧的间隔时间,为了保存avi视频是自定义帧数,此不可忽略。

                ///对新建相机的一些属性进行设置。
                osg::ref_ptr<osg::Camera> slaveCamera = new osg::Camera;
                //mViewer->addSlave(slaveCamera);
                slaveCamera->addChild(mModel);
                mRoot->addChild(slaveCamera);
                slaveCamera->setProjectionMatrix(mViewer->getCamera()->getProjectionMatrix());
                slaveCamera->setClearColor(osg::Vec4(0.2f, 0.2f, 0.6f, 1.0f));
                slaveCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                slaveCamera->setAllowEventFocus(false);
                slaveCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
                slaveCamera->setViewport(0,0,width,height);
                slaveCamera->setRenderOrder(osg::Camera:RE_RENDER);
                slaveCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
                osg::ref_ptr<osg::Image> posterImage = 0;

                osg::AnimationPath::ControlPoint cp;

                //设置路径的时间
                double animTime = 0;
                //double _timeOffset = _animationPath->getFirstTime()-time;//时间差
                osg::Matrixd _matrix;//观察矩阵
                osg::ref_ptr<osg::ImageSequence> imageSequence = new osg::ImageSequence;


                                  //判断路径漫游是否播放完毕
                while (animTime <= _animationPath->getLastTime())
                {
                        _animationPath->getInterpolatedControlPoint( animTime, cp );
                        cp.getInverse(_matrix);
                        posterImage = new osg::Image;
                        posterImage->allocateImage( width, height, 1, GL_RGB, GL_UNSIGNED_BYTE );
                        slaveCamera->setViewMatrix(_matrix);//每一次重新设置相机的视点矩阵
                       
                        slaveCamera->detach( osg::Camera::COLOR_BUFFER );
                        slaveCamera->attach( osg::Camera::COLOR_BUFFER, posterImage.get(), 0, 0 );
                        //osgDB::writeImageFile( *image, image->getName()+"."+_outputTileExt );
                        imageSequence->addImage(posterImage);
                        osgDB::writeImageFile( *posterImage, "F:\\test.jpg" );
                        animTime += periodsecond;
                }

还望大侠指教!

该用户从未签到

 楼主| 发表于 2012-3-1 00:11:45 | 显示全部楼层
本帖最后由 wanghuisoftware 于 2012-3-1 00:12 编辑

没有人帮忙解答下呀,是没看懂意思吗?我是新建一个osg::Camera,将其attach到一副图片上,但最终渲染的图片为灰色,请问是什么原因?还望大家指点一下。

该用户从未签到

发表于 2012-3-1 11:25:38 | 显示全部楼层
要显卡支持FBO的扩展才行,另外好像多线程的话第一帧就writeImageFile是有问题的,要等2-3帧之后。

该用户从未签到

发表于 2012-3-5 09:30:22 | 显示全部楼层
为什么要用slave camera?为什么不直接用一个新的rtt camera来实现

该用户从未签到

 楼主| 发表于 2012-3-6 16:19:13 | 显示全部楼层
array 发表于 2012-3-5 09:30
为什么要用slave camera?为什么不直接用一个新的rtt camera来实现

array你好,我用的不是从相机,变量名叫法有些突然,叫slaveCamera,实际上实现的是rtt的camera,我想问的是不是要等2-3帧之后,才能写到图片文件里,不知道为什么会出现灰色图片,还请array老大多多指教。

该用户从未签到

发表于 2012-3-12 09:48:22 | 显示全部楼层
初始化的时候,如果用了FBO或者PixelBuffer,那么1-2帧之后才出现图像是正常的

该用户从未签到

发表于 2012-3-19 10:03:30 | 显示全部楼层
wanghuisoftware 发表于 2012-3-6 16:19
array你好,我用的不是从相机,变量名叫法有些突然,叫slaveCamera,实际上实现的是rtt的camera,我想问的 ...

我这两天也在做这个东西,出来的图片是空的,不知道你解决没有啊,是什么问题找到了吗? 请多指教!

该用户从未签到

 楼主| 发表于 2012-3-20 14:14:46 | 显示全部楼层
本帖最后由 wanghuisoftware 于 2012-3-20 14:16 编辑

这个主要原因是 attach()操作,与保存图片的操作不能放在同一帧中,设置完attach后,至少要等1、2帧才能保存图片。你可以试试,祝好运!

该用户从未签到

 楼主| 发表于 2012-3-20 14:19:46 | 显示全部楼层
zxinxin0606 发表于 2012-3-19 10:03
我这两天也在做这个东西,出来的图片是空的,不知道你解决没有啊,是什么问题找到了吗? 请多指教!

这个主要原因是 attach()操作,与保存图片的操作不能放在同一帧中,设置完attach后,至少要等1、2帧才能保存图片。你可以试试,祝好运!

该用户从未签到

发表于 2012-3-20 15:45:33 | 显示全部楼层
wanghuisoftware 发表于 2012-3-20 14:19
这个主要原因是 attach()操作,与保存图片的操作不能放在同一帧中,设置完attach后,至少要等1、2帧才能 ...

恩 解决了~~ 非常感谢!

该用户从未签到

 楼主| 发表于 2012-3-20 20:01:53 | 显示全部楼层
zxinxin0606 发表于 2012-3-20 15:45
恩 解决了~~ 非常感谢!

你是要保存视频还是照片。里面的阴影多吗?就是能够明显看到光照的效果。

该用户从未签到

发表于 2012-12-29 22:06:13 | 显示全部楼层
我想问下,为什吗我抓到的只有背景色呢

该用户从未签到

 楼主| 发表于 2012-12-31 23:05:10 | 显示全部楼层
dearpa 发表于 2012-12-29 22:06
我想问下,为什吗我抓到的只有背景色呢

没有遍历到节点。

该用户从未签到

发表于 2013-1-4 16:37:01 | 显示全部楼层
wanghuisoftware 发表于 2012-12-31 23:05
没有遍历到节点。

就是说需要保存下来的场景必须以子节点的形式加入新创建的相机里,才能正确保存图像,对吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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