所以我在翻阅橙皮书(第 3 版)时偶然发现了第 9 章中关于不变限定符的一段话。它说:
invariant限定符指示编译器并链接到忽略与输出计算不直接相关的表达式和函数。
这段代码出现在两个类似的代码片段之后:
uniform mat4 MVPmatrix;
// ...
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
和
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
帮助呢?)。参考第一句话,“忽略不相关的功能”到底是什么意思?他们只是没有被处决吗?