我在翻阅橙皮书(第 3 版)时,在第 9 章中发现了一段关于不变限定符的段落。它说:
The 不变的限定符指示编译器并链接到忽略与输出计算不直接相关的表达式和函数。
这段话出现在两个类似的代码片段之后:
uniform mat4 MVPmatrix;
// ...
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
and
uniform mat4 MVPmatrix;
// ...
invariant gl_Position;
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
该书接着指出:
第一种情况可能会或可能不会以完全相同的方式计算变换位置,无论什么不相关的函数或表达式链接到着色器。如果使用多通道算法多次渲染相同的几何体,这可能会导致渲染出现问题。
这让我很困惑。如果a()
绝对不会影响计算变换位置所涉及的变量,那么计算会如何变化? (以及到底如何添加invariant
帮忙吗?)。参考第一句话,“忽略不相关的功能”到底是什么意思?他们只是不被处决吗?
的目的invariant
是为了确保您所做的计算始终会产生相同的结果,无论着色器优化器对着色器执行什么操作(尤其是跨多个着色器编译)。
我发现橙皮书的措辞很差(并且具有误导性,正如您所指出的)。 GLSL 规范(语言 1.2)第 4.6 节更加清晰:
在本节中,方差是指获得的可能性
不同程序中相同表达式的不同值。为了
例如,假设有两个顶点着色器,在不同的程序中,每组
gl_Position 在两个着色器中具有相同的表达式,并且输入
当两个着色器运行时,该表达式中的值是相同的。这是
由于两个着色器的独立编译,有可能
当两个值分配给 gl_Position 的值不完全相同时
着色器运行。在此示例中,这可能会导致对齐问题
多通道算法中的几何形状。一般来说,这样的方差
着色器之间是允许的。当这样的方差不存在时
特定的输出变量,该变量被称为不变的。
它继续解释说invariant
限定符可以保证您避免此问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)