首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL纹理:为什么顺序很重要?

OpenGL纹理:为什么顺序很重要?
EN

Stack Overflow用户
提问于 2012-03-08 14:16:12
回答 2查看 869关注 0票数 0

我正在尝试设置一个简单的函数,这将使我更容易在OpenGL中纹理贴图几何体,但由于某些原因,当我试图制作一个天空盒子,我得到一个白色的盒子,而不是纹理贴图几何体。我认为有问题的代码存在于以下几个方面:

代码语言:javascript
复制
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(),而只为少数纹理调用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-08 14:19:06

是的,秩序是绝对重要的。

  • glGenTexture创建了一个纹理,name.
  • glBindTexture使用由glGenTexture.
  • glTexImage2D生成的纹理名称,所以它不能在glBindTexture.

上传数据到当前绑定的纹理之前运行,所以它不能在glGenTexture之前运行

OpenGL的客户端接口是一个巨大的Squggly状态机。有大量的参数和标志可以更改,您必须谨慎地始终将OpenGL保持在正确的状态。这通常意味着弹出推送的矩阵和恢复修改的标志(至少在OpenGL 1.x中)。

票数 8
EN

Stack Overflow用户

发布于 2012-03-08 18:18:09

OpenGL是一个状态机,这意味着您可以拉动它的杠杆,转动它的旋钮,它将保持这些设置,直到您主动更改它们。

然而,它也在对象中管理它的持久数据。这样的对象是抽象的,不能与屏幕上看到的对象混淆! Now to but通过其所谓的名称,一个数字ID来识别对象。您可以使用glGenTextures为纹理对象创建一个(列表)名称-但不是对象!-纹理对象就是这样一种OpenGL对象。

要操纵这样的对象,必须首先将OpenGL置于这样一种状态,即操作这种类型的对象的所有后续调用都发生在一个特定的对象上。这是通过glBindTexture完成的。在调用glBindTexture之后,所有处理纹理的调用都会发生在您刚刚绑定的纹理对象上。如果该对象以前不存在,则在第一次绑定新分配的对象名称时会创建该对象。现在OpenGL使用了这个特定的对象。

glTexImage2D只是处理当前绑定纹理数据的几个函数之一。

否则,您的函数将指向正确的方向。OpenGL没有真正的初始化阶段,你只需要做你想做的事情。而且,将数据的加载推迟到需要时再加载也是有意义的。但在实际绘制框架之前,对对象列表进行多次迭代也是有意义的。其中一个准备工作应该是遍历所有对象(现在不是OpenGL,而是您的对象),以测试数据是否已经加载。如果仍有大量数据丢失,则绘制一个加载屏幕,这样用户就不会觉得您的程序挂起了。也许甚至可以在单独的线程中执行冗长的加载操作,但对于OpenGL,这需要一些预防措施。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9613637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档