Dav*_*ish 6 shader ios opengl-es-2.0
Apple在其着色器最佳实践中表示,如果可能的话,应避免分支,特别是在着色器中计算出的值.所以我用if内置clamp()函数替换了一些语句.我的问题是,现在clamp(),min()并且max()可能更有效,或者它们只是简单地扩展到if块的便利(即宏)功能?
我意识到答案可能依赖于实现.在任何情况下,函数显然都更清晰,并且明确了编译器可以执行某些操作的意图.
Ric*_*ney 10
从历史上看GPUs的每个片段指令支持,如MIN和MAX更长的时间远远超过他们所支持的任意条件分支.在桌面OpenGL这样的一个例子是GL_ARB_fragment_program扩展(现在GLSL取代),其中明确指出它不支持分支,但它确实提供了指导MIN和MAX以及一些其他的条件指令.
我非常有信心,鉴于这些操作有多常见min(),max()并且clamp()在着色器中,所有GPU仍将拥有用于这些操作的专用硬件.这不是由规范保证,因为一个实现可以优化代码,但是它认为合适的,但在现实世界中,你应该使用GLSL的内置功能,而不是滚动您自己.
唯一的例外是如果使用条件来避免大量额外的片段处理.在某些时候,分支的成本将低于运行分支中所有代码的成本,但是这里的平衡将非常依赖于硬件,您必须进行基准测试以确定它是否真的有助于您的应用程序目标硬件.这是我的意思:
void main() {
vec3 N = ...;
vec3 L = ...;
float NDotL = dot(N, L);
if (NDotL > 0.0)
{
// Lots of very intensive code for an awesome shadowing algorithm that we
// want to avoid wasting time on if the fragment is facing away from the light
}
}
Run Code Online (Sandbox Code Playgroud)
只需要钳位NDotL到0-1,然后总是处理每个片段上的影子代码只是为了乘以你的最终影子NDotL因子,如果NDotL原来是<= 0 就浪费了很多精力,理论上我们可以避免这种分支开销.这种事情并不总是表现胜利的原因在于它非常依赖于硬件如何实现着色器分支.
| 归档时间: |
|
| 查看次数: |
1272 次 |
| 最近记录: |