我对面部署金属呈现循环的链条多的 KCS(核心/计算)着色器和VFS(顶点/片段)着色器来:如何交错内核/顶点着色金属
texture -> [KCS -> VFS -> KCS -> VFS] --\
--->[KCS -> KCS] --> presentable
texture -> [KCS -> VFS -> KCS -> VFS] --/
一个着色器的输出是下一个着色器的输入。如图所示,两组4个交替着色器组合在一起,如图所示。
如果我正确地思考这个问题,我将需要多达10个不同的流水线描述符才能实现此目的,同时还需要大量调用完成处理程序来调用下一个着色器。
我也没有指出它,但最后一次对呈现器的调用还会将其输出的子区域馈送到单独的MTKView中(通过顶点/片段着色器)。
任何提示将不胜感激。
Ken又一次迅速回应!简化这一点,我会有一套VFS MTLRenderPipelineDescriptors和一套KCS MTLRenderPipelineDescriptors和一套MTLCommandBuffer?我最终会在命令缓冲区中快速创建编码器,并且它们将按顺序执行 - 即使它们是交错的KCS/VFS?另外,我可以让这些流水线描述符在多个MTKView中共享(并使用)吗? – zzyzy
那么,你会有一套'MTLRenderPipelineState'和'MTLComputePipelneState'对象。在创建这些状态对象时,您将创建描述符,但您不需要保留它们。 (还要注意:你可以配置一个描述符,从中创建一个状态对象,重新配置相同的描述符,从中创建一个不同的状态对象等等。因此,你不一定需要每个状态对象的描述符)。渲染循环的每次迭代需要一个命令缓冲区,对其进行编码,提交并放弃对其的引用。 –
是的,编码的命令将按顺序执行。 GPU可能实际上并行化了不依赖于彼此结果的命令,但效果就好像它们按顺序执行。而且,是的,您可以跨渲染目标共享状态对象等。基本上,从不需要创建冗余状态对象(即来自等效描述符)。状态对象只是在描述符创建时反映了描述符中的值,在创建过程中完成了一定的预计算。 –