为什么OpenGL中有glMatrixMode?

为什么OpenGL中有glMatrixMode?,opengl,Opengl,我只是不明白OpenGL的glMatrixMode是做什么用的 就我所见,当调用glMatrixMode(GL\u MODELVIEW)时,它 然后是glVertex,glTranslate,glRotate等等, 也就是说,OpenGL命令将某些对象放置在 空间。另一方面,如果glOrtho或glFrustum或gluProjection 调用(即如何渲染放置的对象),它前面有一个调用glMatrixMode(GL\u投影) 我想我到目前为止写的是一个假设,有人会证明这一点 我错了,但使用不同

我只是不明白OpenGL的
glMatrixMode
是做什么用的

就我所见,当调用
glMatrixMode(GL\u MODELVIEW)
时,它 然后是
glVertex
glTranslate
glRotate
等等, 也就是说,OpenGL命令将某些对象放置在 空间。另一方面,如果
glOrtho
glFrustum
gluProjection
调用(即如何渲染放置的对象),它前面有一个调用
glMatrixMode(GL\u投影)

我想我到目前为止写的是一个假设,有人会证明这一点 我错了,但使用不同的矩阵模式并不是重点 因为有不同种类的gl函数:与
放置对象以及对象的渲染方式?

所有几何体坐标都会按顺序进行几次线性变换。虽然任何线性变换都可以用一个矩阵来表示,但通常需要考虑变换序列并编辑序列,如果只有一个矩阵,则只能更改该序列的端点。通过提供几个转换步骤,OpenGL为您在中间提供了几个可以更改转换的地方。

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


(注意:如果您记住平移和旋转是不可交换的,那么查看序列会更有意义,因为平移会改变旋转的中心。类似地,平移和缩放也是不可交换的。)

您也可以对投影矩阵使用glRotate和glTranslate

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


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

正如Nils所指出的那样,您对矩阵的了解远不止您所提到的

我将补充一些想法:

  • OpenGLCore(从3.1开始)完全删除了所有矩阵内容,GLES2.0也是如此。这仅仅是因为着色器程序取消了在GL级别公开它们的大部分要求(尽管这仍然很方便)。然后你只有制服,你必须完全在客户端计算它们的价值

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


    • 这很简单,可以非常简单地回答:

      • 渲染顶点(如
        glVertex
        )取决于称为“模型视图矩阵”和“投影矩阵”的矩阵的当前状态

      • 命令
        glTranslatef
        glPushMatrix
        glLoadIdentity
        glLoadMatrix
        glorthoo
        glupspective
        和整个系列都会影响当前矩阵(即上述任一项)

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

      (此外,还有用于纹理坐标的纹理矩阵,但使用较少。)

      因此,常见的用例是:

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

      请注意,这一点现在已被弃用,从OpenGL 3.1开始,您应该只使用着色器和显式制服。例如,OpenGL ES 2.0根本不支持glMatrixMode()和类似的功能。(当然,除非你有很多这样做的代码和/或需要支持旧的硬件/驱动程序。)和
      glVertex
      应该被视为OpenGL 1.0以上版本的弃用版本当你提到一些不推荐使用的东西时,请同时提到什么是现代的替代品,因为如果没有它,它就没有太多的信息。@Kos来自OpenGL 1.1。第一个备选方案-
      glDrawArrays
      -仅在那时出现。此外,投影纹理矩阵与阴影和投影纹理(舞台聚光灯、前照灯、迪斯科舞厅、电影放映机等)一起使用。每次通过完整的显示过程时,您都应该重新设置(即重置新的)投影矩阵。对于任何实际应用程序,您都必须使用几种不同的投影。例如,在游戏中渲染HUD时,除了场景本身,您还可以使用其他投影。OpenGL除了获取上下文外不知道“初始化”,所以请忘记在某个地方做一次性的事情,或者在重塑处理程序中设置投影的愚蠢模式。@datenwolf-True,但是二维覆盖投影矩阵上的push/popMatrix也可以工作,奇怪的是,我无法想象
      glOrtho
      glperspective
      除了投影矩阵和
      glTranslate
      glRotate
      &其他变换之外,还能用什么