我需要为glutSolidSphere添加地球纹理。问题是我无法弄清楚如何使纹理在整个球体上伸展并且仍然能够旋转。
我们启用纹理。
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
//drawcode...
在参数中使用GL_SPHERE_MAP而不是GL_OBJECT_LINEAR可以使纹理看起来合适,但是它们无法旋转。
我用于纹理的参数是
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
我知道GL_REPEAT可以平铺纹理,而使用GL_CLAMP可以给我一次在对象上的纹理,但是我无法使其遍及整个球体。
有谁知道如何正确构造glutSolidSphere?
最佳答案
glutSolidSphere
没有提供适当的纹理坐标,OpenGL内置的纹理生成功能仅允许从顶点位置到顶点纹理坐标的线性映射,这实质上意味着您不能使用它们来对2平面的3球进行纹理化,有界纹理(有关数学解释,请查看歧管拓扑和地图理论的主题)。
所以,你可以做什么?有许多可能的解决方案:
不要使用glutSolidSphere,但是可以使用其他一些提供正确纹理坐标的几何生成器(尽管仅用一个有限的2D纹理对球进行纹理化是一个困难的话题,但存在多个映射,每个映射都有其问题)
使用与球体,立方体贴图具有相同拓扑的纹理,然后可以将GL_NORMAL_MAP用于纹理生成模式,即
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
查找有关多维数据集映射的教程。但是从本质上讲,一个立方体贴图由6个纹理面组成,围绕原点排列在一个立方体中,并且纹理坐标不是立方体本身上的点,而是从原点开始的方向和寻址的texel方向是光线相交的方向与多维数据集。
使用顶点着色器,从顶点位置生成纹理坐标。由于顶点着色器是可自由编程的,因此不需要映射是线性的。当然会再次遇到用有界2平面映射3球体的特殊性。