我正在尝试设置一个简单的函数,这将使我更容易在OpenGL中纹理贴图几何体,但由于某些原因,当我试图制作一个天空盒子,我得到一个白色的盒子,而不是纹理贴图几何体。我认为有问题的代码存在于以下几个方面:
void MapTexture (char *File, int TextNum) {
if (!TextureImage[TextNum]){
TextureImage[TextNum]=auxDIBImageLoad(File);
glGenTextures(1, &texture[TextNum]);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
//glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}我不明白的一件重要的事情是,出于某种原因,glBindTexture()必须介于glGenTextures()和glTexImage2D之间。如果我把它放在别的地方,就会把一切都搞砸。导致此问题的原因可能是什么?抱歉,如果这是简单的事情,我是一个全新的openGL。
下面是我正在讨论的白盒的屏幕截图:

+++++++++++++++++++++++++++++++编辑+++++++++++++++++++++++++++++++
在尝试了更多的代码之后,我意识到如果我在最后一个glBindTexture()之后添加了glTexImage2D()和glTexParameteri(),那么所有的纹理都会加载。为什么如果没有这两行代码,大多数纹理都会加载,但还有一些不会加载,为什么我必须为每一帧调用glTexImage(),而只为少数纹理调用?
发布于 2012-03-08 14:19:06
是的,秩序是绝对重要的。
glGenTexture创建了一个纹理,name.glBindTexture使用由glGenTexture.glTexImage2D生成的纹理名称,所以它不能在glBindTexture.上传数据到当前绑定的纹理之前运行,所以它不能在glGenTexture之前运行
OpenGL的客户端接口是一个巨大的Squggly状态机。有大量的参数和标志可以更改,您必须谨慎地始终将OpenGL保持在正确的状态。这通常意味着弹出推送的矩阵和恢复修改的标志(至少在OpenGL 1.x中)。
发布于 2012-03-08 18:18:09
OpenGL是一个状态机,这意味着您可以拉动它的杠杆,转动它的旋钮,它将保持这些设置,直到您主动更改它们。
然而,它也在对象中管理它的持久数据。这样的对象是抽象的,不能与屏幕上看到的对象混淆! Now to but通过其所谓的名称,一个数字ID来识别对象。您可以使用glGenTextures为纹理对象创建一个(列表)名称-但不是对象!-纹理对象就是这样一种OpenGL对象。
要操纵这样的对象,必须首先将OpenGL置于这样一种状态,即操作这种类型的对象的所有后续调用都发生在一个特定的对象上。这是通过glBindTexture完成的。在调用glBindTexture之后,所有处理纹理的调用都会发生在您刚刚绑定的纹理对象上。如果该对象以前不存在,则在第一次绑定新分配的对象名称时会创建该对象。现在OpenGL使用了这个特定的对象。
glTexImage2D只是处理当前绑定纹理数据的几个函数之一。
否则,您的函数将指向正确的方向。OpenGL没有真正的初始化阶段,你只需要做你想做的事情。而且,将数据的加载推迟到需要时再加载也是有意义的。但在实际绘制框架之前,对对象列表进行多次迭代也是有意义的。其中一个准备工作应该是遍历所有对象(现在不是OpenGL,而是您的对象),以测试数据是否已经加载。如果仍有大量数据丢失,则绘制一个加载屏幕,这样用户就不会觉得您的程序挂起了。也许甚至可以在单独的线程中执行冗长的加载操作,但对于OpenGL,这需要一些预防措施。
https://stackoverflow.com/questions/9613637
复制相似问题