OpenGL(我们在这里讨论的古代版本)提供了多个矩阵堆栈:ModelView,Projection(和其他一些)。主要区别在于,在计算照明和之后投影之前应用ModelView。同 glMatrixMode 可以打开下一个命令将运行的矩阵堆栈。阅读更多关于矩阵堆栈的信息 这个问题 。
glMatrixMode
这是因为这两种方法( switch_to_perspective_mode 和 switch_to_parallel_mode )将设置投影矩阵,最可能是正投影或透视投影。由于它们应该应用于投影矩阵堆栈,因此必须事先切换到它。
switch_to_perspective_mode
switch_to_parallel_mode
很可能是因为下一个命令想要在ModelView矩阵上运行。
我们使用的最常见的是MVP,它是模型 - 视图 - 投影矩阵。在这种情况下,只有2个矩阵 GL_MODELVIEW 包含模型和视图组件。
GL_MODELVIEW
这背后的想法:
(0,0,0)
lookAt
glOrtho
glFrustum
所以投影矩阵很少甚至从不更新(第一次除外)。如果“用户”移动,即使在每一帧上,视图矩阵也可能经常变化。但是模型矩阵将不断更新,就像绘制的每个模型一样,甚至更频繁地(每个模型的每个部分)。
所以代码的作用是:
if
一切都在这里完全有道理,但最后一个对你来说可能有点奇怪。虽然不清楚,但我打赌原因是程序期望它总是修改模型视图矩阵。因此,每当选择另一个矩阵模式时,预期该操作将恢复为模型视图矩阵。
原因是(如上所述)模型 - 视图矩阵将更新很多次,而投影则不会。如果没有模块可以说明它当前正在更新哪个矩阵,则在更新模型矩阵之前调用 glMatrixMode(GL_MODELVIEW) 应该做。这意味着对于绘制的每个模型,我们应该调用此行以确保设置正确的设置。这是一个巨大的冗余,并期望将模型矩阵设置为矩阵模式获得一些性能。
glMatrixMode(GL_MODELVIEW)