金屬支持除標準vertex
和fragment
功能kernel
。我發現了一個金屬kernel
的例子,將圖像轉換爲灰度。金屬計算內核VS片段着色器
究竟是在kernel
VS fragment
這樣的區別?什麼可以計算kernel
做(好)一個fragment
着色器不能,反之亦然?
金屬支持除標準vertex
和fragment
功能kernel
。我發現了一個金屬kernel
的例子,將圖像轉換爲灰度。金屬計算內核VS片段着色器
究竟是在kernel
VS fragment
這樣的區別?什麼可以計算kernel
做(好)一個fragment
着色器不能,反之亦然?
金屬具有四種不同類型的命令編碼器:
MTLRenderCommandEncoder
MTLComputeCommandEncoder
MTLBlitCommandEncoder
MTLParallelRenderCommandEncoder
如果你只是在做圖形編程,你最熟悉的MTLRenderCommandEncoder
。那就是你要設置你的頂點和片段着色器的地方。這被優化來處理大量的繪製調用和對象基元。
內核着色器主要用於MTLComputeCommandEncoder.
我認爲內核着色器和計算編碼器用於圖像處理示例的原因是因爲您沒有像使用渲染命令編碼器一樣繪製任何原語。即使這兩種方法都在使用圖形,在這種情況下,它只是修改紋理上的顏色數據,而不是計算屏幕上多個對象的深度。
的計算指令編碼器也更容易建立做並行使用計算線程:
https://developer.apple.com/reference/metal/mtlcomputecommandencoder
因此,如果您的應用程序要利用多線程對數據的修改,很容易做,在這個命令編碼器比渲染命令編碼器。
的主要區別在於,你會到一個片段的功能無法發送頂點位置(或任何其它目/幾何數據)到一個核函數。片段函數返回(通常情況下)爲您的輸出紋理的每個像素,而這並沒有返回內核函數(無效),顏色上的紋理進行操作或緩衝液,可以在網格上同時運行方式更多的線程,可以上升到數百萬個線程。內核也用於GPGPU和科學模擬,不僅用於圖像處理,而且碎片函數只能用於渲染。 – Marius
基本上是iOS的OpenCL? –
你可以這樣想,是的。但不僅適用於iOS。 Metal也適用於tvOS和macOS。 – Marius