我使用glBindTexture有什么问题?

时间:2011-11-08 02:21:59

标签: c++ opengl

我正在使用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();

当我运行此代码时,两个四边形都绑定了白色纹理。如何让每个四边形都有自己的纹理?

3 个答案:

答案 0 :(得分:10)

您无法在glBindTexture的中间拨打glBegin/End。您只能在开始/结束时调用顶点函数。

另外,为什么不将单个纹理制作为8x8棋盘,然后只渲染一个四边形来绘制整个棋盘?

答案 1 :(得分:3)

来自the documentation

  如果在GL_INVALID_OPERATION之间执行,则生成

glBindTexture   glBegin的执行以及glEnd的相应执行。

您忘记检查错误,因此错过了您的程序无效。

答案 2 :(得分:2)

您无法在glBegin-glEnd块中绑定纹理。此外,您应该尽可能避免切换纹理,因为切换纹理是您可以要求GPU执行的最昂贵的事情之一(纹理切换使所有纹素提取缓存无效)。

相反,您可以按照他们使用的纹理对场景对象进行排序,并将其分组。因此,您首先使用第一个纹理(比如白色)渲染所有棋盘四边形,然后使用第二个纹理渲染所有四边形(然后是黑色)。

相关问题