我正在尝试编写一些代码,将纹理渲染到一个简单的方块上,但是在使它工作时遇到了很多麻烦。我为纹理映射here下载了一些示例源代码并对其进行了编译,它似乎可以将纹理映射精细地放到它们的柱面上。然后,我添加了一些我的代码,看看它是否会将纹理渲染到我的方块上,但它只是用纯色来构造它,它似乎是红色和黑色之间的中间,而不是像圆柱体上出现的棋盘格。这是我在第一遍调用gluCylinder后添加的代码:
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(-1, -1);
glTexCoord2f(1,0);
glVertex2f(1, -1);
glTexCoord2f(1, 1);
glVertex2f(1, 1);
glTexCoord2f(0,1);
glVertex2f(-1, 1);
glEnd();
为什么纹理会在圆柱体上正常渲染而在我的四边形上没有任何原因?
答案 0 :(得分:5)
示例代码启用了自动纹理坐标生成,因此您的glTexCoord2f调用将被忽略。自动生成被投影到Z平面上。由于你的四边形是一个Y平面,它实际上只是在整个四边形上拉伸一个纹理像素。
要使其工作,请在glBegin之前禁用自动纹理生成,然后在glEnd之后重新启用它。
即:
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(-1, -1);
glTexCoord2f(1,0);
glVertex2f(1, -1);
glTexCoord2f(1, 1);
glVertex2f(1, 1);
glTexCoord2f(0,1);
glVertex2f(-1, 1);
glEnd();
glEnable (GL_TEXTURE_GEN_S);
glEnable (GL_TEXTURE_GEN_T);
或者,您可以将自动纹理生成设置为在Y平面上投影,并省略glTexCoord2f调用,然后在完成后将其设置回Z:
float zPlane[4] = {0., 0., 1., 0.};
float yPlane[4] = {0., 1., 0., 0.};
glTexGenfv (GL_T, GL_OBJECT_PLANE, yPlane);
glBegin(GL_QUADS);
glVertex2f(-1, -1);
glVertex2f(1, -1);
glVertex2f(1, 1);
glVertex2f(-1, 1);
glEnd();
glTexGenfv (GL_T, GL_OBJECT_PLANE, zPlane);