opengl-es 着色器语言 if 语句 vs?

opengl-es shader language if statement vs?

我读到在片段着色器中不应使用 if 语句,因为它们会降低性能。然而我在片段着色器中发现了这个

gl_FragColor.a = (gl_FragColor.a > uAlphaThreshold) ? gl_FragColor.a : 0.0;

我认为是这个意思

if(gl_FragColor.a > uAlphaThreshold){
     gl_FragColor.a = 0.0
}

原来的说法是否给你带来了性能提升?

您的条件运算符 (?:) 扩展为:

if(gl_FragColor.a > uAlphaThreshold){
     gl_FragColor.a = gl_FragColor.a; // will be probably optimized out
}
else {
     gl_FragColor.a = 0.0;
}

所以答案是:没有性能提升,只是写相同代码的两种方式。

我怀疑会有很大的不同。它们只是两种不同的表示法,但在任何一种情况下都是一个分支。

不过,您问题中的两个陈述相同。相当于:

gl_FragColor.a = (gl_FragColor.a > uAlphaThreshold) ? gl_FragColor.a : 0.0;

是:

if (gl_FragColor.a <= uAlphaThreshold){
    gl_FragColor.a = 0.0
}

请注意与您的代码相比不同的比较运算符。使用三元运算符,如果条件为真,则使用第一个值 (gl_FragColor.a),如果条件为假,则使用第二个值 (0.0)。所以你需要在把它变成if语句时反转条件。

如果你想避免分支,你可以使用内置的 step() 函数:

gl_FragColor.a = step(uAlphaThreshold, gl_FragColor.a) * gl_FragColor.a;