如何交错内核/顶点METAL着色器

时间:2017-09-01 03:14:58

标签: metal metalkit

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

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

一个着色器的输出是下一个着色器的输入。如图所示,两组4个交替着色器在末尾附近组合。

如果我正确地思考这个问题,我需要多达10个不同的管道描述符才能实现这一点,同时需要大量调用完成处理程序,其中将调度下一个着色器。

我也没有表明过,但最后一次调用也会将其输出的子区域输入到单独的MTKView中(通过顶点/片段着色器)。

任何提示都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

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

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

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

您绝对想要使用完成处理程序来分派下一步。这将严重阻碍管道(使CPU和GPU反复等待)。只需将步骤按顺序编码到命令缓冲区中即可。任何给定的抽奖或派遣都不会继续,直到可能写入其输入的任何先前的抽奖/发送完成为止。