OpenGL中矩阵堆栈的作用是什么?

7

为什么我要使用OpenGL的矩阵堆栈(而不是封装自己的矩阵类并直接使用)?我不太确定为什么这对于如此简单的任务来说如此复杂。是否有一些特殊用例需要它?

如果不必要,有什么好的替代方案吗?

5个回答

14

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

矩阵堆栈(以及GL矩阵操作)并不能替代通用的矩阵数学库。它们仅仅存在于允许组合变换应用于顶点数据的效率。正如其他人所说,随着固定管线的消亡,这种功能已经从OpenGL中移除,因为着色器程序的需求不如旧的管线那么统一。


4

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


3

你大多数情况下会使用内置矩阵堆栈,因为OpenGL会自动应用它们。它们在最近的OpenGL版本中已被删除,所以至少有一些人认为它们是不必要的。个人认为那是一个不好的决定,但生活就是这样。另一种选择是自己实现它们--唯一的安慰是对于大多数三维图形的使用,你通常都需要自己进行一些矩阵乘法(等等)运算,所以经常没有太大的区别。


只是一个小问题:如果没有矩阵堆栈,我如何在每个帧中将我的矩阵应用于场景? - Clark Gaebel
1
@Clark:在这种情况下,您通常会将当前的转换矩阵设置为“uniform”,并在顶点着色器中“应用”它们,类似于:uniform mat4 projection; uniform mat4 model_view; in vec4 vertex; gl_Position = projection*model_view*vertex; 您还可以查看GLM:http://glm.g-truc.net/. - Jerry Coffin

1

这并不是必须的 - 你可以自己完成所有矩阵工作并随时调用glLoadMatrix - 但是,如果你正在使用VBO和显示列表,替换它并不是必要的。这只会让生活变得更加困难。


0

矩阵是几何图形(顶点)在不同坐标系和投影下的机制,最终以像素空间的形式呈现在屏幕上。因此,在某种意义上,一些矩阵代表不同的坐标系(例如,分层模型(如腿)的父/子关系),而一些则代表从世界空间到视图空间到设备(像素)空间的变换。基本上,它们是一种让您的顶点被操作的机制,但它们在语义上对应于这些操作。它们以堆栈的形式出现,使得编程更加容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接