我只是不明白OpenGL的glMatrixMode
是什么。
据我所知,当调用glMatrixMode(GL_MODELVIEW)
时,它就是
之后是glVertex
,glTranslate
,glRotate
等,
也就是说,OpenGL命令将放置某些对象
空间。另一方面,如果glOrtho
或glFrustum
或gluProjection
被调用(即放置的对象如何呈现),它有一个glMatrixMode(GL_PROJECTION)
的前调用。
我想我到目前为止所写的是一个有人会证明的假设 我错了,但不是完全使用不同的矩阵模式的点 因为有不同类型的gl函数:那些与...有关的函数 放置对象以及如何渲染对象的对象?
答案 0 :(得分:21)
这很简单,可以简单回答:
渲染顶点(如glVertex
中所示)取决于称为“model-view matrix”和的矩阵的当前状态投影矩阵“,
命令glTranslatef
,glPushMatrix
,glLoadIdentity
,glLoadMatrix
,glOrtho
,gluPerspective
以及整个家庭影响当前矩阵(上述任何一种),
命令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
,以确定这些编辑在整个序列中的位置。
(注意:如果您记得翻译和旋转不是可交换的,那么查看序列会更有意义,因为翻译会改变旋转中心。同样,翻译和缩放也不是可交换的。)