在统一vs纹理查找上分支

时间:2014-11-21 10:52:21

标签: opengl glsl

在片段着色器中,哪些可能更快?

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)我无法真正注意到两者之间的差异,但在最近的系统中,哪一个可能会更快?

1 个答案:

答案 0 :(得分:1)

着色器编译器可以自由地优化第一个

vec3 val = texture(tex, texcoord).rgb * sign(abs(uform));

也是无分支的。但是不能保证这样做。

因此,在充分优化的驱动程序上,差异将是最小的。

虽然一些编译器可以优化流程,但它完全依赖于制服。将会发生的事情是,驱动程序将重新编译并重新优化程序,并且内联所有制服。这通常会消除分支,但完全是实现定义。