OpenGL中的矩阵堆栈有什么意义?

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

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

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

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

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

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

没有必要 – 您可以自己完成所有自己的矩阵工作并始终调用glLoadMatrix – 但是,也没有必要更换它。 如果您正在使用VBO和显示列表,那么您只会让生活变得困难。

矩阵是您提供的几何(顶点)改变坐标系和投影的机制,最终最终在像素空间中的屏幕上。 因此,在这个意义上,一些矩阵表示不同的坐标系(例如,诸如腿的分层模型的父/子关系),并且一些表示从世界空间到视图空间到设备(像素)空间的变换。 基本上它们是一种机制,通过它您可以操纵顶点,但它们在语义上与诸如此类的操作相对应。 它们堆叠在一起,便于用它们编程。