OpenGL glMatrixMode帮助

时间:2011-03-02 01:58:57

标签: c++ opengl graphics

我开始在OpenGL上做一些工作,我看到很多调用glMatrixMode函数的例子。

根据我收集的内容,将其设置为GL_MODELVIEW或GL_PROJECTION(等)将激活该特定转换矩阵,并且对矩阵转换函数(glTranslatef,glPushMatrix,glLoadIdentity,glLoadMatrix等)的所有后续调用将仅影响活动矩阵

我没有得到的是为什么有3个(在某些情况下为4个)不同的矩阵?我应该使用哪一个? (我可能会得到很多“使用着色器”,但我不能。受学校限制...)我什么时候应该切换并激活不同的矩阵?利用所有这些而不仅仅使用一个有什么好处?

感谢您的帮助:)

4 个答案:

答案 0 :(得分:8)

glMatrixMode不会“激活”矩阵。 OpenGL固定管道使用3个矩阵(有时4个):两个负责转换几何,一个用于转换纹理空间(有些实现用于颜色调整)。这些矩阵一直在使用。

modelview 矩阵用于移动地质测量。由于OpenGL没有“相机”,因此通过移动“相机”移动的相反(=反向)所有几何图形来定位查看器。

投影矩阵用于将几何体从模型视图空间转换为剪辑空间,即它将变换后的几何体投影到视口中。

纹理矩阵转换纹理坐标。在直接给出(s,t,r,q)的情况下,该矩阵的益处首先不清楚。但是OpenGL还允许从顶点位置生成纹理坐标。这与纹理矩阵一起允许实现投影纹理

颜色矩阵很少使用,甚至在所有实现中都不可用(它是扩展的一部分)。如果可用,它会转换传入的顶点颜色。既然没有隐含的颜色生成器那么有什么用呢?嗯,它可以用于在线性颜色空间之间进行转换,例如, RGB-> XYZ或可以表示为标量矩阵的任何其他颜色空间转换。现在没有人使用颜色矩阵,着色器可以更好地完成工作。

glMatrixMode就在那里,所以没有大量的功能。否则你需要:

glModelviewLoadIdentity
glModelviewLoadMatrix
glModelviewMultMatrix
glModelviewRotate
glModelviewTranslate
glModelviewScale
glModelviewPushMatrix
glModelviewPopMatrix

glProjectionLoadIdentity
glProjectionLoadMatrix
glProjectonMultMatrix
glProjectionRotate
glProjectionTranslate
glProjectionScale
glProjectionPushMatrix
glProjectionPopMatrix

等等。此外,您无法在投影和纹理矩阵中使用glFrutum等函数。你也需要其中两个。

最后但并非最不重要的一个重要暗示。设置视口和投影矩阵属于渲染功能。你会看到的大多数教程将它们放在窗口大小调整处理程序中,这是完全错误的地方。不要模仿这个坏习惯。

答案 1 :(得分:5)

如果您使用固定功能管道(即“无着色器”),您将使用所有这些。实际上,您也将它们与着色器一起使用,但在这种情况下您将自己实现它们。

这部分OpenGL起初很难掌握,虽然它实际上非常简单。当您选择特定矩阵时,这不会打开或关闭任何内容。它所做的就是使像glTranslatef这样的函数与你选择的一个特定矩阵一起工作。

OpenGL以这种方式工作(除了直接状态访问),例如使用纹理和缓冲区,以相同的方式。

编辑:至于为什么有几个矩阵,他们都做不同的事情。你的模型通常在他们的“自己的空间”,这意味着他们需要以某种方式转移到“世界”,通过适当地缩放它们并将它们转换到正确的位置。然后,所有事物(整个“世界”)都需要根据您的“眼睛位置”进行转换,并且必须将其转换为“标准化”剪辑空间,因为这就是硬件如何以最有效的方式实现的方式等等。

所有这些矩阵通常相乘(你不知道会发生这种情况)。
如果你想要 opengl转换管道,那么你将获得很多很好的资源来解释会发生什么详细内容,例如this

或者,阅读规范(在opengl.org免费提供),它包含非常明确的(在我看来很容易)有关如何看待所有看似复杂的矩阵内容的信息。

答案 2 :(得分:1)

您可能只使用glMatrixMode(GL_PROJECTION)一次,然后使用gluPerspective()(或者glOrtho()),这样您就可以设置投影的完成方式。一旦设定,改变观点并不常见。

然后你改为GL_MODELVIEW,只是用它来旋转/翻译/缩放周围的东西。两个矩阵都用于渲染,屏幕上的最终位置= GL_PROJECTION * GL_MODELVIEW *你的顶点。但由于GL_MODELVIEW的变化频率应远高于GL_PROJECTION,因此它们会被规范分开。

答案 3 :(得分:0)

这是因为矩阵乘法不是可交换的。如果你只有一个矩阵模式,那么新的转换将始终在所有现有的转换之后发生,并且这并不总是可取的。

通过保持几个矩阵有效地为每个几何体相乘,可以例如具有平移以呈现对象的不同位以及视点转换,并且能够彼此独立地调整它们。