Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GLSL中的不变和精确关键词_Glsl_Shader_Keyword_Invariants - Fatal编程技术网

GLSL中的不变和精确关键词

GLSL中的不变和精确关键词,glsl,shader,keyword,invariants,Glsl,Shader,Keyword,Invariants,我试图理解这两个概念。我正在阅读的手册对它们非常简短,像多路径算法这样的东西对我来说是新的。我想举一些例子(不是代码),说明我需要在哪里使用不变量或精确变量,只是为了得到一个大致的想法,这样我就可以在不留下任何东西的情况下继续 当他们说 GLSL不保证两个相同的计算以不同的方式进行 着色器将产生完全相同的值 我不知道如何以及何时需要在不同的着色器中进行两次相同的计算。这些关键字是为了避免在不同的着色器中进行稍微不同的计算时出现“开裂”和其他视觉瑕疵 渲染场景是由大量“基本体”(通常是三角形,有时

我试图理解这两个概念。我正在阅读的手册对它们非常简短,像多路径算法这样的东西对我来说是新的。我想举一些例子(不是代码),说明我需要在哪里使用不变量或精确变量,只是为了得到一个大致的想法,这样我就可以在不留下任何东西的情况下继续

当他们说

GLSL不保证两个相同的计算以不同的方式进行 着色器将产生完全相同的值


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

这些关键字是为了避免在不同的着色器中进行稍微不同的计算时出现“开裂”和其他视觉瑕疵

渲染场景是由大量“基本体”(通常是三角形,有时是更复杂的“面片”)组成的,每个“基本体”都经过渲染,累积形成整个图像。当两个基本体相邻时,两个涉及的着色器以完全相同的方式计算边界是至关重要的。如果不是,则浮点舍入可能会导致偶尔出现微小的差异,导致背景漏出并可见的“裂缝”

对于简单的(顶点+片段)着色器设置,使用
invariant
关键字就足够了——您通常在顶点着色器中的顶点位置计算中使用它,也可能用于对舍入具有类似敏感性的其他变量,这可能会导致瑕疵


添加几何体和细分着色器时,情况会变得更糟,因为面片/基本体之间的边界可能是复杂的形状,而不是直线。通常情况下,一个细分着色器将在一个方向上计算边界,而相邻的细分着色器将在另一个方向上计算边界,因此使用完全对称的计算并以两种方式产生完全相同的结果是至关重要的。这就是
precise
关键字发挥作用的地方,通常是在进行ab+cd之类的计算时。使用不能编译为MUL+FMA,但必须为MUL+MUL+ADD的
precise

何时?如果您足够天真,可以使用
EQUALS
测试比较两次传递的深度值。很多人都会犯这样的错误,他们假设两个单独的着色器执行相同的操作,将生成完全相同的值。