我正在使用2种不同的纹理渲染棋盘。一个用于黑色方块,一个用于白色方块。然而,不是每个不同的正方形都有自己的纹理,它们都采用我绑定的最后一个纹理glBindTexture(GL_TEXTURE_2D, id);
。
这是我的方法:
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
// square 0, 0 ( front left )
glBindTexture(GL_TEXTURE_2D, textureBlackSquare->texID);
glNormal3f(0, 1, 0);
glTexCoord2f(0, 0); glVertex3f(-8.0, 0.5, 8.0);
glTexCoord2f(1, 0); glVertex3f(-6.0, 0.5, 8.0);
glTexCoord2f(1, 1); glVertex3f(-6.0, 0.5, 6.0);
glTexCoord2f(0, 1); glVertex3f(-8.0, 0.5, 6.0);
glEnd();
glBegin(GL_QUADS);
// square 1, 0
glBindTexture(GL_TEXTURE_2D, textureWhiteSquare->texID);
glTexCoord2f(0, 0); glVertex3f(-6.0, 0.5, 8.0);
glTexCoord2f(1, 0); glVertex3f(-4.0, 0.5, 8.0);
glTexCoord2f(1, 1); glVertex3f(-4.0, 0.5, 6.0);
glTexCoord2f(0, 1); glVertex3f(-6.0, 0.5, 6.0);
glEnd();
当我运行此代码时,两个四边形都绑定了白色纹理。如何让每个四边形都有自己的纹理?
答案 0 :(得分:10)
您无法在glBindTexture
的中间拨打glBegin/End
。您只能在开始/结束时调用顶点函数。
另外,为什么不将单个纹理制作为8x8棋盘,然后只渲染一个四边形来绘制整个棋盘?
答案 1 :(得分:3)
如果在GL_INVALID_OPERATION
之间执行,则生成
glBindTexture
glBegin
的执行以及glEnd
的相应执行。
您忘记检查错误,因此错过了您的程序无效。
答案 2 :(得分:2)
您无法在glBegin-glEnd块中绑定纹理。此外,您应该尽可能避免切换纹理,因为切换纹理是您可以要求GPU执行的最昂贵的事情之一(纹理切换使所有纹素提取缓存无效)。
相反,您可以按照他们使用的纹理对场景对象进行排序,并将其分组。因此,您首先使用第一个纹理(比如白色)渲染所有棋盘四边形,然后使用第二个纹理渲染所有四边形(然后是黑色)。