[MetalKit]24-Metal-Performance-Shaders-for-the-iPad-playground性能着色器

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

MetalKit系統文章目錄github


可能你們已經在WWDC2016上看過了,新的 Playground app for the iPad真是個震撼的產品!做爲一個playground愛好者,我更是深感如此.如今咱們能夠輕易地在iPad上寫Swift代碼,只要點擊一個按鈕就能運行.今天咱們將要試試Metal Performance Shaders (MPS),由於它在移動設備上很好用而咱們之前又沒有討論過它.須要提醒的是,MPS框架只能在iOStvOS上工做.咱們會用一個便捷的方法,在macOS設備的playground上編寫代碼而後經過iCloud Drive來分享到你的移動設備上.還有,iPad的playground只能在iOS10以上運行.swift

讓咱們在Xcode中建立一個新的iOSplayground.你能夠在Resources文件夾下添加任意圖片.我已經添加了一張名爲nature.jpg.下一步,在playground主頁面中寫幾行代碼,以下面截圖(代碼在文末Github)後端

mps_1.png

讓咱們看一下這些代碼.在之前的文章中咱們已經一遍遍寫過相似的代碼.你應該馬上注意到新添加的代碼引發了一個錯誤,這是由於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文件複製到這個文件夾:函數

mps_8.png

咱們終於開始用上iPad了!打開新的Playground應用來到My Playgrounds.在屏幕左上角點擊 + 按鈕.能夠看出來,你也可能在iPad上建立一個新的playground並能夠輕易用其它方式共享輸出到你的macOS設備上.可是如今,咱們點擊iCloud Drive以下圖:post

mps_2.png

iCloud Drive窗口彈出後,請注意咱們已經進入了iPad爲playground提供的私有文件夾,咱們如今想要導入咱們用到的MPS.playground,點擊它: 學習

mps_3.png

當iPad加載守playground後,咱們就開工了!如今你能在你的iPad上看到playground的主頁面了:

mps_4.png

你所要作的就是點擊Run My Code,就能看到咱們圖片已經帶上了一個漂亮的模糊濾鏡:

mps_5.png

你可能會說:"我怎麼才能看到整個圖片呢?"答案就在下面的GIF圖片中.只要簡單地在屏幕中間長按,直到出現屏幕分隔線.不要鬆手指,想看代碼或輸出圖片就左右拖動分隔線(你可能想要從新載入這個頁面由於這個動態GIF只會播放一次):

mps_6.gif

如今你能看到整個模糊過的圖片了!欣賞過圖片後,點擊屏幕左側的按鈕來返回分屏狀態.在咱們把它收起來以前,再來點牛逼效果.將下面這行:

let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)
複製代碼

替換爲

let shader = MPSImageSobel(device: device)
複製代碼

查看輸出的新圖片:

mps_7.PNG

咱們只是改動了一行代碼就產生如此不一樣的效果!還有幾十種不一樣的着色器來供你嘗試.查看 Metal Performance Shaders API來獲取更多信息.若是你對圖像處理有興趣,你也許會想要查看Simon Gladman的 Core Image for Swift這本書.若是你想要學更多MPS後端的Metal,能夠查看Moore的 Metal by Example這本書. 源代碼source code 已發佈在Github上.

下次見!

相關文章
相關標籤/搜索