使用可编程管道,我可以轻松地计算出模型和视图分离的结果,并且它可以简化我正在制作的引擎中的相机对象的工作。然而,我想知道为什么他们首先不是分开的。 我在另一个stackoverflow问题中读到,较少的矩阵意味着较少的乘法,但是当我调用GL.Translate()时它们首先成倍增加,所以这似乎不会成倍增加。 在我花费时间完成这项工作之前,然后几天后注意它会导致问题,我必须重写我的一半代码,为什么它们不会在固定功能管道中分开?
答案 0 :(得分:2)
他们基本上在管道中占据相同的位置,因此有必要尽早组合它们。如果没有这些计算,你很难进行计算。性能优势是每个绘制调用可以将矩阵相乘一次,而不是顶点着色器中的每个顶点。最后,最后一个优点是提交绘图调用时带宽+制服较少。
如果你真的需要将两者分开,你可以在自己的着色器中完成。
答案 1 :(得分:2)
您的问题突出了OpenGL(和Direct3D)切换到可编程管道的确切原因之一。答案总是取决于你想要达到的目标。哎呀,在非常简单的程序中,您可以组合投影,模型和视图矩阵。在相当复杂的引擎中,您需要尽可能多的单独矩阵用于照明等等。
所以,真正的答案是它不再重要了。根据需要使用尽可能多的矩阵。
答案 2 :(得分:1)
这听起来是正确的......在固定功能管道中将两个矩阵合二为一,这在历史上意味着OpenGL在绘制片段的过程中有一个较少的坐标空间可以翻译。矩阵乘法和存储现在相当便宜,但IrisGL和OpenGL可以追溯到80年代/ 90年代。
在可编程管道中使用单独的模型和视图矩阵绝对不会遇到任何麻烦。你可以通过可编程管道向窗口抛出很多约定;线性Z缓冲,反转深度范围等......
你不会破坏像剪切这样的东西,因为这是使用顶点着色器的输出发生的,即使你通过乘以三个矩阵而不是两个矩阵,它应该已经在剪辑空间中。