[MetalKit]Using MetalKit part 1使用MetalKit1

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

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


MetalKit 框架是在 WWDC 2015 上發(fā)布的,它給原Metal框架帶來了大量改進和新特性.認識 MTKView, NSView/UIView的一個子類. 它內置了一個Metal layer層,也同時管理著幀緩沖器framebuffer及其渲染目標附件render target attachments,還管理著繪制循環(huán)draw loop.

讓我們創(chuàng)建一個Cocoa Application(因為iOS模擬器不支持Metal).確保只有SwiftUse Strotyboards區(qū)域是選中狀態(tài).接下來,創(chuàng)建一個新的類,名為MetalView.swift繼承于NSView(暫時).然后,到storyboard中選中View Controller下面的View,設置Identity Inspector中的類為MetalView類型,如下圖.

chapter02-1.png

View Controller也是同樣操作,刪除Identity InspectorClass下面的View Controller,因為我們用不到它.刪除ViewController.swift因為我也不需要它了.現在回到MetalView.swift文件中,輸入import MetalKit.有兩種方法可以讓我們的類支持繪制:遵守MTKViewDelegate協(xié)議并實現它的drawInView(:)方法,或者繼承MTKView并重寫它的drawRect(:)方法.這里我們選擇后者,所以將類的類型從NSView改為MTKView,并創(chuàng)建一個新方法名為render(),內容如下:

func render() {
    let device = MTLCreateSystemDefaultDevice()!
    self.device = device
    let rpd = MTLRenderPassDescriptor()
    let bleen = MTLClearColor(red: 0, green: 0.5, blue: 0.5, alpha: 1)
    rpd.colorAttachments[0].texture = currentDrawable!.texture
    rpd.colorAttachments[0].clearColor = bleen
    rpd.colorAttachments[0].loadAction = .Clear
    let commandQueue = device.newCommandQueue()
    let commandBuffer = commandQueue.commandBuffer()
    let encoder = commandBuffer.renderCommandEncoderWithDescriptor(rpd)
    encoder.endEncoding()
    commandBuffer.presentDrawable(currentDrawable!)
    commandBuffer.commit()
}

讓我們一行一行來細看這些代碼.首先,我們創(chuàng)建一個device.我們將其設置為我們view的屬性device,否則該屬性為nil程序會崩潰.作為一個可選項,我們可以在繪制之前修改view的drawable屬性.接著,創(chuàng)建一個render pass descriptor(渲染通道描述符)以便我們配置渲染通道為current drawable’s texture附著上初始顏色.為了有趣一點,我們創(chuàng)建一個很棒的顏色,由一半藍色一半綠色組成,叫bleen.最后,我們使用命令緩沖器來創(chuàng)建render command encoder來執(zhí)行繪制命令.對于每個繪制循環(huán),當currentRenderPassDescriptor查詢時,創(chuàng)建一個新的MTLRenderPassDescriptor對象.這個對象是基于currentDrawable對象創(chuàng)建的.畫面顯示并不是MTKView處理的,所以我們必須自己先檢查currentRenderPassDescriptorcurrentDrawable都為為nil,然后再調用presentDrawable(:)方法.

讓我們參考一下Metal 文檔中的細節(jié).Metal框架包含若干對象:

  • device設備-對GPU的抽象,處理命令隊列中的渲染和計算命令
  • command queue命令隊列-一個命令緩沖器的串行隊列,確保儲存的命令按順序執(zhí)行
  • command buffer命令緩沖器-儲存從命令編碼器中編譯出的指令.當能問執(zhí)行完所有命令后Metal會通知應用程序.
  • command encoder命令編碼器-將API命令編譯成GPU硬件命令-共有三種類型的編碼器:render(供圖形渲染),compute(供數據并行處理)及blit(供資源復制操作).目前我們只需關注render command encoder渲染命令編碼器
  • states狀態(tài)-例如混合和深度
  • shaders著色器-源碼
  • resources資源-紋理和數據緩沖器

我們在本系列的下一節(jié)中將討論最后3個對象.當前我們只關注device,queue,bufferencoder.Render Command Encoder (RCE)渲染命令編碼器為每一個單獨的渲染通道提供硬件命令,這意味著所有的渲染都被送入一個單一的framebuffer幀緩沖器對象中(目標集合中).如果另一個幀緩沖器需要被渲染,會創(chuàng)建一個新的RCE.RCE會為從graphics popeline圖形管線中給出的vertex頂點fragment片段確定狀態(tài),并且插入resources,state changesdraw calls.利用RCE的一個優(yōu)點是無需繪制時編譯;應用可以決定編譯和狀態(tài)檢查何時發(fā)生,這樣為程序員提供了很大的性能優(yōu)勢.

讓我們再回到我們的代碼.在drawRect(:)方法中調用render()方法:

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    render()
}

如果你運行應用,你將會看到一個漂亮的,純粹的bleen-ish屏幕:

chapter02-2.png

在下一節(jié)中,我們終于開始介紹shaders,加載textures及管理model data模型數據.代碼 source code 發(fā)布于Github上.
下次見!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末打洼,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子揭斧,更是在濱河造成了極大的恐慌源请,老刑警劉巖逃魄,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機假栓,發(fā)現死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霍掺,“玉大人匾荆,你說我怎么就攤上這事「怂福” “怎么了棋凳?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長连躏。 經常有香客問我,道長贞滨,這世上最難降的妖魔是什么入热? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮晓铆,結果婚禮上勺良,老公的妹妹穿的比我還像新娘。我一直安慰自己骄噪,他們只是感情好尚困,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著链蕊,像睡著了一般事甜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滔韵,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天逻谦,我揣著相機與錄音,去河邊找鬼陪蜻。 笑死邦马,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播滋将,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼邻悬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了随闽?” 一聲冷哼從身側響起父丰,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橱脸,沒想到半個月后础米,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡添诉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年屁桑,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栏赴。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蘑斧,死狀恐怖,靈堂內的尸體忽然破棺而出须眷,到底是詐尸還是另有隱情竖瘾,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布花颗,位于F島的核電站捕传,受9級特大地震影響,放射性物質發(fā)生泄漏扩劝。R本人自食惡果不足惜庸论,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒呛。 院中可真熱鬧聂示,春花似錦、人聲如沸簇秒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趋观。三九已至扛禽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皱坛,已是汗流浹背旋圆。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麸恍,地道東北人灵巧。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓搀矫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刻肄。 傳聞我的和親對象是個殘疾皇子瓤球,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容