2017-09-01 16 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可能實際上並行化了不依賴於彼此結果的命令,但效果就好像它們按順序執行。而且,是的,您可以跨渲染目標共享狀態對象等。基本上,從不需要創建冗餘狀態對象(即來自等效描述符)。狀態對象只是在描述符創建時反映了描述符中的值,在創建過程中完成了一定的預計算。 –