opengl - 对 glutSolidSphere 进行纹理化

标签 opengl textures

我需要向 glutSolidSphere 添加地球纹理。问题是我无法弄清楚如何使纹理在整个球体上拉伸(stretch)并且仍然能够旋转。

我们正在启用纹理。

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 会在对象上一次提供纹理,但我无法让它拉伸(stretch)到整个球体。

有谁知道如何正确地纹理 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 个纹理面组成,围绕原点排列在立方体中,纹理坐标不是立方体本身上的点,而是从原点开始的方向,所寻址的纹素是方向光线相交的方向与立方体。

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

关于opengl - 对 glutSolidSphere 进行纹理化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251911/

相关文章:

c++ - 四元数到旋转矩阵,使用特征库的值不正确

java - 使用 VBO 的 JOGL 可能存在内存泄漏

opengl - 以编程方式确定硬件是否支持 OpenGL 函数

windows - 在 AutoIt 中捕获带窗口的 OpenGL 窗口的屏幕截图?

javascript - 在 Three.js 中更改 MouseOver 上的纹理颜色

c++ - OpenGL 半球纹理贴图

java - 50 MB 图像使用 1 GB RAM 作为纹理

Java3D : How to avoid OutOfMemoryError while using textures

java - 更改 libgdx 中的图像

opengl - 这是绘制许多不同动态 3D 模型的最佳和正确方法(它们是动画的并且每一帧都会改变)