查看: 3355|回复: 6

attach 抓图的问题

[复制链接]

该用户从未签到

发表于 2009-3-24 17:12:54 | 显示全部楼层 |阅读模式
我的一段抓图的代码,在我自己的机子上运行没有出现问题,可把这段代码放到别人机子上运行时,只有第一次运行抓到了图,再抓就只抓到灰色的图片(我都怀疑我第一次是不是错觉)。在另一个机子上运行,结果直接出错,好像是提示跟Buffer有关。我想问一下高人,attach用的时候是不是跟硬件有关(上述三台机子配置都不一样),使用attach时应该注意哪些(我感觉抓图前是不是少写什么了)
  1. bool CVrEditorView::exportSnapshot(const std::string &filename)
  2. {
  3.        
  4.         osg::Viewport* vp=mOSG->getViewer()->getSlave(0)._camera->getViewport();
  5.         int width=vp->width();
  6.         int height=vp->height();
  7.        
  8.        
  9.         osg::ref_ptr<osg::GraphicsContext> gc = mOSG->getViewer()->getSlave(0)._camera->getGraphicsContext();
  10.         const osg::GraphicsContext::Traits* traits=gc->getTraits();

  11.         osg::ref_ptr<osg::Camera> camera = new osg::Camera();
  12.         camera->setGraphicsContext(gc.get());
  13.         camera->setViewport(new osg::Viewport(0,0,width,height));
  14.     GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
  15.     camera->setDrawBuffer(buffer);
  16.     camera->setReadBuffer(buffer);

  17.         double left,right,bottom,top,zNear,zFar;
  18.         mOSG->getViewer()->getCamera()->getProjectionMatrixAsFrustum(left,right,bottom,top,zNear,zFar);
  19.         double h=top-bottom;
  20.         double aspectRatio=(double)width/(double)height;//主辅相机aspectRatio不一样
  21.         double        wid=h*aspectRatio;
  22.         left=-wid*0.5;
  23.         right=wid*0.5;
  24.         top=h*0.5;
  25.         bottom=-h*0.5;
  26.     mOSG->getViewer()->addSlave(camera.get());//, osg::Matrixd(), osg::Matrixd::scale(aspectRatioScale,1.0,1.0));
  27.         osg::ref_ptr<osg::Image> img=new osg::Image();
  28.         img->allocateImage(width*viewportScale,height*viewportScale,1,GL_RGB,GL_UNSIGNED_BYTE);
  29.         camera->setRenderOrder(osg::Camera::PRE_RENDER);
  30.         camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
  31.         camera->attach(osg::Camera::COLOR_BUFFER,img.get());
  32.     camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  33.         camera->setProjectionMatrixAsFrustum(left,right,bottom,top,zNear,zFar);
  34.         mOSG->getViewer()->renderingTraversals();


  35.         osgDB::writeImageFile(*img.get(),filename);
  36.        
  37.        
  38.         //移除抓图用的相机
  39.         unsigned int slave_num=mOSG->getViewer()->getNumSlaves();
  40.         slave_num--;
  41.         mOSG->getViewer()->removeSlave(slave_num);
  42.         //for(int i=0;i<slave_num;i++)
  43.         //{
  44.         //        if(mOSG->getViewer()->getSlave(i)._camera==camera)
  45.         //        {
  46.         //                mOSG->getViewer()->removeSlave(i);
  47.         //                break;
  48.         //        }
  49.         //}
  50.         return true;
  51. }
复制代码

该用户从未签到

发表于 2009-3-24 19:19:14 | 显示全部楼层
和硬件有关!
setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT)设置使用FBO方式进行离屏渲染,并不是所有的硬件设备都支持FBO的,可以尝试换用PBuffer,如果还不行的话,建议更新显示卡驱动程序以及换一台新一点的机器~~

该用户从未签到

 楼主| 发表于 2009-3-25 09:03:11 | 显示全部楼层
我的机器显卡NVIDIA GeForce 6600,可以正常运行并抓到图; 另一个是笔记本,显卡ATI Mobility Radeon X1600,可以运行,但抓不到图,并且这台机器上运行osgprerender正常; 最后一个NVIDIA GeForce 7900GS ,运行出错。
麻烦array看看,我的代码是不是有问题啊。

[ 本帖最后由 sky206 于 2009-3-25 09:20 编辑 ]

该用户从未签到

 楼主| 发表于 2009-3-25 09:26:38 | 显示全部楼层
刚才我又在一台古董机器上试了一下,竟然能抓到图,那台机器连显卡驱动都没有装。
弄的我好迷茫啊

该用户从未签到

发表于 2009-3-25 10:49:48 | 显示全部楼层
attach没有太多要注意的,摄像机的视口和纹理的大小相符就可以

该用户从未签到

发表于 2012-3-1 00:08:32 | 显示全部楼层
array 发表于 2009-3-25 10:49
attach没有太多要注意的,摄像机的视口和纹理的大小相符就可以

请教array:
           对于新建的相机osg::Camera,在attach到某个图片时,是否必须指定osg::Camera的设备图形即osg::GraphicsContext,否则生成的图片为灰色?
           另外此时的相机节点与osg原始场景的节点树关系如何,需要使用viewer->getSceneData()->addChild(),将相机节点追加到场景根节点中吗?同时该相机节点的子节点应该为场景中的哪些节点呢?
    还望array多多指教,osgposter看起来不太理解。

该用户从未签到

发表于 2012-3-5 09:29:29 | 显示全部楼层
对于新建的相机osg::Camera,在attach到某个图片时,是否必须指定osg::Camera的设备图形即osg::GraphicsContext,否则生成的图片为灰色
完全不用
另外此时的相机节点与osg原始场景的节点树关系如何,需要使用viewer->getSceneData()->addChild(),将相机节点追加到场景根节点中吗?同时该相机节点的子节点应该为场景中的哪些节点呢?
肯定要加入到节点树中,位置无所谓;该相机的子节点显而易见应该是您准备RTT的场景数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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