Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 为什么重塑代码以glMatrixMode(GL_MODELVIEW)结尾?_Opengl - Fatal编程技术网

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”。