我使用 glBindTexture 有什么问题?

What's wrong with my usage of glBindTexture?

本文关键字:什么 问题 glBindTexture      更新时间:2023-10-16

我正在渲染一个棋盘,使用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();

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

不能在glBegin/End中间调用glBindTexture。你只能在begin/end中调用顶点函数。

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

来自文档:

执行glBindTexture,生成

GL_INVALID_OPERATIONglBegin的执行和相应的glEnd的执行

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

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

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