本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.
上一次我們學習了Metal Shading Language Metal著色語言
基礎.在我們學習更多高深的課題前,我想現在是時候重新回顧一下我們學到的東西,尤其是關於圖形管線的,我也承認這一點我講得太快了(感謝匿名讀者的建議和反饋!)
讓我們更仔細地瞭解一下graphics pipeline圖形管線,從一小段歷史開始.大約十年前,當fixed pipeline固定管線仍然存在時,shaders被引入進來作為一種程式設計師影響固定管線的工具.在當時,浮點也被引入GPUs
中並出現了GPGPU(能用計算圖形處理單元).於是,新的programmable pipeline可程式設計管線就被改變了:
就像看到的那樣,新的管線
目前擁有兩個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
應用共需兩個階段.第一個是初始化階段:
第一步是拿到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繪製階段:
第一步是拿到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管線
.下一章節,我已經迫不及待想要回到編碼中去了.
下次見!