OpenGL纹理加载

14

大家晚上好, 我在这里打转,但我认为我在找错地方了。

我的问题是如何加载图像并将其应用于OpenGL中的基本元素。例如,加载一个bmp或jpg并将其应用于glutsolidsphere。

这个解决方案是仅限于一个平台还是可以跨越所有平台使用?

谢谢你的帮助。

5个回答

20

如果你愿意,你可以编写自己的bmp加载器。 这里是规范和一些代码。否则,我刚好有一个tga加载器在这里。完成后,它将以无符号字符数组的形式返回数据,也称为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函数,或者使用着色器。


2

在将图像映射到球体上的过程中,有无数种方法可以使用。您可以查阅gltexgen命令以自动生成纹理坐标来完成对glut球体的纹理映射。


1

这可能比你预想的更复杂。

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

完成此操作后,您需要加载图像。OpenGL不提供从文件加载图像的函数,如果我记得正确,glu和glut也不提供。因此,您必须自己读取图像文件,或使用可以执行此操作的库。DevIL是其中之一。

一旦您有了图像的像素数据,就需要使用它创建新的OpenGL纹理。一些图像加载库可以为您执行此操作。DevIL可以。

我强烈建议搜索一些教程,但请不要使用NeHe教程,它们的质量通常相当差。


1
Ned已经很好地描述了它。你应该阅读NeHe的教程,其中每个步骤都有详细的描述。正如其他人指出的那样,给四边形贴图将是一个不错的开始,而球体可能会有点棘手。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接