对抗锯齿方法做了一些研究,我偶然发现了这段代码(从Nvidia的FXAA着色器中获取):
if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
有没有充分的理由不能写成以下内容?
if (!pairN) {
lumaN = lumaS;
gradientN = gradientS;
lengthSign *= -1.0;
}
我认为这是某种优化?看起来真的违反直觉...
答案 0 :(得分:5)
GLSL编译器转换此代码是微不足道的:
if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
进入这个无分支代码:
lumaN = pair ? lumaN : lumaS;
gradientN = pair ? gradientN : gradientS;
lengthSign *= pair ? 1.0 : -1.0;
它在无意义上可以表示为:
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;
这对移动GPU来说是一种有效的优化。
自动优化整个if
块并非易事。