Sea*_*ean 0 c++ opengl texture-mapping
我试图设置一个简单的函数,这将使我更容易在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);
}
Run Code Online (Sandbox Code Playgroud)
最重要的事情,我不明白的是由于某种原因,glBindTexture()一定要来之间glGenTextures()和glTexImage2D.如果我把它放在其他任何地方,它会搞砸一切.什么可能导致这个问题?对不起,如果它很简单,我对openGL来说是全新的.
下面是我正在谈论的白盒的截图:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
在更多地使用代码后,我意识到如果我添加glTexImage2D()并glTexParameteri()在最后一次glBindTexture()之后所有纹理加载.为什么没有这两行会加载大多数纹理,但是有一些不会加载,为什么我必须为每一帧调用glTexImage(),但仅限于几个纹理?
是的,订单绝对重要.
glGenTexture 创建纹理名称.
glBindTexture获取生成的纹理名称glGenTexture,因此之前无法运行glGenTexture.
glTexImage2D将数据上传到当前绑定的纹理,因此之前无法运行glBindTexture.
OpenGL的客户端界面是一个巨型Squggly状态机.您可以更改大量的参数和标志,并且必须谨慎,始终将OpenGL保持在正确的状态.这通常意味着弹出矩阵,推送和恢复您修改的标志(至少在OpenGL 1.x中).
OpenGL 是一个状态机,这意味着您可以拉动它的控制杆,转动它的旋钮,它会保留这些设置,直到您主动更改它们。
\n\n然而,它还管理对象中的持久数据。这些对象是抽象的东西,不能与屏幕上看到的对象混淆!\n现在,对于外部来说,OpenGL 通过所谓的名称(数字 ID)来识别对象。您创建了一个名称(列表)\xe2\x80\x93,但不是对象!\xe2\x80\x93 用于glGenTextures纹理对象,这是一种OpenGL对象。
要操作此类对象,OpenGL 必须首先进入一种状态,以便操作该类型的此类对象的所有后续调用都发生在一个特定对象上。这是用 完成的glBindTexture。调用glBindTexture所有以下操作纹理的调用后,会发生在您刚刚绑定的一个纹理对象上。如果该对象以前不存在,则在第一次绑定新指定的对象名称时会创建该对象。\n现在 OpenGL 使用该特定对象。
glTexImage2D只是操作当前绑定纹理数据的几个函数之一。
否则你的函数就指向正确的方向。OpenGL 没有真正的初始化阶段,您只需要边做边做。推迟数据加载直到您需要它是有意义的。但在实际绘制框架之前对对象列表进行多次迭代也是有意义的。准备工作之一应该是,迭代所有对象(现在不是 OpenGL,而是您的)以测试数据是否已加载。如果仍然缺少大量数据,请绘制一个加载屏幕,这样用户就不会产生程序挂起的印象。甚至可能在单独的线程中执行冗长的加载操作,但对于 OpenGL,这需要一些预防措施。
\n