为什么使用OpenGL绘制带纹理四边形时纹理会顺时针旋转90度?
问题原因
OpenGL是状态机模型,必须先设置纹理坐标等顶点属性,再调用glVertex指定顶点。你的代码把glTexCoord2f和glVertex2f的调用顺序完全写反了,导致每个纹理坐标都绑定到了下一个顶点上,纹理坐标和顶点的对应关系错位,最终呈现出90度旋转的效果。
修复方法
调整draw函数中glBegin块的调用顺序,每个顶点先设置纹理坐标,再指定顶点位置:
glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex2f(x, y); glTexCoord2f(1, 0); glVertex2f(x + 400, y); glTexCoord2f(1, 1); glVertex2f(x + 400, y + 400); glTexCoord2f(0, 1); glVertex2f(x, y + 400); glEnd();
附加说明
如果修改顺序后发现纹理上下颠倒,是因为SFML加载PNG纹理时默认使用左上角为原点、Y轴向下的坐标系,而你用gluOrtho2D设置的正交投影是左下角为原点、Y轴向上,两者Y轴方向相反。可以直接翻转纹理坐标的Y值解决:
glBegin(GL_QUADS); glTexCoord2f(0, 1); glVertex2f(x, y); glTexCoord2f(1, 1); glVertex2f(x + 400, y); glTexCoord2f(1, 0); glVertex2f(x + 400, y + 400); glTexCoord2f(0, 0); glVertex2f(x, y + 400); glEnd();
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

