[MetalKit]5-Using-MetalKit-part-4使用MetalKit4

蘋果API搬運工發表於2017-12-14

本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.

MetalKit系統文章目錄


上一次我們學習了Metal Shading Language Metal著色語言基礎.在我們學習更多高深的課題前,我想現在是時候重新回顧一下我們學到的東西,尤其是關於圖形管線的,我也承認這一點我講得太快了(感謝匿名讀者的建議和反饋!)

讓我們更仔細地瞭解一下graphics pipeline圖形管線,從一小段歷史開始.大約十年前,當fixed pipeline固定管線仍然存在時,shaders被引入進來作為一種程式設計師影響固定管線的工具.在當時,浮點也被引入GPUs中並出現了GPGPU(能用計算圖形處理單元).於是,新的programmable pipeline可程式設計管線就被改變了:

part4_1.png

就像看到的那樣,新的管線目前擁有兩個shader著色器,我們可以在其中編寫自定義程式碼然後在GPU上執行.圖形程式的第一部分總是執行在CPU上,被稱為host code主機程式碼.這就是絕大部分資源分配發生的地方,也是和GPU之間傳輸資料的地方.程式最重要的地方,卻是執行在GPU上.兩個shaders包含在一個字尾為 .metal 的單獨檔案中(在其他GPGPU框架比如OpenCL中它被命名為kernel code核心程式碼).

管線開始於CPU站點處,這裡的輸入以vertices形式被送入到GPU中.它們經過了變換和逐頂點光照計算.此時vertex shader頂點著色器能夠在rasterization光柵化之前,對頂點進行操作改變.在這之後,頂點經過clipping裁剪rasterization光柵化並得到fragments片段.接著fragment shader片段著色器會被執行處理每個片段,之後每個畫素值被輸出到framebuffer幀緩衝器以供顯示.

現在讓我們看看Metal自己的管線.我們將回到 第2部分的程式碼中part 2 source code 並且將用行號來標明我們的提及的概念.建立Metal應用共需兩個階段.第一個是初始化階段:

part4_2.png

第一步是拿到device裝置(MetalView.swift中的19行).裝置是和GPU驅動及硬體的直接連線;也是我們在Metal中建立其他所有物件的源頭.第二個初始化步驟是建立一個command queue命令佇列(40行),它是我們提交工作到GPU的通道.第三個初始化步驟是建立緩衝器,紋理和其它資源(20-27行).newBufferWithBytes函式將會分配一塊新的共享記憶體,複製提供的指標到裡面,然後返回一個該緩衝器的控制程式碼.第四個初始化步驟是建立render pipeline渲染管線(28-37行),它是一個鏈式步驟,一端獲取資料,另一端產生一個柵格化的影像.管線由兩個元素組成:descriptor它持有shader資訊和畫素格式,state則是從descriptor中建立幷包含了編譯過了shaders.第五個初始化步驟是建立一個view.對我們來說,建立一個繼承於MTKView(11行)的物件,要比建立一個新的CAMetalLayer並將其新增為子檢視更為簡單.

接下來,讓我們看看建立Metal應用的第二個階段,Drawing繪製階段:

part4_3.png

第一步是拿到command buffer命令緩衝器(40行).所有進入GPU的工作都會被排列到該緩衝器裡面.我們需要前一階段的command queue命令佇列來建立command buffer命令緩衝器.第二步是建立一個rend pass渲染通道(38-39行).一個渲染通道描述符會告訴Metal當渲染一張圖片時要採取什麼處理.配置它時,我們需要指定我們要渲染什麼顏色紋理(currentDrawable紋理).我們還需要指定繪製幾何體前的清屏顏色.第三步是真實的drawing繪製(43-44行).我們指定頂點儲存的緩衝器和需要繪製的基本實體.第四步也就是最後一步是commit the command buffer提交命令緩衝器(46-47行)到GPU.當呼叫commit提交時,command buffer命令緩衝器被編碼,送入命令佇列的末尾,一旦時間到了就在GPU上執行.

我希望這一部分的教程能有助於理解通用性的概念比如graphics pipeline圖形管線Metal pipeline Metal管線.下一章節,我已經迫不及待想要回到編碼中去了.

下次見!

相關文章