Ran*_*Tek 0 opengl texture-mapping
简而言之,为什么我不能将两个glBindTexture放入一个glBegin(GL_QUADS)... glEnd()?
我正在关注OpenGL红皮书第9章,http://www.glprogramming.com/red/chapter09.html
在例9-5中,程序texbind.c生成两个具有不同纹理的四边形,如下所示:

左边的四边形有一个白色的棋盘格纹,而右边的四边形有一个红色的棋盘格.
这是将纹理映射到两个四边形的代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,即使代码使用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();
}
Run Code Online (Sandbox Code Playgroud)
事实证明第二个glBindTexture(GL_TEXTURE_2D,texName 1)不再起作用了.结果是:

谁能告诉我为什么我不能将两个glBindTexture放入一个GL_QUADS状态?
因为OpenGL不支持这样做.
唯一的电话,而里面你可以对OpenGL的glBegin/ glEnd是顶点提交调用一样glTexCoord*,glVertex*等别的是错误的.
至于"为什么",一个原因是"因为规范说的如此".更有可能的是,GPU并行处理整个数据集(或其重要组块),在此期间它无法切换纹理.
还要考虑使用OpenGL绘制的更新方法:将数据上传到顶点缓冲区对象并调用其中一个glDraw*命令.你甚至无法glBindTexture使用它在基元之间调用.
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |