本系列文章是對 metalkit.org 上面MetalKit內容的全面翻譯和學習.git
MetalKit系統文章目錄github
可能你們已經在WWDC2016
上看過了,新的 Playground app for the iPad真是個震撼的產品!做爲一個playground愛好者,我更是深感如此.如今咱們能夠輕易地在iPad上寫Swift
代碼,只要點擊一個按鈕就能運行.今天咱們將要試試Metal Performance Shaders (MPS),由於它在移動設備上很好用而咱們之前又沒有討論過它.須要提醒的是,MPS
框架只能在iOS
和tvOS
上工做.咱們會用一個便捷的方法,在macOS
設備的playground上編寫代碼而後經過iCloud Drive
來分享到你的移動設備上.還有,iPad
的playground只能在iOS10
以上運行.swift
讓咱們在Xcode
中建立一個新的iOS
playground.你能夠在Resources
文件夾下添加任意圖片.我已經添加了一張名爲nature.jpg.下一步,在playground主頁面中寫幾行代碼,以下面截圖(代碼在文末Github)後端
讓咱們看一下這些代碼.在之前的文章中咱們已經一遍遍寫過相似的代碼.你應該馬上注意到新添加的代碼引發了一個錯誤,這是由於macOS
不"認識"MPS
框架.一旦咱們在iPad中打開後,錯誤就會消失:app
import MetalPerformanceShaders
複製代碼
下一步,咱們用MTKTextureLoader
從先前添加圖片處建立一個新的紋理.如今最有意思的部分來了!一旦咱們建立MTLCommandBuffer
對象,咱們將不會像之前作的那樣從這個命令緩衝器建立MTLCommandEncoder
對象.相反,咱們建立一個新的MPSImageGaussianBlur
對象,以下面的代碼:框架
let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)
shader.encode(commandBuffer: commandBuffer, sourceTexture: texIn, destinationTexture: texOut)
複製代碼
MPS
對象最棒的地方在於,它讓你能夠將一個計算着色器(內核函數)應用於輸入紋理,而無需配置任何狀態,描述符,管線或寫個內核函數!MPS
對象會爲咱們處理好全部事情.固然,用這個便捷方法的話,咱們也只能採用預設的着色器,並只能更改這個特殊着色器的sigma之類的參數.ide
目前爲止還不錯!咱們已經經過iCloud Drive
把playground發送到了iPad
上.打開Finder
窗口,點擊iCloud Drive
並把playground文件複製到這個文件夾:函數
咱們終於開始用上iPad了!打開新的Playground
應用來到My Playgrounds
.在屏幕左上角點擊 + 按鈕.能夠看出來,你也可能在iPad
上建立一個新的playground並能夠輕易用其它方式共享輸出到你的macOS
設備上.可是如今,咱們點擊iCloud Drive
以下圖:post
當iCloud Drive
窗口彈出後,請注意咱們已經進入了iPad
爲playground提供的私有文件夾,咱們如今想要導入咱們用到的MPS.playground,點擊它: 學習
當iPad加載守playground後,咱們就開工了!如今你能在你的iPad
上看到playground的主頁面了:
你所要作的就是點擊Run My Code
,就能看到咱們圖片已經帶上了一個漂亮的模糊濾鏡:
你可能會說:"我怎麼才能看到整個圖片呢?"答案就在下面的GIF圖片中.只要簡單地在屏幕中間長按,直到出現屏幕分隔線.不要鬆手指,想看代碼或輸出圖片就左右拖動分隔線(你可能想要從新載入這個頁面由於這個動態GIF只會播放一次):
如今你能看到整個模糊過的圖片了!欣賞過圖片後,點擊屏幕左側的按鈕來返回分屏狀態.在咱們把它收起來以前,再來點牛逼效果.將下面這行:
let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)
複製代碼
替換爲
let shader = MPSImageSobel(device: device)
複製代碼
查看輸出的新圖片:
咱們只是改動了一行代碼就產生如此不一樣的效果!還有幾十種不一樣的着色器來供你嘗試.查看 Metal Performance Shaders API來獲取更多信息.若是你對圖像處理有興趣,你也許會想要查看Simon Gladman的 Core Image for Swift這本書.若是你想要學更多MPS
後端的Metal
,能夠查看Moore的 Metal by Example這本書. 源代碼source code 已發佈在Github上.
下次見!