查看: 1553|回复: 5

帮忙分析一段贴纹理的代码

[复制链接]

该用户从未签到

发表于 2009-9-3 00:39:48 | 显示全部楼层 |阅读模式
说明:
1.在一个系统里面 用这段代码贴纹理 可以成功.
2.在另一个系统里面复制了这段代码过去,结果贴纹理只出来纹理图片的一个基本色,比如一片蓝或一片绿.
某些情况下 还只给节点贴了一半的纹理.
感觉很费解,请大家给分析一下代码有什么问题.

  1. //root 为需要普纹理的节点
  2. //img 是纹理图片
  3. //width  是纹理在x轴方向上重复的次数
  4. //height 是纹理在y轴方向上重复的次数
  5. void applyGeode(Geode* root,Image* img,float width,float height)
  6. {
  7.     if(root==NULL||img==NULL) return;
  8.     //获取x,y范围 把这个范围映射到width,height范围上.
  9.    BoundingBox box=root->getBoundingBox ();
  10.    float dx=box.xMax ()-box.xMin ();
  11.    float dy=box.yMax ()-box.yMin();   
  12.    for(unsigned int i=0;i<root->getNumDrawables ();i++)
  13.    {
  14.        Drawable* draw=root->getDrawable (i);
  15.        Geometry* geom=draw->asGeometry ();
  16.        if(geom)
  17.        {
  18.           //给每个顶点设置对应的纹理坐标
  19.            Vec3Array* va=dynamic_cast<Vec3Array*>(geom->getVertexArray ());
  20.            Vec2Array* txtCoord=new Vec2Array(va->size());
  21.            Vec3Array::iterator it=va->begin ();
  22.            while(it!=va->end()){
  23.                float px=(*it).x();
  24.                float py=(*it).y();
  25.                float tx=(px-box.xMin())*width/dx;
  26.                float ty=(py-box.yMin())*height/dy;
  27.                txtCoord->push_back (Vec2(tx,ty));
  28.                it++;
  29.            }
  30.            geom->setTexCoordArray (0,txtCoord);
  31.            //set normal data
  32.            Vec3Array* nc=new Vec3Array;
  33.            nc->push_back(Vec3(0.f,-1.f,0.f));

  34.            geom->setNormalArray(nc);
  35.            geom->setNormalBinding(Geometry::BIND_OVERALL );
  36.        }
  37.    }
  38.     Texture2D* txt=new Texture2D();         
  39.     txt->setWrap (Texture2D::WRAP_S ,Texture2D::REPEAT );
  40.     txt->setWrap (Texture2D::WRAP_T ,Texture2D::REPEAT );

  41.     txt->setFilter(Texture::MIN_FILTER,Texture::LINEAR);
  42.     txt->setFilter(Texture::MAG_FILTER,Texture::NEAREST);

  43.     txt->setImage (img);
  44.     StateSet *state=root->getOrCreateStateSet ();
  45.     state->setTextureAttribute (0,txt,StateAttribute::ON );
  46.     state->setTextureMode (0,GL_TEXTURE_2D,StateAttribute::ON|StateAttribute::OVERRIDE );
  47.     root->setStateSet (state);
  48. }
复制代码

该用户从未签到

 楼主| 发表于 2009-9-3 00:48:33 | 显示全部楼层
贴一半纹理是因为LOD载入了新的节点 导致的..
但是只出基本色还是个大问题

该用户从未签到

发表于 2009-9-3 02:15:18 | 显示全部楼层
纹理坐标问题~~~~~~

该用户从未签到

 楼主| 发表于 2009-9-3 10:22:34 | 显示全部楼层
纹理坐标我是这么处理的.
1.获取节点的BoundingBox然后就可以知道x,y方向上的长度.
2.我每次都用节点的x-box.xMin()这样可以获取当前点和xMin的偏移,然后根据这个偏移和x方向的宽度dx得到一个比例.这就是(x-box.xMin())/dx的由来.
3.我的纹理需要在x方向上重复width次. 所以将这个比例用width放大一下.就得到tx=(x-box.xMin())*width/dx了.
4.y方向同上.
这个过程有什么问题吗?请详细指点一下.

该用户从未签到

发表于 2009-9-3 17:08:28 | 显示全部楼层
只有一片单色的话,多半是纹理坐标设置的问题;您的设置思路也许问题不大,但是要看一下实现代码和纹理坐标的结果是否正确

该用户从未签到

 楼主| 发表于 2009-9-3 22:46:28 | 显示全部楼层
问题解决了 这个方法自己没有问题.
问题出在调用的时候传递的width和height太大了.
对于我那个图片 使用10以内的数比较合适 大了就不行了。
我一开始就用1000来测试的.所以是一篇单色.
我原想 重复的次数越多 应该越清楚 谁知道过犹不及了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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