当前位置: 首页 > 知识库问答 >
问题:

GLU四边形状态不支持多个glBindTexture?

年业
2023-03-14

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

我将遵循OpenGL红皮书的第9章,http://www.glprogramming.com/red/chapter09.html

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

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

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_四边形,它也会在每个GL_四边形状态中绘制一个四边形。但是,如果我在代码中间注释掉glEnd()和glBegin(GL\u 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,texName1)已经不起作用了。结果是:

谁能告诉我为什么我不能把两个glBindTexture变成一个GL_QUADS状态?

共有1个答案

梅修贤
2023-03-14

因为OpenGL不支持这样做。

glBegin/glEnd内部时,只能调用OpenGL,如glTexCoord*glVertex*等顶点提交调用。其他任何调用都是错误的。

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

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

 类似资料:
  • 我正在做一个minecraft-ish游戏,我在vbos上做了更多的工作。然而在一个vbo中绘制多个面时,我似乎有点问题。 以下是我的vbo生成代码: 下面是我用来绘制vbo的代码: 这是我想要的结果(在每个vbo中使用一个四边形): 不幸的是,我还是新来的,所以你必须点击这个链接:/ 下面是我在每个vbo中使用多个四边形得到的结果: 形象 那么为什么我要在一个vbo中绘制多个四边形呢?一个词:性

  • 为什么这工作正常: 这会产生运行时错误 错误: 这没有任何意义。第一个代码工作正常,三角形画好了,但第二个代码不行。有人能解释一下我做错了什么吗...

  • 判断是否在支持的环境打开 var isSupportedApp = Tida.isSupportedApp;// 判断是否在天猫/手淘环境下,一般用于处理应用的兼容。

  • 我想创建一个多边形从形状点。

  • 我已经画了一个正方形,但是我怎样才能在它旁边放置另一个正方形而没有任何空隙呢?我认为< code>mRedRect1F中的第一个参数(0)需要更改,但我不知道该更改什么。 使现代化

  • 我目前正在使用JavaFX研究不同形状之间的边界相交。我想检测两个多边形在它们的点上的碰撞,而不是在它们的边界上(即2个多边形)。 请参阅图1:不期望的行为,以及图2:期望的行为。 是否有任何现有的算法可以帮助我或使用任何库?提前感谢:) 在这里找到我的解决方案: 输出: 它似乎工作正常,我将使用Path对象进行测试以替换多边形objets。