OpenGL - 矩阵堆栈为什么被移除,现在人们使用什么?

6

我正在阅读《OpenGL超级宝典第五版》,他们讨论使用自己的类来使用堆栈。这很好,但是他们提到矩阵堆栈已经被弃用。为什么被弃用了?人们现在使用什么代替它们呢?

4个回答

9
原因是政治而非技术上的,可以追溯到2000年代初。
OpenGL 3是第一个愿意打破向后兼容性的版本。设计师想要为专家用户、游戏程序员和高端可视化编码人员创建一个API,他们都知道着色器,并且编写自己的矩阵代码。设计者的意图是OpenGL 3 API应该与实际硬件非常接近。(即使在OpenGL 1/2中,矩阵堆栈通常是在CPU侧而不是GPU侧实现的。)
从游戏引擎程序员的角度来看,这是更好的。如果你每隔几年就必须开发一个新的游戏引擎,那么放弃旧代码有什么大不了的呢?
这个设计过程的结果就是OpenGL 3/4核心配置文件。
一旦“新一代”OpenGL被宣布,所有的不太专业的编码人员(包括我)在大学和公司里意识到他们将会受到影响。这些人教授3D图形或编写用于研究或设计的实用程序。我们不需要比普通的环境-漫反射-高光更先进的光照。我们经常不得不混合来自不同来源的代码,只有当每个人都使用完全相同的矩阵、光照和纹理约定时,这才容易 - 就像OpenGL 2提供的那样。
此外,我听说但无法验证,大型CAD/CAM公司也意识到他们将会受到影响。当你有付费客户(而且是高价:比较Quadro与GeForce或FireGL与Radeon的价格)时,放弃经过十年开发的200万行代码不是一个选项。
因此,NVIDIA和ATI都宣布他们将尽可能长时间地支持旧API。
这种压力的结果就是兼容性配置文件。OpenGL ARB现在似乎已经意识到,虽然他们希望每个人都切换到核心配置文件,但这只是不可能的:阅读OpenGL 4中曲面细分着色器的扩展规范,它提到GL_PATCHES将与glBegin一起使用。

谢谢。很遗憾政治也影响了软件发布和开发。 - Satchmo Brown

2
矩阵堆栈(以及其他矩阵函数)仅在核心配置文件中被弃用。在兼容性配置文件中,您仍然可以使用它们。
从我的角度来看,这是因为大多数引擎/框架都有自定义的数学代码和着色器统一风格来发送矩阵到着色器。
尽管对于简单的程序/教程来说,使用它们非常不方便,需要寻找其他替代方法。
我建议使用:
- glm (http://glm.g-truc.net/) - 非常简单的数学库 (vsml)

2
为什么它们被弃用了?
因为在实际的OpenGL程序中,没有人真正使用它。以物理模拟为例:所有对象的位置都将存储在物理系统中作为4×4矩阵。所以你只需要使用那个。对于可见对象的确定和动画系统也是如此。所有这些都需要实现矩阵数学,因此在OpenGL中拥有它们相当冗余,因为大多数时候已经存在的矩阵简单地放入glLoadMatrix中。
人们使用什么代替它们?
他们使用之前的东西:他们的动画系统、物理模拟器、场景图等。

1

对我来说,第一个和主要的原因是随着可编程着色器的兴起(在OpenGL的第3个版本之后成为强制性),所有变量,如GL_PROJECTION和GL_MODELVIEW,自动传输到着色器中的变量都被删除了,所以用户必须定义自己的矩阵以在着色器中使用。由于您必须使用Uniform函数手动发送矩阵,因此您实际上不再需要固定变量。


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