Opengl 为什么重塑代码以glMatrixMode(GL_MODELVIEW)结尾?
当查看红皮书中的重塑示例时,我通常会发现如下内容:Opengl 为什么重塑代码以glMatrixMode(GL_MODELVIEW)结尾?,opengl,Opengl,当查看红皮书中的重塑示例时,我通常会发现如下内容: void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode(GL_MODELVIEW); } 我理解调用gl
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode(GL_MODELVIEW);
}
我理解调用glMatrixMode(GL_投影)代码>后跟glLoadIdentity()
重置投影矩阵,但我不明白为什么通常在重塑结束时调用glMatrixMode(GL\u MODELVIEW)
在这个特定的例子中,glFrustum
影响投影矩阵,对吗?为什么以后会调用GL\u MODELVIEW
?如果省略了对glMatrixMode(GL\u MODELVIEW)
的最后一次调用,会有什么不同吗 大多数渲染代码都会影响GL\u MODELVIEW
,因为它会影响对象平移和相机位置。但是,调整大小代码在GL\u投影上起作用。程序员可能会假设当前矩阵是他大部分代码中的modelview矩阵,当需要影响另一个矩阵时,他/她会更改矩阵,对其进行更新,然后将目标更改回GL\u modelview
,以便代码的其余部分不会以错误的矩阵为目标
通常,OpenGL函数会影响当前所针对的矩阵,这就是您更改矩阵的原因。如果省略对glMatrixMode(GL\U MODELVIEW)的最后一次调用,会有不同吗?是的,除非您将其放在其他地方。基本上,大多数矩阵操作都是在modelview矩阵上完成的(投影矩阵在每次调整窗口大小时只可设置一次……甚至在每次运行时设置一次),因此您希望modelview矩阵堆栈成为活动矩阵堆栈(即受所有矩阵调用的影响)。这就是为什么趋势是“如果你想修改其他矩阵堆栈,那么打开它,完成你的工作,然后恢复到modelview”。