如何快速學習Metal API?

最近正在學習遊戲引擎的開發,希望通過Metal來進行實踐學習。然而目前互聯網上相關資源較少,有沒有相關書籍、資源等推薦?


寫完原來的答案之後,這半年裡個人時間都在寫一個練習 Metal 的工程。對於初學者來說,一個複雜度合適的例子也許更有價值吧。所以給大家介紹一下:Nuo Model Viewer。Nuo 是我兒子的名字。

因為是個練習工程,所以沒有用任何高深的技術,也沒有寫 graphics abstraction layer。用來了解 Metal API 是比較直接了當的。性能並不很出色,大概也就 25 FPS。對於基本的 shading, render to texture, multi-pass render 都涉及了。圖形學方面用了簡單的 normalized phong shading, shadow map。

如果有什麼問題可以私信我。在這裡介紹這個項目的目的之一就是希望看到這個東西對初學者是不是有幫助,哪裡需要改進。

----------------------------------------------

其實我剛學 OpenGL 的時候,也有 @遠坂田銀時臣 那樣的困惑。而且這個問題在 OpenGL 里比在 Metal/Direct3D 里要嚴重。因為 OpenGL 是一個廠商聯盟定義的跨平台 API。所以它的標準是基於一定的假設的。形象的說就是飄在天上的。然後到了具體平台還需要一個落地的方法。

但是你沒法一上來就找落地的方法。首先你得明白一些基本概念。明白了這些概念,大體模模糊糊知道 OpenGL 程序是個什麼樣子。然後再來找落地的方法。

等你大概明白了 OpenGL context 這種概念,在隨便一 Google「OpenGL Mac」,就會發現:

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_pg_concepts/opengl_pg_concepts.html#//apple_ref/doc/uid/TP40001987-CH208-SW1

讀到第二章,你就知道 OpenGL context 是怎麼和 NSView 結合起來的。

所以說難也不難。

Metal 的材料比較少。我大體看了一下。Apple 自己的 programming guide 概念講的很細,但是缺少一個從頭到尾的例子。網上有些教程從頭到尾都能穿起來,但是概念比較模糊。所以二者要穿插。對於後者你可以看 Metal by Example。

等你學了圖形學的基本概念,比如說今天我聽說了 deferred render by G-buffer。我都不知道這是個什麼東西。馬上 wiki 一下,大概脫離具體 API 知道了一個概念。然後 Google「Metal gbuffer」。馬上就有一個例子。

我原來有同事做 InDesign SDK 的支持。我說你們的文檔太難用了。他說,誰看文檔啊,都是直接拿例子來改。所以我們大部分工作都是寫例子。你說 Apple 文檔少,但是 Apple 的例子很多的。你還是不習慣美國程序員學習知識的方式。

所以說難也不難。上面的 Google + wiki + 文檔 + 例子 的方法都是我自己用正常思路琢磨出來的。也沒什麼思維跳躍的地方。


Oryol支持Metal和其它流行圖形API,可以對比著進行學習。


樓上的答案= =我就想說國內上google很費勁誒……

我不知道題主是什麼水平,但是既然已經是引擎開發,肯定是有一定底子的,我水平不行難以提供太大幫助,見諒。

借著題主的提問吐槽一下:

我自己也不會寫啥代碼,但我覺得metal的相關資源確實很少,而且對於我這種沒有什麼基礎的自學者,看網上這些編程教程時永遠都是從「這tm是啥」到「這tm又是啥的感覺,在這點上,metal唯一的一點好處就是不用麻煩地配置開發環境了,但是真要用metal寫app的話,既要熟悉swift又要返工objc,swift對初學者也是個坑,且不說很多基於1的教程在2.0上都用不了,講swift的教程又大多默認你objc很6,結果就是牽扯出一大堆需要學的預備知識,本身現階段能把metal玩的很6的很多都是objc,swift和opengl的大神,這些人出的教程就很難照顧基礎薄弱的初學者,所以給我的體驗是,編程的入門階段對於自學者真心不是很友好,只能從非常通用的部分先略不求甚解地學起,一點一點自己體會,學到什麼算什麼再回頭看看自己能幹什麼,而沒法根據自己想實現的效果按照清晰的索引有效率地篩選自己需要掌握的知識,

比如我想自己寫出漂亮的gui出來,搜了一大堆知道自己要用圖形庫實現,然後為了跨平台選擇了opengl,結果所有opengl的教程都是從glut講起,然而如果用glut的庫我幹嘛還要學opengl,直接用人家裝好的qt不就好了,就算這樣還是硬著頭皮學下去,覺得以後總能學到獨立實現的辦法,結果馬上打臉,蘋果去年開始就不慣著glut了,好吧然後又要去搜glut的替代品,還好搜到了glfw,下載下來編譯安裝,然後按照教程又發現大部分教程都是glfw2的,glfw3的語法改了很多根本用不了,好不容易找到了glfw3的教程,又是默認你glwf2玩的很6的……最後結果就是我花了半個學期就只學會了在opengl里用就好幾種辦法扔個窗口出來畫個長方形……

所以啊,大神們,比起高冷地指出我們看不見滿地的資源,我們需要的是你們指條道,告訴我們我們應該去學哪些東西,先看什麼再看什麼才能看懂,當我們不得不面臨自己當下無法玩轉的部分時,起碼知道自己模仿的操作是在幹什麼,畢竟就算滿地資源,閉著眼睛亂撞也是扯淡,對於初學者,雖然不能三步並兩步急功近利,但在入門時少走彎路,學習是知道自己所學何用是求之不得的。


沒資料的時候就 死磕 官方sample和文檔。混官方論壇。我現在搞gnm就是這狀態。。。


metal確實資料少,蘋果的metal program guide也沒能覆蓋全部的feature。

但是metal真的是太容易用了,比gl/d3d/vulkan都簡單,對一個有經驗的圖形程序員,看看metal的頭文件幾乎就可以開始用了。

入門沒必要糾結圖形api,等你真的入門了他們都一樣,gl資料多就先學gl好了。


推薦閱讀:

為什麼iPhone做不到完全防盜?
objective-c調用方法使用中括弧加冒號,相對主流的點加小括弧有什麼方便的地方?
如何鑄就全棧程序員?
iOS 如何進行逆向工程?
android可以通過進入程序後台關閉運行程序達到減少內存佔用的目的,為什麼ios不行?

TAG:iOS開發 | 遊戲引擎 | Metal |