大家晚上,我在这里绕圈子,但我觉得我在找错了地方.
我的问题是如何加载图像并将其应用于openGL中.例如,加载bmp或jpg并将其应用于glutsolidsphere.
解决方案是限于一个平台还是可以在所有平台上运行?
谢谢你的帮助
Ned*_*ham 20
好吧,如果你愿意,你可以编写自己的bmp加载器.这是规范和一些代码.否则,我碰巧在这里有一个tga加载器.一旦这样做,它将以无符号字符数组返回数据,也称为GL_UNSIGNED_BYTE.
要从此数组创建OpenGL纹理,首先要定义一个变量,该变量将用作OpenGL内存中该纹理的引用.
GLuint textureid;
Run Code Online (Sandbox Code Playgroud)
然后,您需要告诉OpenGL为新纹理腾出空间:
glGenTextures(1, &textureid);
Run Code Online (Sandbox Code Playgroud)
然后,您需要将该纹理绑定为当前使用的纹理.
glBindTexture(GL_TEXTURE_2D, textureid);
Run Code Online (Sandbox Code Playgroud)
最后,您需要告诉OpenGL数据是针对当前纹理的.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, your_data);
Run Code Online (Sandbox Code Playgroud)
然后,在渲染基元时,通过再次调用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();
Run Code Online (Sandbox Code Playgroud)
但是,无论何时将纹理应用于基元,都需要将纹理坐标数据与顶点数据一起使用,而且glutSolidSphere不会生成纹理坐标数据.要纹理球体,可以自己生成球体,也可以调用texgen函数,或使用着色器.
它可能比您想象的更复杂。
首先,我很确定您无法对使用 绘制的球体进行纹理处理glutSolidSphere,因为该函数没有为其绘制的顶点指定纹理坐标。因此,您需要编写一个方法来逐个顶点或使用顶点缓冲区绘制球体,并确保为每个顶点指定纹理坐标。
完成此操作后,您需要加载图像。OpenGL 不提供从文件加载图像的函数,如果我没记错的话, glu 和 glut 也不提供。因此,您必须自己读取图像文件,或者使用执行此操作的库。DevIL 就是其中之一。
获得图像的像素数据后,您需要使用它创建新的 OpenGL 纹理。一些图像加载库可以为您完成此操作。DevIL 可以。
我强烈建议用谷歌搜索一些教程,但请不要使用 NeHe 教程,它们的质量通常很差。