查看: 2931|回复: 7

求教!如何给osg模型中的某个叶节点加纹理?

[复制链接]

该用户从未签到

发表于 2010-12-21 11:53:53 | 显示全部楼层 |阅读模式
如何给osg模型中的某个叶节点加纹理?
我有一个osg模型,此模型由多个geode节点组成,我想给一个特定的矩形平面geode的一个面加纹理,我是这样做的:先遍历出我要找的geode节点(是一个矩形平面),然后贴纹理。问题出在加纹理上,效果不对该如何处理?
代码如下:
osg::Texture2D* texture = new osg::Texture2D;
  osg::TexGen* texgen = new osg::TexGen;
  texgen->setMode(osg::TexGen::NORMAL_MAP);
  texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture:INEAR);
  texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
  texture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER);
  texture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER);
  texture->setImage(image);
  stateset->setTextureAttribute(0,texture,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  stateset->setTextureAttribute(0,texgen,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  stateset->setTextureMode(0,GL_TEXTURE_GEN_S,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  stateset->setTextureMode(0,GL_TEXTURE_GEN_T,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
model->setStateSet(stateset);
model是我遍历出的geode结点指针
谢谢!

该用户从未签到

发表于 2010-12-21 12:08:19 | 显示全部楼层
问题出在加纹理上,效果不对该如何处理


“效果不对”具体指什么?

该用户从未签到

 楼主| 发表于 2010-12-21 15:52:47 | 显示全部楼层
就是纹理应该起效果了但没贴正确,我不知道是不是要设坐标啊?如果是该如何设坐标啊?请具体点,谢谢。

该用户从未签到

发表于 2010-12-21 16:46:00 | 显示全部楼层
要自己设置纹理坐标~~~

该用户从未签到

发表于 2010-12-21 16:46:21 | 显示全部楼层
参看osg快速入门的例子

该用户从未签到

发表于 2010-12-21 16:53:02 | 显示全部楼层
我觉得是这样加的纹理坐标
        //纹理顶点
        osg::Vec2Array* texcoords = new osg::Vec2Array(4);
        (*texcoords)[0].set(0.0f, 0.0f);
        (*texcoords)[1].set(10.0f, 0.0f);
        (*texcoords)[2].set(10.0f, 10.0f);
        (*texcoords)[3].set(0.0f, 10.0f);

        geom->setTexCoordArray(0, texcoords);   

        //定义法线
        osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
        geom->setNormalArray(n.get());
        geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
        n->push_back(osg::Vec3(0.f,-1.f,0.f));

        //设置顶点关联方式
        geom->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:UADS,0,4));

该用户从未签到

发表于 2012-11-15 21:14:16 | 显示全部楼层
请问问题解决了么?求指教

该用户从未签到

发表于 2012-11-16 12:20:02 | 显示全部楼层
你得再研究一下OpenGL关于纹理自动生成的部分的知识。
在OpenGL中的纹理自动生成包括GL_OBJECT_LINEAR,GL_EYE_LINEAR,GL_SPHERE_MAP,GL_NORMAL_MAP,GL_REFLECTION_MAP五种,
其中前三种是主要应用于一维纹理、二维纹理、三维纹理,后两种是立方体纹理之中应用的映射模式。
所以,当你使用一个二维纹理映射的时候,你的映射模式不应该是GL_NORMAL_MAP。下面是一段OpenGL的法线映射代码:
  1. GLuint tex_cube;
  2. glGenTextures(1,&tex_cube);
  3. glBindTexture(GL_TEXTURE_CUBE_MAP,tex_cube);
  4. glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_S,GL_CLAMP);
  5. glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_T,GL_CLAMP);
  6. glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP);
  7. glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  8. glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR);


  9. Images image[6];//6张纹理图片,注意要大小一样,且为正方形,如果你的OpenGL驱动程序不支持GL_ARB_texture_non_power_of_two的话,图片的大小应该缩放为2的幂(调用gluScaleImage()可以完成此功能)
  10. for(int i=0;i<6;i++)
  11. {
  12.   glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,0,image[i].format,image[i].width,image[i].height,image[i].border,image[i].format,image[i].type,image[i].data);
  13. }

  14. glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

  15. //enable texture cube map
  16. glEnable(GL_TEXTURE_CUBE_MAP);

  17. //texture coordinate generation
  18. glEnable(GL_TEXTURE_GEN_S);
  19. glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_NORMAL_MAP);
  20. glEnable(GL_TEXTURE_GEN_T);
  21. glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_NORMAL_MAP);
  22. glEnable(GL_TEXTURE_GEN_R);
  23. glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_NORMAL_MAP);

  24. //
  25. draw();//绘制你要给制的物体
  26. //禁止它们
  27. glDisable(GL_TEXTURE_GEN_S);
  28. glDisable(GL_TEXTURE_GEN_T);
  29. glDisable(GL_TEXTURE_GEN_R);
  30. glDisable(GL_TEXTURE_CUBE_MAP);

  31. //
  32. glDeleteTextures(1,&tex_cube);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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