查看: 2152|回复: 7

关于osg自定义分辨率截图的问题

[复制链接]

该用户从未签到

发表于 2012-12-31 11:11:54 | 显示全部楼层 |阅读模式
我在一个eventhandler的handle函数中,实现场景自定义分辨率抓图,想请教下为什么抓出来的图看起来只有背景色呢?
osgViewer::View * viewer = dynamic_cast<osgViewer::View*>(&aa);
                                osg::Camera * mCamera = viewer->getCamera();
                                osg::ref_ptr<osg::Camera> camera = new osg::Camera();//新添加的相机实现离屏抓图
                                m_pFrameImage = new osg::Image;
                                m_pFrameImage->allocateImage(1000,800,1, GL_RGBA, GL_UNSIGNED_BYTE);
                                for (int col=0;col<2;col++)
                                {
                                        for (int row=0;row<2;row++)
                                        {
                                                osg::Matrix m_mtxCurView;
                                                osg::Matrix        m_mtxCurProj;
                                                m_mtxCurView = mCamera->getViewMatrix();
                                                m_mtxCurProj = mCamera->getProjectionMatrix();
                                               
                                               
                                                camera->setViewport(0,0,mCamera->getGraphicsContext()->getTraits()->width,mCamera->getGraphicsContext()->getTraits()->height);
                                        /*        osg::Matrix offsetMatrix =
                                                        osg::Matrix::scale(2, 2, 1.0) *
                                                        osg::Matrix::translate(2-1-2*col, 2-1-2*row, 0.0);*/
                                                camera->setViewMatrix(m_mtxCurView);
                                                camera->setProjectionMatrix( m_mtxCurProj);// * offsetMatrix
                        camera->setGraphicsContext(mCamera->getGraphicsContext());
                                                camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
                                                camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                                                camera->setAllowEventFocus(false);
                                                camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
                                               
                                                camera->addChild(m_pEnviro->GetVtScene()->GetRootNode()->GetOsgGroup());
                                               
                                                viewer->addSlave(camera);
                                               
                                               
                                                osg::ref_ptr<osg::Image> image = new osg::Image;
                                                image->allocateImage(1000/2,800/2, 1, GL_RGBA, GL_UNSIGNED_BYTE );
                                                camera->setRenderOrder(osg::Camera:RE_RENDER);
                                                camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
                                                //camera->detach( osg::Camera::COLOR_BUFFER );
                                                camera->attach( osg::Camera::COLOR_BUFFER, image.get(), 0, 0 );
                                                viewer->removeSlave(0);
                                                for (int t = 0; t < image->t(); ++t)
                                                {
                                                        unsigned char * source = image->data(0, t);
                                                        unsigned char * target = m_pFrameImage->data( col * 500, t + row * 400 );
                                                        memcpy(target, source, image->s() * 4 * sizeof(unsigned char));
                                                }
                                       
    //                  
                                        }
                                }

该用户从未签到

 楼主| 发表于 2012-12-31 11:13:34 | 显示全部楼层
这是抓图的代码,在程序中设置了两帧以后再保存,发现保存出来的只有背景色,想请教下高人这是为什么呢

该用户从未签到

 楼主| 发表于 2012-12-31 11:43:34 | 显示全部楼层
后来改为将相机以结点的形式加入主场景树,
osg::ref_ptr<osg::Group> m_pTop;
                                                m_pTop = dynamic_cast<osg::Group*>(viewer->getSceneData());
                                                camera->setName("rrtcamera");
                                                if (m_pTop)
                                                {
                                                        m_pTop->addChild(camera);
                                                }
发现依然只有背景色,求各位指教

该用户从未签到

发表于 2012-12-31 12:22:36 | 显示全部楼层
呵呵,程序真乱~
你把全部代码上传上来吧。
不仅仅是抓图问题
先viewer->addSlave(camera);再  viewer->removeSlave(0);不明白你在做什么~
还有你应该好好看一下viewer->addSlave(camera);的源码及updataslave这个函数~

该用户从未签到

 楼主| 发表于 2012-12-31 13:40:08 | 显示全部楼层
buaahc 发表于 2012-12-31 12:22
呵呵,程序真乱~
你把全部代码上传上来吧。
不仅仅是抓图问题

这是一个大工程里面的一个功能,全部代码很庞大,希望能把每一帧的场景作为截图保存下来,但是不受场景分辨率的限制。

该用户从未签到

 楼主| 发表于 2012-12-31 13:47:38 | 显示全部楼层
buaahc 发表于 2012-12-31 12:22
呵呵,程序真乱~
你把全部代码上传上来吧。
不仅仅是抓图问题

http://bbs.osgchina.org/forum.php?mod=viewthread&tid=9129,我想的具体原理跟这个帖子说的差不多,还希望多指教,谢谢

该用户从未签到

发表于 2012-12-31 16:56:48 | 显示全部楼层
恩 当你需要一个功能时肯定有人早就做过了。。。并且做得很好,,,你把帖子中的代码站过去不就行了。。。
我只能说你自己本身的抓图源代码非常混乱。。。。

该用户从未签到

 楼主| 发表于 2012-12-31 17:05:27 | 显示全部楼层
buaahc 发表于 2012-12-31 16:56
恩 当你需要一个功能时肯定有人早就做过了。。。并且做得很好,,,你把帖子中的代码站过去不就行了。。。
...

问题解决了,不是你说的问题,也不是抓图代码的问题,不过还是3Q~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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