2017-09-01 49 views
0

我对面部署金属呈现循环的链条多的 KCS(核心/计算)着色器和VFS(顶点/片段)着色器来:如何交错内核/顶点着色金属

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

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

如果我正确地思考这个问题,我将需要多达10个不同的流水线描述符才能实现此目的,同时还需要大量调用完成处理程序来调用下一个着色器。

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

任何提示将不胜感激。

回答

1

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

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

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

你肯定是不要想用完成处理程序来发送下一步。这会使管道严重失速(使CPU和GPU重复等待)。只需将这些步骤按顺序编码到命令缓冲区即可。任何给定的抽签或派送都不会继续,直到任何先前的可能写入输入的抽签/派送完成为止。

+0

Ken又一次迅速回应!简化这一点,我会有一套VFS MTLRenderPipelineDescriptors和一套KCS MTLRenderPipelineDescriptors和一套MTLCommandBuffer?我最终会在命令缓冲区中快速创建编码器,并且它们将按顺序执行 - 即使它们是交错的KCS/VFS?另外,我可以让这些流水线描述符在多个MTKView中共享(并使用)吗? – zzyzy

+0

那么,你会有一套'MTLRenderPipelineState'和'MTLComputePipelneState'对象。在创建这些状态对象时,您将创建描述符,但您不需要保留它们。 (还要注意:你可以配置一个描述符,从中创建一个状态对象,重新配置相同的描述符,从中创建一个不同的状态对象等等。因此,你不一定需要每个状态对象的描述符)。渲染循环的每次迭代需要一个命令缓冲区,对其进行编码,提交并放弃对其的引用。 –

+0

是的,编码的命令将按顺序执行。 GPU可能实际上并行化了不依赖于彼此结果的命令,但效果就好像它们按顺序执行。而且,是的,您可以跨渲染目标共享状态对象等。基本上,从不需要创建冗余状态对象(即来自等效描述符)。状态对象只是在描述符创建时反映了描述符中的值,在创建过程中完成了一定的预计算。 –