纹理化glutSolidSphere

mtf*_*ney 4 opengl textures

我需要为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...
Run Code Online (Sandbox Code Playgroud)

在param中使用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);
Run Code Online (Sandbox Code Playgroud)

我知道GL_REPEAT会对纹理进行平铺,而使用GL_CLAMP会在对象上给我一次纹理,但我不能让它在整个球体上延伸.

有谁知道如何正确构建glutSolidSphere?

dat*_*olf 5

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);
    
    Run Code Online (Sandbox Code Playgroud)

    查找有关多维数据集映射的教程.但实质上,立方体贴图由6个纹理面组成,围绕原点布置在立方体中,而纹理坐标不是立方体本身上的点,而是来自原点和寻址纹素的方向是方向光线相交的方向与立方体.

  • 使用顶点着色器,从顶点位置生成纹理坐标.由于顶点着色器可自由编程,因此映射不需要是线性的.当然会遇到再次映射具有有界2平面的3球面的特性.