我正在尝试使用 Metal 编写一个 3D 引擎。我想了解渲染/计算/blit命令的编码顺序如何影响执行顺序?驱动程序是否遵循应用程序编码的顺序,或者是否尝试进行优化?
换句话说,当一个渲染通道为下一个渲染通道生成数据时,编码顺序是否足以确保渲染目标上没有 RAW 风险?
我刚从WWDC 2016的"金属中有什么新东西"视频中了解到function_constants,并且很多次提到UberShaders.我想创建一个片段超级着色器,可以用于不同类型的传递,如simplePassThrough,defferred等.以下是我想要使用它的方法.
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;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?如果我使用这种方法,我最终编译的MTLFunction是否会看到太多分支?