GLSL/HLSL - 与单个块相对的多个单行条件语句

Fau*_*ult 6 opengl boolean-logic gpu glsl hlsl

对抗锯齿方法做了一些研究,我偶然发现了这段代码(从Nvidia的FXAA着色器中抓取):

if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
Run Code Online (Sandbox Code Playgroud)

是不是有一个很好的理由不是作为以下内容写的?

if (!pairN) {
    lumaN = lumaS;
    gradientN = gradientS;
    lengthSign *= -1.0;
}
Run Code Online (Sandbox Code Playgroud)

我认为这是某种优化?看起来真的违反直觉......

Ser*_* K. 5

GLSL编译器转换此代码是微不足道的:

if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
Run Code Online (Sandbox Code Playgroud)

进入这个无分支代码:

lumaN = pair ? lumaN : lumaS;
gradientN = pair ? gradientN : gradientS;
lengthSign *= pair ? 1.0 : -1.0;
Run Code Online (Sandbox Code Playgroud)

从某种意义上说它是无分支的,它可以表示为:

float a = float( pair );
float b = 1.0 - a;
lumaN = a * lumaN + b * lumaS;
gradientN = a * gradientN + b * gradientS;
lengthSign *= a * 1.0 + b * -1.0;
Run Code Online (Sandbox Code Playgroud)

这在移动GPU上是有效的优化.

自动优化整个if块并不是那么简单.