4

我试图理解这两个概念。我正在阅读的手册对它们非常简短,并且多通道算法之类的东西对我来说是新的。我想提供一些示例(不是代码),说明我需要在哪里使用不变量或精确变量,只是为了得到一个大致的想法,这样我就可以继续下去而不会留下任何东西。

当他们说

GLSL 不保证不同着色器中的两个相同计算将产生完全相同的值

我不知道如何以及何时需要在不同的着色器中进行 2 次相同的计算。

4

1 回答 1

9

需要这些关键字来避免“开裂”和其他视觉伪影,这些伪影可能是由于在不同着色器中的计算方式略有不同而产生的。

渲染的场景是由大量的“原语”组成的——每一个被渲染的小块图像(通常是三角形,有时更复杂的“补丁”),累积构成整个图像。在两个基元邻接的地方,所涉及的两个着色器以完全相同的方式计算边界至关重要。如果不是,那么浮点舍入可能会导致事物偶尔有微小的差异,从而导致背景泄漏并变得可见的“裂缝”。

对于简单的(顶点+片段)着色器设置,invariant关键字就足够了——您通常将它用于计算顶点着色器中的顶点位置,并且可能用于对可能导致伪影的舍入具有相似敏感性的其他变量。

当您添加几何和镶嵌着色器时,情况会变得更糟,因为补丁/基元之间的边界可能是复杂的形状而不是直线。通常情况下,一个曲面细分着色器将在一个方向上计算边界,而相邻的着色器在另一个方向上计算边界,因此使用完全对称的计算并在两个方向上产生位相同的结果是至关重要的。这就是precise关键字发挥作用的地方,通常是当您进行 a b + c d 之类的计算时。precise不能将其编译为 MUL + FMA,而必须改为 MUL + MUL + ADD 。

于 2014-04-28T16:22:42.277 回答