在现代 (GL3.3+) GPU 上使用 GLSL 时,在统一上进行分支的可能成本是多少?
在我的引擎中,我已经达到了拥有大量着色器的程度。我为其中的很多预设了几种不同的质量预设。就目前情况而言,我在着色器中使用带有 if() 的制服来选择不同的质量预设。然而,我担心通过重新编译着色器并使用#ifdef 可能会获得更好的性能。问题是当我重新编译着色器时需要担心跟踪和重置其他制服。
基本上我想知道的是我的恐惧是否没有根据。在现代 GPU 上统一分支是否便宜?我自己做了一些测试,发现两者的差别很小,但我只在 nVidia 680 上进行了测试。
我承认我不是专家,但也许我的猜测总比没有好。
我认为购买制服确实相当便宜。它显然与纹理或属性数据上的分支有很大不同,因为 SIMD 中的所有 ALU 将遵循来自着色器的相同代码路径,因此它是“真正的”分支而不是执行掩码。我不太确定着色器处理器如何遭受管道中的分支气泡的影响,但管道肯定比通用 CPU 更浅(特别是考虑到它们通常运行的时钟速度要低得多)。
我希望我能提供更多帮助,如果其他人能够更权威地回答,我也将不胜感激。然而,就我而言,我不会太担心制服的问题。但与往常一样,如果有可能,请分析您的着色器并看看它是否会产生任何明显的差异。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)