iOS 眼睛放大(二)

Finn
Feb 4, 2022

--

透過Metal 將眼部放大,此篇會介紹如何撰寫基本MSL的filter

繪製方法

Metal

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

MSL Vector

詳細的可以看 Metal Shader Language 的官方文件

Step1: Filter

透過GPUImage3 封裝,只要將 Filter 繼承 BasicOperation,並設定參數與 指定的 shader

在 GPUImage3 中 可以指定想要的 shader 並建立自己的 filter

Step2: Fragment shader

定義參數 struct,需要與 Filter 參數相符

與傳統思考邏輯不同的是,因為 GPU的並行處理,所以不是將算好的顏色 assgin到每個像素中,而是每個像素同時進入 Fragment sharder function 並運算該顯示回傳的顏色

假設我們要將特定區域位置顯示為藍色,就需要判斷目前獲取的位置是否在範圍內,並且回傳藍色

建立自己的 fragment shader

Step3: Binding filter

將 圖片輸出到 Filter 上,再將 Filter 結果輸出到 View 上

GPUImage3 binding使用方法
將 x < 0.2 && y < 0.5 的位置顏色變成藍色

接下來

了解了透過 Metal fragment shader 來自己寫 filter,接下來就是將放大算法導入
iOS 眼睛放大(三)放大算法

--

--