6

我正在阅读 OpenGL Superbible Fifth Edition,他们通过自己的课程讨论使用堆栈。这一切都很好,但他们提到矩阵堆栈已被弃用。为什么它们被弃用,人们用什么代替它们?

4

4 回答 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 一起使用。

于 2012-07-18T00:52:00.607 回答
2

为什么他们被弃用

因为没有人真正在现实世界的 OpenGL 程序中使用它。以物理模拟为例:无论如何,您会将所有对象放置作为 4×4 矩阵存储在物理系统中。所以你就用那个。可见对象确定和动画系统也是如此。无论如何,所有这些都需要实现矩阵数学,因此在 OpenGL 中使用它是相当多余的,因为大多数时候已经存在的矩阵只是简单地放入glLoadMatrix.

人们用什么来代替它们?

他们以前使用的:他们的动画系统、物理模拟器、场景图等。

于 2012-07-17T23:42:50.507 回答
2

Matrix Stack(和其余的矩阵函数)仅在核心配置文件中被弃用。在兼容性配置文件中,您应该仍然可以使用它们。

从我的角度来看,它已被删除,因为大多数引擎/框架都有自定义数学代码和着色器统一样式,用于将矩阵发送到着色器。

尽管对于简单的程序/教程,使用和搜索其他内容非常不方便。

我建议使用:

于 2012-07-17T07:41:15.877 回答
1

对我来说,第一个也是主要原因是随着可编程着色器的兴起(在第三版 opengl 之后是强制性的),所有自动传输到着色器的变量,例如 GL_PROJECTION 和 GL_MODELVIEW 都从着色器中删除,因此用户必须定义​​自己的矩阵才能在着色器中使用它。由于您必须使用 Uniform 函数手动发送矩阵,因此您不再需要固定变量。

于 2012-07-17T10:44:06.200 回答