我正在努力理解这两个概念。我正在阅读的手册对它们非常简短,像多通道算法这样的东西对我来说是新的。我希望有一些例子(而不是代码),说明我需要在哪里使用不变变量或精确变量,这样我就可以在不留下任何东西的情况下继续工作。
当他们说
GLSL不能保证两个相同的计算结果会在不同的着色器中得到完全相同的值。
我不知道如何和何时需要两个相同的计算在不同的着色器。
发布于 2014-04-28 08:22:42
这些关键字是需要的,以避免“破解”和其他视觉伪影,可能产生的计算是轻微不同的在不同的着色器。
渲染的场景是由大量的“原语”(通常是三角形,有时是更复杂的“补丁”)组成的,每个图像都是由累积组成的。如果有两个原语,关键是两个着色器都要以完全相同的方式计算边框。如果没有,那么浮点四舍五入可能会导致事物偶尔有很小的差异,从而导致背景漏出并变得可见的“裂缝”。
对于简单的(vertex+fragment)着色器设置,invariant
关键字就足够了--您通常在计算顶点着色器中的顶点位置时使用它,也可能用于对可能导致工件的四舍五入有类似敏感性的其他变体。
当您添加几何图形和镶嵌着色器时,情况会变得更糟,因为补丁/原语之间的边界可能是复杂的形状,而不是直线。通常情况下,一个图层着色器会在一个方向上计算一个边框,而相邻的一个则在另一个方向上计算边框,所以使用完全对称的计算,并产生相同的结果是非常重要的。这是precise
关键字起作用的地方,通常是当您有像a_b + c_d这样的计算时。对于不能编译为MUL + FMA的precise
,它必须是MUL + MUL + ADD。
https://stackoverflow.com/questions/23345125
复制