0

我遇到了将 Metal 渲染循环部署为多个 KCS(内核/计算)着色器和 VFS(顶点/片段)着色器的链:

texture -> [KCS -> VFS -> KCS -> VFS] --\
                                         --->[KCS -> KCS] --> presentable
texture -> [KCS -> VFS -> KCS -> VFS] --/

一个着色器的输出是下一个着色器的输入。如图所示,这两组 4 个交替着色器在接近尾声时组合在一起。

如果我正确地考虑了这一点,我将需要多达 10 个不同的管道描述符来实现这一点,以及对完成处理程序的大量调用,其中下一个着色器将被分派。

我也没有指出它,但是对presentable的最后一次调用也会将其输出的子区域馈送到单独的MTKView(通过顶点/片段着色器)。

任何提示将不胜感激。

4

1 回答 1

2

如果它们具有不同的值,您只需要不同的描述符。也就是说,如果您展示的任何 KCS 步骤使用相同的计算着色器函数,那么它们通常可以共享一个描述符。(还有 的其他属性MTLComputePipelineDescriptor,但它们不太常用。)

对于 VFS 步骤,描述符更复杂,因此它们必须在所有要共享的属性中相等。

当然,如果可以的话,您应该在应用程序的生命周期中创建一次管道状态对象。避免为每个渲染循环创建它们。

您绝对不想使用完成处理程序来分派下一步。这将可怕地停止管道(使 CPU 和 GPU 反复等待对方)。只需将步骤按顺序编码到命令缓冲区中。在任何可能写入其输入的先前绘制/调度完成之前,任何给定的绘制或调度都不会继续。

于 2017-09-01T03:52:04.117 回答