[MetalKit]Metal Performance Shaders for the iPad playground性能著色器

本系列文章是對(duì) http://metalkit.org 上面MetalKit內(nèi)容的全面翻譯和學(xué)習(xí).

MetalKit系統(tǒng)文章目錄


可能大家已經(jīng)在WWDC2016上看過了,新的 Playground app for the iPad真是個(gè)震撼的產(chǎn)品!作為一個(gè)playground愛好者,我更是深感如此.現(xiàn)在我們可以輕易地在iPad上寫Swift代碼,只要點(diǎn)擊一個(gè)按鈕就能運(yùn)行.今天我們將要試試Metal Performance Shaders (MPS),因?yàn)樗谝苿?dòng)設(shè)備上很好用而我們以前又沒有討論過它.需要提醒的是,MPS框架只能在iOStvOS上工作.我們會(huì)用一個(gè)便捷的方法,在macOS設(shè)備的playground上編寫代碼然后通過iCloud Drive來分享到你的移動(dòng)設(shè)備上.還有,iPad的playground只能在iOS10以上運(yùn)行.

讓我們?cè)?code>Xcode中創(chuàng)建一個(gè)新的iOSplayground.你可以在Resources文件夾下添加任意圖片.我已經(jīng)添加了一張名為nature.jpg.下一步,在playground主頁面中寫幾行代碼,如下面截圖(代碼在文末Github)

mps_1.png

讓我們看一下這些代碼.在以前的文章中我們已經(jīng)一遍遍寫過類似的代碼.你應(yīng)該立刻注意到新添加的代碼引起了一個(gè)錯(cuò)誤,這是因?yàn)?code>macOS不"認(rèn)識(shí)"MPS框架.一旦我們?cè)趇Pad中打開后,錯(cuò)誤就會(huì)消失:

import MetalPerformanceShaders

下一步,我們用MTKTextureLoader從先前添加圖片處創(chuàng)建一個(gè)新的紋理.現(xiàn)在最有意思的部分來了!一旦我們創(chuàng)建MTLCommandBuffer對(duì)象,我們將不會(huì)像以前做的那樣從這個(gè)命令緩沖器創(chuàng)建MTLCommandEncoder對(duì)象.相反,我們創(chuàng)建一個(gè)新的MPSImageGaussianBlur對(duì)象,如下面的代碼:

let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)
shader.encode(commandBuffer: commandBuffer, sourceTexture: texIn, destinationTexture: texOut)

MPS對(duì)象最棒的地方在于,它讓你可以將一個(gè)計(jì)算著色器(內(nèi)核函數(shù))應(yīng)用于輸入紋理,而無需配置任何狀態(tài),描述符,管線或?qū)憘€(gè)內(nèi)核函數(shù)!MPS對(duì)象會(huì)為我們處理好所有事情.當(dāng)然,用這個(gè)便捷方法的話,我們也只能采用預(yù)設(shè)的著色器,并只能更改這個(gè)特殊著色器的sigma之類的參數(shù).

目前為止還不錯(cuò)!我們已經(jīng)通過iCloud Drive把playground發(fā)送到了iPad上.打開Finder窗口,點(diǎn)擊iCloud Drive并把playground文件復(fù)制到這個(gè)文件夾:

mps_8.png

我們終于開始用上iPad了!打開新的Playground應(yīng)用來到My Playgrounds.在屏幕左上角點(diǎn)擊+按鈕.可以看出來,你也可能在iPad上創(chuàng)建一個(gè)新的playground并可以輕易用其它方式共享輸出到你的macOS設(shè)備上.但是現(xiàn)在,我們點(diǎn)擊iCloud Drive如下圖:

mps_2.png

當(dāng)iCloud Drive窗口彈出后,請(qǐng)注意我們已經(jīng)進(jìn)入了iPad為playground提供的私有文件夾,我們現(xiàn)在想要導(dǎo)入我們用到的MPS.playground,點(diǎn)擊它:

mps_3.png

當(dāng)iPad加載守playground后,我們就開工了!現(xiàn)在你能在你的iPad上看到playground的主頁面了:

mps_4.png

你所要做的就是點(diǎn)擊Run My Code,就能看到我們圖片已經(jīng)帶上了一個(gè)漂亮的模糊濾鏡:

mps_5.png

你可能會(huì)說:"我怎么才能看到整個(gè)圖片呢?"答案就在下面的GIF圖片中.只要簡(jiǎn)單地在屏幕中間長按,直到出現(xiàn)屏幕分隔線.不要松手指,想看代碼或輸出圖片就左右拖動(dòng)分隔線(你可能想要重新載入這個(gè)頁面因?yàn)檫@個(gè)動(dòng)態(tài)GIF只會(huì)播放一次):


mps_6.gif

現(xiàn)在你能看到整個(gè)模糊過的圖片了!欣賞過圖片后,點(diǎn)擊屏幕左側(cè)的按鈕來返回分屏狀態(tài).在我們把它收起來之前,再來點(diǎn)牛逼效果.將下面這行:

let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)

替換為

let shader = MPSImageSobel(device: device)

查看輸出的新圖片:

mps_7.PNG

我們只是改動(dòng)了一行代碼就產(chǎn)生如此不同的效果!還有幾十種不同的著色器來供你嘗試.查看 Metal Performance Shaders API來獲取更多信息.如果你對(duì)圖像處理有興趣,你也許會(huì)想要查看Simon Gladman的 Core Image for Swift這本書.如果你想要學(xué)更多MPS后端的Metal,可以查看Moore的 Metal by Example這本書.
源代碼source code 已發(fā)布在Github上.
下次見!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛾派,一起剝皮案震驚了整個(gè)濱河市纺棺,隨后出現(xiàn)的幾起案子熊泵,更是在濱河造成了極大的恐慌炭菌,老刑警劉巖游岳,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠娱,死亡現(xiàn)場(chǎng)離奇詭異乏奥,居然都是意外死亡谅畅,警方通過查閱死者的電腦和手機(jī)登渣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡泻,“玉大人胜茧,你說我怎么就攤上這事〕鹞叮” “怎么了呻顽?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵雹顺,是天一觀的道長。 經(jīng)常有香客問我廊遍,道長无拗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任昧碉,我火速辦了婚禮英染,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘被饿。我一直安慰自己四康,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布狭握。 她就那樣靜靜地躺著闪金,像睡著了一般。 火紅的嫁衣襯著肌膚如雪论颅。 梳的紋絲不亂的頭發(fā)上哎垦,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音恃疯,去河邊找鬼漏设。 笑死,一個(gè)胖子當(dāng)著我的面吹牛今妄,可吹牛的內(nèi)容都是我干的郑口。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盾鳞,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼犬性!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腾仅,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤乒裆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后推励,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹤耍,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年吹艇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惰蜜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡受神,死狀恐怖抛猖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤财著,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布联四,位于F島的核電站,受9級(jí)特大地震影響撑教,放射性物質(zhì)發(fā)生泄漏朝墩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一伟姐、第九天 我趴在偏房一處隱蔽的房頂上張望收苏。 院中可真熱鬧,春花似錦愤兵、人聲如沸鹿霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懦鼠。三九已至,卻和暖如春屹堰,著一層夾襖步出監(jiān)牢的瞬間肛冶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工扯键, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睦袖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓忧陪,卻偏偏與公主長得像扣泊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘶摊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容