目前尚不清楚您的绘制循环的外观,以及您在其中设置矩阵、绘制 3d 内容和绘制 2d 内容的位置。但是从目前显示的代码中,我仍然可以解释为什么它可能会产生影响:每个矩阵类型(模型视图、投影、纹理)都有一个矩阵堆栈。
您的代码所做的是将当前选定的矩阵推入堆栈(可能是GL_MODELVIEW)。然后,您对其应用正交矩阵。由于这里的矩阵不太可能是恒等的,因此正交不会有您期望的结果,并且图像是错误的。此外,旧的投影矩阵仍然没有改变,这将进一步影响变换。然后,您恢复原始矩阵并继续进行渲染。
如果取消注释代码,则先切换,然后切换,将正交矩阵设置为投影并为模型视图设置标识 - 但只有模型视图矩阵要恢复,投影矩阵仍然具有正交集。
你真正需要做的是:
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
// ... draw
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix
这假设在调用 this 时,glMatrixMode(GL_MODELVIEW) 已设置,并将其恢复为 this。这也可以优化为
// assume `GL_MODELVIEW` is the current matrix mode
glPushMatrix(); // save current modelview matrix
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix(); // save current projection matrix
glLoadIdentity();
glOrtho(0, winw, winh, 0, -1, 1);
// ... draw
glPopMatrix(); // restore PUSHed projection matrix
glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // restore PUSHed modelview matrix
// now `GL_MODELVIEW` is selected again
调用开销略小,但不如初始变体清晰。