大家晚上好, 我在这里打转,但我认为我在找错地方了。
我的问题是如何加载图像并将其应用于OpenGL中的基本元素。例如,加载一个bmp或jpg并将其应用于glutsolidsphere。
这个解决方案是仅限于一个平台还是可以跨越所有平台使用?
谢谢你的帮助。
大家晚上好, 我在这里打转,但我认为我在找错地方了。
我的问题是如何加载图像并将其应用于OpenGL中的基本元素。例如,加载一个bmp或jpg并将其应用于glutsolidsphere。
这个解决方案是仅限于一个平台还是可以跨越所有平台使用?
谢谢你的帮助。
如果你愿意,你可以编写自己的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函数,或者使用着色器。
在将图像映射到球体上的过程中,有无数种方法可以使用。您可以查阅gltexgen命令以自动生成纹理坐标来完成对glut球体的纹理映射。
这可能比你预想的更复杂。
首先,我相当确定你不能为使用glutSolidSphere
绘制的球体贴纹理,因为该函数没有为其绘制的顶点指定纹理坐标。因此,您需要编写一个方法来逐个顶点或使用顶点缓冲区绘制球体,并确保为每个顶点指定纹理坐标。
完成此操作后,您需要加载图像。OpenGL不提供从文件加载图像的函数,如果我记得正确,glu和glut也不提供。因此,您必须自己读取图像文件,或使用可以执行此操作的库。DevIL是其中之一。
一旦您有了图像的像素数据,就需要使用它创建新的OpenGL纹理。一些图像加载库可以为您执行此操作。DevIL可以。
我强烈建议搜索一些教程,但请不要使用NeHe教程,它们的质量通常相当差。
这很有趣,TGAs是我能够成功加载到纹理中的第一种图像文件类型。不幸的是,OpenGL没有自己内置的API函数来直接读取文件。因此,需要使用任何外部库或代码。TGA格式很简单,Ned提供了一些很好的代码。