WWDC2014 中發布,提供低層級的 GPU API 來達到3D圖形渲染 和 並行運算,不支援跨平台,最低支援手機為 A7處理器(iPhone 6s)
根據 Metal 的 pipeline 中,我們可以透過
- Vertex Shader: 縮放變形圖片大小
- Fragment Shader:修改頂點顏色
若想將眼睛放大,我們可以透過 Fragment shader 改變渲染的像素來達到效果
在這邊推薦 GPUImage3,是使用Swift語言並將 Metal 封裝來提供方便使用,我們可以透過 → 來方便實現輸出串接
實作範例:
使用自己寫的 Filter 來完成範圍內上色
Metal Shader Language
Metal Shader Language 簡稱 MSL,語言是基於 C++,所以原本會寫C++的話上手應該較為簡單
簡單介紹一下待會會用到的單位
float 為 32bit 浮點數,half 顧名思義為 float 的一半 為16bit
支援Vector最多4個,表示方法為直接在單位後面加上數字,二維向量中間再加個x
- float3 :該變數有3個 float
- half2x2 :該變數為 half 2x2
假如需要存取Vector值,可以透過 x y z w 或者 r g b a,分別代表 0 1 2 3
詳細的可以看 Metal Shader Language 的官方文件
Step1: Filter
透過GPUImage3 封裝,只要將 Filter 繼承 BasicOperation,並設定參數與 指定的 shader
Step2: Fragment shader
定義參數 struct,需要與 Filter 參數相符
與傳統思考邏輯不同的是,因為 GPU的並行處理,所以不是將算好的顏色 assgin到每個像素中,而是每個像素同時進入 Fragment sharder function 並運算該顯示回傳的顏色
假設我們要將特定區域位置顯示為藍色,就需要判斷目前獲取的位置是否在範圍內,並且回傳藍色
Step3: Binding filter
將 圖片輸出到 Filter 上,再將 Filter 結果輸出到 View 上
接下來
了解了透過 Metal fragment shader 來自己寫 filter,接下來就是將放大算法導入
iOS 眼睛放大(三)放大算法