2

使用可编程管道,我可以轻松地计算模型和视图分离的结果,并且可以简化在我正在制作的引擎中使用相机对象的工作。然而,我想知道为什么它们一开始就不分开。我在另一个 stackoverflow 问题中读到,更少的矩阵意味着更少的乘法,但是一旦我调用 GL.Translate(),它们就会首先被乘以,所以这似乎并不成立。在我最终花时间解决这个问题之前,几天后注意到它会导致问题并且我必须重写我的一半代码,为什么它们不在固定函数管道中分离?

4

3 回答 3

2

它们本质上确实在管道中占据了相同的位置,因此尽早将它们组合起来是有意义的。如果没有它们的结合,您很少会不想执行计算。一个性能优势是矩阵可以在每次绘制调用时相乘一次,而不是在顶点着色器中按每个顶点相乘。最后,最后一个优点是提交绘制调用时带宽+制服更少。

如果您真的需要将两者分开,您可以在自己的着色器中执行此操作。

于 2013-05-26T23:03:51.243 回答
2

您的问题突出了 OpenGL(和 Direct3D)切换到可编程管道的确切原因之一。答案始终取决于您要达到的目标。哎呀,在非常简单的程序中,您可以组合投影、模型和视图矩阵。在相当复杂的引擎中,您需要尽可能多的单独矩阵用于照明等。

所以,真正的答案是它不再重要了。根据需要使用尽可能多的矩阵。

于 2013-05-26T23:04:02.250 回答
1

这听起来是对的……在固定功能管道中将两个矩阵合并为一个从历史上看意味着 OpenGL 在绘制片段的过程中可以少一个坐标空间来转换。如今,矩阵乘法和存储相当便宜,但 IrisGL 和 OpenGL 可以追溯到 80 年代/90 年代。

在可编程管道中使用单独的模型和视图矩阵绝对不会遇到任何麻烦。您可以使用可编程流水线随意抛弃很多约定;线性 Z 缓冲区、倒置深度范围等...

你不会破坏任何像裁剪这样的东西,因为这是使用顶点着色器的输出发生的,即使你通过乘以三个矩阵而不是两个矩阵到达那里,它也应该已经在裁剪空间中。

于 2013-05-26T23:09:30.560 回答