【发布时间】:2010-01-10 02:48:08
【问题描述】:
大家晚上好, 我在这里绕圈子,但我想我找错了地方。
我的问题是我将如何加载图像并将其应用于 openGL 中的图元。例如加载 bmp 或 jpg 并将其应用到 glutsolidsphere。
该解决方案会仅限于一个平台,还是可以在所有平台上运行?
感谢您的帮助
【问题讨论】:
标签: opengl
大家晚上好, 我在这里绕圈子,但我想我找错了地方。
我的问题是我将如何加载图像并将其应用于 openGL 中的图元。例如加载 bmp 或 jpg 并将其应用到 glutsolidsphere。
该解决方案会仅限于一个平台,还是可以在所有平台上运行?
感谢您的帮助
【问题讨论】:
标签: opengl
好吧,如果您愿意,您可以编写自己的 bmp 加载程序。 Here 是规范和一些代码。否则,我碰巧有一个 tga loader here。一旦你这样做了,它将以无符号字符数组的形式返回数据,也称为 GL_UNSIGNED_BYTE。
要从这个数组中创建一个 OpenGL 纹理,您首先定义一个变量,该变量将用作对 OpenGL 内存中该纹理的引用。
GLuint textureid;
然后,您需要告诉 OpenGL 为新纹理腾出空间:
glGenTextures(1, &textureid);
然后,您需要将该纹理绑定为当前使用的纹理。
glBindTexture(GL_TEXTURE_2D, textureid);
最后,你需要告诉 OpenGL 当前纹理的数据在哪里。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, your_data);
然后,当您渲染图元时,您可以通过再次调用 glBindTexture 将其应用到图元:
glBindTexture(GL_TEXTURE_2D, textureid);
glBegin(GL_QUAD);
glTexCoord2f(0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(0.0, 1.0, 0.0);
glEnd();
但是,任何时候将纹理应用于图元时,都需要纹理坐标数据和顶点数据,而 glutSolidSphere 不会生成纹理坐标数据。要对球体进行纹理处理,可以自己生成,也可以调用 texgen 函数,或者使用着色器。
【讨论】:
有无数种方法可以将图像纹理映射到球体上。您可以查看 gltexgen 命令以自动为 glut 球体生成纹理坐标。
【讨论】:
它可能比你想象的要复杂。
首先,我很确定您不能对使用glutSolidSphere 绘制的球体进行纹理处理,因为该函数没有为其绘制的顶点指定纹理坐标。因此,您需要编写一个方法来逐个顶点或使用顶点缓冲区绘制球体,并确保为每个顶点指定纹理坐标。
完成后,您需要加载图片。 OpenGL 不提供从文件中加载图像的功能,如果我没记错的话,glu 和 glut 也不提供。因此,您必须自己读取图像文件,或者使用这样做的库。 DevIL 就是其中之一。
获得图像的像素数据后,您需要使用它创建一个新的 OpenGL 纹理。一些图像加载库可以为您做到这一点。 DevIL 可以。
我强烈建议在谷歌上搜索一些教程,但请不要使用 NeHe 教程,它们的质量通常很差。
【讨论】:
内德很好地描述了它。您应该阅读来自NeHe 的教程,其中详细描述了每个步骤。正如其他人所指出的,纹理四边形将是一个好的开始,而球体可能有点棘手。
【讨论】:
这很有趣,TGA 是我能够成功加载到纹理中的第一种类型的图像文件。不幸的是,OpenGL 没有自己的内置 API 函数来直接读取文件。因此需要任何外部库或代码。 TGA 格式很简单,Ned 为它提供了一些很好的代码。
【讨论】: