在片段着色器中,哪些可能更快?
vec3 val = vec3(0);
if (bool(uform)) {
val = texture(tex, texcoord).rgb;
}
或
vec3 val = texture(tex, texcoord).rgb * uform;
" UFORM"是一个int,它将是0或1。
我一直在使用第一个,但我已经多次听到应该避免分支。在我的系统上,(nvidia 680)我无法真正注意到两者之间的差异,但在最近的系统中,哪一个可能会更快?
答案 0 :(得分:1)
着色器编译器可以自由地优化第一个
vec3 val = texture(tex, texcoord).rgb * sign(abs(uform));
也是无分支的。但是不能保证这样做。
因此,在充分优化的驱动程序上,差异将是最小的。
虽然一些编译器可以优化流程,但它完全依赖于制服。将会发生的事情是,驱动程序将重新编译并重新优化程序,并且内联所有制服。这通常会消除分支,但完全是实现定义。