查看: 2129|回复: 8

纹理烘焙的问题.

[复制链接]

该用户从未签到

发表于 2009-9-4 01:12:08 | 显示全部楼层 |阅读模式
本帖最后由 zhuliangxiong 于 2009-9-4 01:20 编辑

写了一小段代码 将GIS数据作为纹理贴到地形上.下面是主要的代码.目前出来的效果是这样的.纹理没贴上去,而且显示效果也非常卡.
不使用纹理烘焙的时候,不管是二维矢量数据还是三维的地形数据本身都可以贴上纹理 而且显示效果很流畅.
请帮忙分析一下代码,我现在感觉 纹理没贴上是因为内部的camera的观察矩阵没有设置好.但是为什么系统这么慢呢?
  1. void applyTextureToGis(){
  2.     Group* root=new Group();
  3.     Node* terrain=osgDB::readNodeFile ("1000/county10.ive");
  4.     Group* gp=OsgHelper::readShapefile ("hh/county10.shp")->asGroup();
  5.     string images[]={"images/skymap.jpg","images/land01.jpg"};
  6.     //首先把原始的纹理贴在二维的GIS节点上
  7.     for(unsigned int i=0;i<gp->getNumChildren ();i++){
  8.         Geode* node=gp->getChild (i)->asGeode ();
  9.         Image* img=osgDB::readImageFile (images[i%2]);
  10.         applyGeode(node,img,2,2);
  11.     }
  12.     //构造一个Camera,将二维GIS节点添加到Camera.
  13.     BoundingBox box=OsgHelper::computeBoundingBox (terrain);
  14.     int w=(box.xMax ()-box.xMin());
  15.     int h=(box.yMax ()-box.yMin());
  16.     int txt_width=800,txt_height=450;
  17.     Camera *camera=new Camera;
  18.     camera->setClearColor(osg::Vec4(1.f,1.f,1.f,1.0f));
  19.     camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  20.     camera->setProjectionMatrix(osg::Matrix::ortho2D(-w/2,w/2,-h/2,h/2));
  21.     camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  22.    
  23.     camera->setViewport(0,0,txt_width,txt_height);
  24.     camera->setRenderOrder(osg::Camera::POST_RENDER);
  25.     camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
  26.     //构造一个Image,让Camera的COLOR_BUFFER连接到这个Image.
  27.     Image* txtImg=new Image();
  28.     txtImg->allocateImage(txt_width, txt_height, 1, GL_RGBA, GL_UNSIGNED_BYTE);
  29.     camera->attach(osg::Camera::COLOR_BUFFER,txtImg,0,0);
  30.     camera->addChild (gp);
  31.     //把这个Image做为纹理贴到地形上去.
  32.     applyTexture(terrain,txtImg,1.0,1.0);
  33.     root->addChild (camera);
  34.     root->addChild(terrain);
  35.     Viewer view;
  36.     view.setSceneData (root);
  37.     view.run();      
  38. }
复制代码

该用户从未签到

 楼主| 发表于 2009-9-4 01:20:49 | 显示全部楼层
在设置了camera的观察矩阵后 纹理出来了.但是速度巨慢的说

该用户从未签到

发表于 2009-9-4 21:30:13 | 显示全部楼层
我这里也是用纹理的方式显示矢量,各个地块轮流用一组RTT相机的队列,显示整个地球都没有什么问题。我想是您别的地方代码编写有误

该用户从未签到

 楼主| 发表于 2009-9-4 21:56:47 | 显示全部楼层
在上面的代码中 如果我直接把地形或者矢量数据加入到Viewer中 而不是用RTT的话.速度是非常快的.用上了RTT后就特别慢. 这是我写的一个用RTT的例子,系统中除了读文件 然后用RTT方式贴纹理 就没有别的操作了.

RTT中有什么和性能有关的内容 ? 对这一块不太清楚 能否告知 我再仔细检查一下代码.

该用户从未签到

发表于 2009-9-4 22:11:08 | 显示全部楼层
建议您直接用attach(COLOR_BUFFER, texture),而不是关联到Image对象后再赋给Texture。除此之外没有太多要注意的

该用户从未签到

 楼主| 发表于 2009-9-5 17:30:37 | 显示全部楼层
对RTT相机 有这么一个设置上面代码的第23行)
camera->setViewport(0,0,txt_width,txt_height);

这个Viewport的width/height 是不是应该等于地形的BoundingBox的width/height.
我个人是这么理解的.
camera的viewport的width/height比例实际上就是输出的纹理的有效内容的比例.如果和地形的width/height不匹配,那么在将地形上的节点的坐标换算成纹理坐标后. 纹理就会发生变形.

该用户从未签到

发表于 2009-9-5 19:58:20 | 显示全部楼层
setViewport和纹理的尺寸要一致,和地形的大小没有什么关系。它只影响窗口矩阵变换的结果,而不影响观察和投影矩阵

该用户从未签到

 楼主| 发表于 2009-9-6 10:27:01 | 显示全部楼层
我把地形分割为很多小块后.每一小块有一个Camera对应. 能否做到这一个小块的节点需要显示的时候 打开对应的Camera 不需要显示的时候关闭这个Camera。

我想在Camera上面加一个Switch来做这个效果 但是不知道在什么时机插入我的控制代码?

该用户从未签到

发表于 2009-9-6 10:35:45 | 显示全部楼层
可以,派生一个新的RttCamera类,然后编写自定义的traverse()函数吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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