OpenGL纹理加载

时间:2010-01-10 02:48:08

标签: opengl

大家晚上, 我在这里转圈,但我想我在找错了地方。

我的问题是如何加载图像并将其应用于openGL中。例如,加载bmp或jpg并将其应用于glutsolidsphere。

解决方案是限于一个平台还是可以在所有平台上运行?

感谢您的帮助

5 个答案:

答案 0 :(得分:20)

好吧,如果你愿意,你可以编写自己的bmp加载器。 Here是规范和一些代码。否则,我碰巧有一个tga加载器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函数,或者使用着色器。

答案 1 :(得分:2)

有无数种方法可以将图像贴图到球体上。你可以查看gltexgen命令来自动生成过剩球体的纹理坐标。

答案 2 :(得分:1)

它可能比你期望的更复杂。

首先,我很确定你不能使用glutSolidSphere纹理绘制的球体,因为该函数没有为它绘制的顶点指定纹理坐标。因此,您需要编写一个方法来按顶点或使用顶点缓冲区绘制球体,并确保为每个顶点指定纹理坐标。

完成此操作后,您需要加载图片。 OpenGL不提供从文件加载图像的功能,如果我记得很清楚,那么也不会使用。因此,您必须自己阅读图像文件,或使用这样做的库。 DevIL就是其中之一。

获得图像的像素数据后,需要使用它创建新的OpenGL纹理。一些图像加载库可以为您执行此操作。恶魔可以。

我强烈推荐谷歌搜索一些教程,但请不要使用NeHe教程,它们的质量通常很差。

答案 3 :(得分:1)

Ned很好地描述了它。您应该阅读NeHe中的教程,其中详细介绍了每个步骤。正如其他人所指出的那样,纹理四边形将是一个良好的开端,而球体可能有点棘手。

答案 4 :(得分:1)

这很有趣,TGAs是我能够成功加载到纹理中的第一种图像文件。不幸的是,OpenGL没有自己的内置API函数来直接读取文件。因此需要任何外部库或代码。 TGA格式很简单,Ned为它提供了一些很好的代码。