我刚刚在 WWDC 2016 的“Metal 新特性”视频中了解到 function_constants,它多次提到 UberShaders。我想创建一个片段 super 着色器,可用于不同类型的传递,如 simplePassThrough、deferred 等。下面是我想如何使用它。

constant int passType [[function_constant(0)]];
constant bool simplePassThrough = (passType == 0);
constant bool forwardShading = (passType == 1);
constant bool deferredShading = (passType == 2);

fragment FragmentOutStruct UberFragmentShader()
{
FragmentOutputStruct frgOut;
if (simplePassThrough) {
    // Update frgOut
} else if (forwardShading) {
    // Update frgOut
} else if (deferredShading) {
    // Update frgOut
}
return frgOut;
}

这是正确的方法吗?如果我使用这种方法,我最终编译的 MTLFunction 会看到太多分支吗?

最佳答案

这是函数常量的合法用例,并且在运行时没有分支成本。这是因为编译器将消除它确定永远无法执行的代码(例如,因为它等效于 if(false) { ... } )。

关于ios - 在 Metal 中使用 function_constants 创建 UberShader 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40029139/

10-12 01:50