GL_QUADS状态不支持多个glBindTexture?

时间:2014-09-04 20:49:23

标签: opengl texture-mapping

简而言之,为什么我不能将两个glBindTexture放入一个glBegin(GL_QUADS)...... glEnd()?

我正在关注OpenGL红皮书第9章http://www.glprogramming.com/red/chapter09.html

在例9-5中,程序texbind.c生成两个具有不同纹理的四边形,如下所示: enter image description here

左边的四边形有一个白色的棋盘纹理,而右边的四边形有一个红色的棋盘格纹理。

以下是将纹理映射到两个四边形的代码:

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glBindTexture(GL_TEXTURE_2D, texName[0]);
  glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
  glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
  glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
  glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
  glEnd();
  glBindTexture(GL_TEXTURE_2D, texName[1]);
  glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
  glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
  glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
  glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
  glEnd();
  glFlush();
}

我们可以看到,即使代码使用GL_QUADS,它也会在每个GL_QUADS状态中绘制一个四元组。但是,如果我在这段代码的中间注释掉glEnd()和glBegin(GL_QUADS),就像这样:

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glBindTexture(GL_TEXTURE_2D, texName[0]);
  glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
  glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
  glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
  glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
  // glEnd();
  glBindTexture(GL_TEXTURE_2D, texName[1]);
  // glBegin(GL_QUADS);
  glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
  glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
  glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
  glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
  glEnd();
  glFlush();
}

事实证明第二个glBindTexture(GL_TEXTURE_2D,texName 1)不再起作用了。结果是:

enter image description here

有谁可以告诉我为什么我不能将两个glBindTexture放入一个GL_QUADS状态?

1 个答案:

答案 0 :(得分:5)

因为OpenGL不支持这样做。

glBegin / glEnd内部,您可以对OpenGL进行的唯一调用是顶级提交调用,例如glTexCoord*glVertex*等。其他任何内容都是错误。< / p>

关于“为什么”,一个原因是“因为规范是这样说的”。更有可能的是,GPU并行处理整个数据集(或其中的重要数据集),在此期间它无法切换纹理。

还要考虑使用OpenGL绘制的更新方法:将数据上传到顶点缓冲区对象并调用其中一个glDraw*命令。你甚至无法使用它在原语之间调用glBindTexture

相关问题