OpenGL中矩阵堆栈的意义何在?

Posted

技术标签:

【中文标题】OpenGL中矩阵堆栈的意义何在?【英文标题】:What is the point of the matrix stack in OpenGL? 【发布时间】:2010-09-20 22:32:09 【问题描述】:

我为什么要使用 OpenGL 的矩阵堆栈(而不是包装我自己的矩阵类并只使用它)?我不太确定为什么这么简单的任务会如此复杂。它有什么特殊用例吗?

如果没有必要,有什么好的替代品?

【问题讨论】:

【参考方案1】:

OpenGL 的矩阵堆栈(有多个 - 每个矩阵模式一个)旨在与分层模型一起使用。也就是说,您可以定义子对象(例如,车轮)相对于其父主体(例如,汽车)的装配,而无需考虑绘制子对象时父对象的位置/方向。也就是说,它允许您轻松直观地组合变换。

matix 堆栈(以及一般的 GL 矩阵运算)不能替代通用矩阵数学库。它们的存在只是为了允许将组合变换有效地应用于顶点数据。正如其他人所说,随着固定功能管道的消亡,此功能已从 OpenGL 中删除,因为着色器程序的需求不如旧管道的需求统一。

【讨论】:

【参考方案2】:

矩阵栈用于连接矩阵。通常用于层次模型,其中转换是相对于另一个表示的。可以在堆栈上加载一个矩阵并转换该空间中的顶点,然后通过弹出堆栈返回父空间。您可以自己在代码中管理所有这些,而且您通常更愿意这样做 - 特别是在矩阵用于除简单绘图之外的其他事情或您经常访问它们的情况下。动画系统就是一个典型的例子。

【讨论】:

【参考方案3】:

您将主要使用内置矩阵堆栈,因为 OpenGL 会自动应用它们。它们已在最新版本的 OpenGL 中被删除,因此至少有一些人显然认为它们是不必要的。就个人而言,我认为这是一个糟糕的决定,但生活就是这样。另一种方法是自己实现它们——唯一的安慰是,对于大多数 3D 图形的使用,你通常必须自己做一些矩阵乘法(等等),所以它通常不会产生很多区别。

【讨论】:

只是一个小问题:如何在没有矩阵堆栈的情况下将我的矩阵应用(?)到每一帧的场景中? @Clark:在这种情况下,您通常会将当前的转换矩阵设置为 uniform s,然后在顶点着色器中“应用”它们,例如:uniform mat4 projection; uniform mat4 model_view; in vec4 vertex; gl_Position = projection*model_view*vertex; 您可能还想要看 GLM:glm.g-truc.net.【参考方案4】:

没有必要——你可以自己做所有的矩阵工作并一直调用 glLoadMatrix——但也没有必要替换它。如果您使用 VBO 和显示列表,只会让生活变得困难。

【讨论】:

【参考方案5】:

矩阵是您提供的几何体(顶点)改变坐标系和投影的机制,最终以像素空间的形式出现在屏幕上。所以从这个意义上说,一些矩阵代表不同的坐标系(例如,腿等层次模型的父/子关系),一些矩阵代表从世界空间到视图空间到设备(像素)空间的转换。基本上它们是一种机制,您可以通过它来操纵顶点,但它们在语义上对应于诸如那些的操作。它们以堆栈形式出现,以便于使用它们进行编程。

【讨论】:

以上是关于OpenGL中矩阵堆栈的意义何在?的主要内容,如果未能解决你的问题,请参考以下文章

openGl 重塑函数

与OpenGL中的martix堆栈混淆?

OpenGL 3.2 设置矩阵的麻烦

如何避免 OpenGL 中的光旋转?

共享内存架构中的 OpenGL (ES 2.0) VBO 性能

OpenGL glMatrixMode() 函数解释与例子