查看: 1606|回复: 3

RTT输出的Image存在白边是什么问题导致的呢?

[复制链接]

该用户从未签到

发表于 2009-9-14 10:38:26 | 显示全部楼层 |阅读模式
我首先把一个GIS图层切分为了四格.这四格的大小是一样大的.GIS图形本身肯定是不规则的.但是我在图层里面填充上了很多多边形(用一个大矩形减去当前所有的实际数据,就得到填充的多边形了).这样整个图形就是一个非常规则的矩形了.

我首先用RTT的方式 把整个矩形输出到一个Image,这个Image没有任何问题.

然后我把这个矩形切割为同样大小的四块,然后分别输出,结果这四块中的右边两块依然是没有问题的,胆识左边的两块就不对了,其中左上的那块下面有白边,左下的那块上面有白边.

然后我再把这个四块分别切成四块,出来的结果就更乱了.大部分的图片都有白边.

如果把这些白边都裁掉后,这些图形是能够拼接在一起的.

做过Rtt的人有出现过类似的情况吗?
下面是代码:
  1. void RttCameraHandler::applyCamera( Camera* camera,const string& name,Image* img){
  2.    //找到二维的GIS节点,这些节点将会被渲染到纹理然后输出
  3.     Group* txtNode=findTxtNode(name);
  4.     if(!txtNode) return;
  5.     //计算这些节点的外接面
  6.     ComputeBoundsVisitor v;
  7.     txtNode->accept (v);
  8.     BoundingBox box=v.getBoundingBox ();
  9.    
  10.     int w=(box.xMax ()-box.xMin());
  11.     int h=(box.yMax ()-box.yMin());
  12.     //固定图片的宽度为1024,根据二维节点的宽高比来计算出图片的高度
  13.     int txt_width=1024,txt_height=0;
  14.     txt_height=(int)(txt_width*1.0*h/w);
  15.     //设置Camera
  16.     camera->setClearColor(osg::Vec4(1.f,1.f,1.f,1.0f));
  17.     camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  18.     camera->setProjectionMatrix(osg::Matrix::ortho2D(-w/2,w/2,-h/2,h/2));
  19.    
  20.     camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

  21.     camera->setViewport(0,0,txt_width,txt_height);
  22.     camera->setRenderOrder(osg::Camera::POST_RENDER);
  23.     camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);

  24.     //控制Camera的姿态.此段代码将Camera的姿态控制为从Z正方向 垂直向下看
  25.     HowtoManipulator mani(NULL);
  26.     mani.setNode(txtNode);
  27.     mani.home(0);
  28.     camera->setViewMatrix(mani.getInverseMatrix());

  29.     img->allocateImage(txt_width, txt_height, 1, GL_RGBA, GL_UNSIGNED_BYTE);
  30.     camera->attach(osg::Camera::COLOR_BUFFER,img);
  31.     camera->removeChildren (0,camera->getNumChildren ());
  32.     camera->addChild(txtNode);
  33. }
复制代码
在这个代码前
是new Camera并加入到场景根节点的代码,
然后传递不同的名字(每一个网格都有一个编号)来调用这个代码.
然后输出到本地的文件里面去.文件名对应网格编号.

不知道是不是Camera的参数设置的有问题.

该用户从未签到

发表于 2009-9-14 11:29:17 | 显示全部楼层
设置纹理的边界截取方式看一看,例如setWrap(CLAMP_TO_EDGE)

该用户从未签到

 楼主| 发表于 2009-9-14 13:33:24 | 显示全部楼层

  1. txt->setWrap (Texture2D::WRAP_S ,Texture2D::REPEAT );
  2. txt->setWrap (Texture2D::WRAP_T ,Texture2D::REPEAT );
复制代码
替换为

  1. txt->setWrap (Texture2D::WRAP_S ,Texture2D::CLAMP_TO_EDGE );
  2. txt->setWrap (Texture2D::WRAP_T ,Texture2D::CLAMP_TO_EDGE );
复制代码
输出的图片上什么都没有了.
是不是因为没有在屏幕上显示的缘故?我现在是批量输出的 .在applyCamera后就是frame()的调用.虽然Camera被加入到根节点,但是这些Camera的结果并没有真的出现在屏幕上.

该用户从未签到

发表于 2009-9-14 16:10:09 | 显示全部楼层
输出的图片上什么都没有了,那很可能是您的纹理坐标设置错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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