为什么OpenGL中有glMatrixMode?

时间:2010-12-30 21:54:00

标签: opengl

我只是不明白OpenGL的glMatrixMode是什么。

据我所知,当调用glMatrixMode(GL_MODELVIEW)时,它就是 之后是glVertexglTranslateglRotate等, 也就是说,OpenGL命令将放置某些对象 空间。另一方面,如果glOrthoglFrustumgluProjection 被调用(即放置的对象如何呈现),它有一个glMatrixMode(GL_PROJECTION)的前调用。

我想我到目前为止所写的是一个有人会证明的假设 我错了,但不是完全使用不同的矩阵模式 因为有不同类型的gl函数:那些与...有关的函数 放置对象以及如何渲染对象的对象?

4 个答案:

答案 0 :(得分:21)

这很简单,可以简单回答:

  • 渲染顶点(如glVertex中所示)取决于称为“model-view matrix”的矩阵的当前状态投影矩阵“

  • 命令glTranslatefglPushMatrixglLoadIdentityglLoadMatrixglOrthogluPerspective以及整个家庭影响当前矩阵(上述任何一种),

  • 命令glMatrixMode 选择受上述命令影响的矩阵(模型 - 视图或投影)。

(另外,还有用于纹理坐标的纹理矩阵,但它很少使用。)

所以常见的用例是:

  • 大部分时间都有模型视图矩阵,
  • 每当你必须初始化投影矩阵时(通常在开始时或者调整窗口大小时),将活动切换到投影,设置透视,然后恢复到模型视图。

答案 1 :(得分:4)

您也可以将glRotate和glTranslate用于投影矩阵。

另外:OpenGL支持纹理和颜色的变换。如果激活此功能,则可以修改对象的纹理坐标,而无需每帧重写纹理坐标(慢)。

如果要在对象上滚动纹理,这是一个非常有用的功能。您需要做的就是绘制纹理对象,将矩阵模式设置为GL_TEXTURE并调用glTranslate将偏移设置为纹理。

答案 2 :(得分:3)

正如Nils指出的那样,你所拥有的矩阵比你提到的更多。

我会添加一些想法:

  • OpenGL核心(从3.1开始)完全消除了所有矩阵内容,GL ES 2.0也是如此。这仅仅是因为着色器程序消除了将它们暴露在GL级别的大部分要求(尽管如此,它仍然是一种便利)。然后你只有制服,你必须在客户端完全计算它们的价值。

  • 与您提到的相比,矩阵操作入口点更多。其中一些同样适用于投影/模型视图(glLoadIdentity / glLoadMatrix / glMultMatrix,Push / Pop),如果您想自己执行矩阵计算(比如因为您需要在应用程序中的其他位置使用它们),它们非常有用。

答案 3 :(得分:2)

所有几何坐标都按顺序进行多次线性变换。虽然任何线性变换都可以用单个矩阵表示,但通常您需要考虑一系列变换并编辑序列,如果只有一个矩阵,则只能更改该序列的末尾。通过提供几个转换步骤,OpenGL为您提供了几个可以改变转换的位置。

在发射几何体之前调用glMatrixMode根本没有效果。在编辑变换矩阵之前调用glMatrixMode,以确定这些编辑在整个序列中的位置。

(注意:如果您记得翻译和旋转不是可交换的,那么查看序列会更有意义,因为翻译会改变旋转中心。同样,翻译和缩放也不是可交换的。)