【问题标题】:Why is there a glMatrixMode in OpenGL?为什么OpenGL中有一个glMatrixMode?
【发布时间】:2010-12-30 21:54:00
【问题描述】:

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

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

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

【问题讨论】:

  • 请注意,这已经被弃用了,你应该只使用着色器和显式制服,从 OpenGL 3.1 开始。例如,OpenGL ES 2.0 根本不支持 glMatrixMode() 和类似的。 (当然,除非你有很多代码可以做到这一点和/或需要支持旧的硬件/驱动程序。)
  • glVertex 应该被认为从 OpenGL 1.0 开始已被弃用。 :)
  • 当您提到不推荐使用的东西时,还请提及现代替代品是什么,因为没有它提供的信息不多。
  • @Kos 来自 OpenGL 1.1。第一个替代方案——glDrawArrays——仅在那时出现。

标签: opengl


【解决方案1】:

这个很简单,可以很简短地回答:

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

  • 命令glTranslatefglPushMatrixglLoadIdentityglLoadMatrixglOrthogluPerspective 和整个家庭影响当前矩阵(要么以上),

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

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

所以常见的用例是:

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

【讨论】:

  • 每次通过完整的显示通道时,您都应该重新设置(即重新设置新的)投影矩阵。无论如何,对于任何现实世界的应用程序,您都必须使用几种不同的投影。例如,要在游戏中渲染 HUD,您将使用其他投影,而不是场景本身。除了获取上下文之外,OpenGL 不知道“初始化”,所以请忘记在某处做一次性的事情,或者在重塑处理程序中设置投影的愚蠢模式。
  • @datenwolf - 是的,但是在 2D 叠加的投影矩阵上 push/popMatrix 也能正常工作,所以差别不大。
  • 奇怪的是,我无法想象 glOrthogluPerspective 可以用于投影矩阵之外的任何其他东西,以及用于投影的glTranslateglRotate 和其他变换矩阵,那么为什么设置投影的函数不在内部选择投影矩阵呢?我猜,它会为用户省去一些头疼的问题,并且更防白痴。可以在任一矩阵上调用的函数仍然可以像以前一样使用模式选择。
  • 此视频有助于理解模型-视图-投影矩阵的直观表示。 youtube.com/watch?v=uQNU5XICGvw
【解决方案2】:

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

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

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

【讨论】:

  • 此外,投影纹理矩阵可用于阴影和投影纹理(舞台聚光灯、前灯、迪斯科、电影放映机等)...
【解决方案3】:

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

我会补充一些想法:

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

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

【讨论】:

  • “消除所有这些矩阵的东西”并不准确。矩阵乘法仍然是对顶点坐标应用变换的方式。不同之处在于它不再是流水线中的固定功能,而是完全由可编程着色器控制。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多