OpenGL中为什么有glMatrixMode?

omvjsjqw  于 2022-11-04  发布在  其他
关注(0)|答案(4)|浏览(148)

我只是不明白OpenGL的glMatrixMode是干什么用的。
据我所知,当调用glMatrixMode(GL_MODELVIEW)时,后面跟着glVertexglTranslateglRotate等,即OpenGL命令,将一些对象 * 放置 * 在空间的某个地方。另一方面,如果调用glOrthoglFrustumgluProjection(即放置的对象是如何 * 渲染 * 的),它有一个glMatrixMode(GL_PROJECTION)的先行调用。
我想我到目前为止所写的是一个假设,有人会证明我是错的,但这并不是使用不同 * 矩阵模式 * 的 * 要点 *,因为有不同种类的gl函数:一种是关于放置对象的,另一种是关于如何渲染对象的?

insrf1ej

insrf1ej1#

这个问题很简单,可以非常简短地回答:

  • 渲染顶点(如在glVertex中)取决于被称为**“模型视图矩阵”“投影矩阵”的矩阵的当前状态**;
  • 命令glTranslatefglPushMatrixglLoadIdentityglLoadMatrixglOrthogluPerspective和整个系列影响当前矩阵(其为上述任一个);
  • 命令glMatrixMode选择受上述命令影响的矩阵(模型视图或投影)。

(还有用于纹理坐标的纹理矩阵,但很少使用。)
因此,常见的使用案例是:

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

ma8fv8wu2#

也可以对投影矩阵使用glRotate和glTranslate。
另外:OpenGL支持纹理和颜色的转换。如果激活此功能,您可以修改对象的纹理坐标,而无需每帧重写纹理坐标(慢)。
如果你想在一个对象上滚动纹理,这是一个非常有用的功能。你要做的就是绘制纹理对象,将矩阵模式设置为GL_TEXTURE,然后调用glTranslate来设置纹理的偏移量。

lfapxunr

lfapxunr3#

正如Nils指出的,你对矩阵的了解不仅仅是你提到的。
我想补充几点:

  • OpenGL内核(从3.1开始)完全取消了所有矩阵元素,GL ES 2.0也是如此。这仅仅是因为着色器程序取消了在GL级别显示它们的大部分要求(尽管这仍然是一种便利)。这样,您就只有制服了,而且您必须完全在客户端计算它们的值。
  • 还有更多的矩阵操作入口点,其中一些同样适用于投影/模型视图(glLoadIdentity/glLoadMatrix/glMultMatrix,Push/Pop),如果你想自己执行矩阵计算,它们非常有用(比如说,因为你在应用程序的其他地方需要它们)。
nkoocmlb

nkoocmlb4#

所有几何坐标都要依次进行多次线性变换。虽然任何线性变换都可以用一个矩阵来表示,但通常您需要考虑一个变换序列并编辑该序列,如果您只有一个矩阵,则只能更改该序列的末端。通过提供多个变换步骤,OpenGL在中间提供了几个位置,您也可以在其中更改变换。
在发射几何体之前调用glMatrixMode完全没有效果。在编辑变换矩阵之前调用glMatrixMode,以确定这些编辑在整个序列中出现的位置。
(NB:如果你记得平移和旋转是不可交换的,那么看序列就更有意义了,因为平移改变了旋转的中心。同样,平移和缩放也是不可交换的。)

相关问题