Metal 開發 | 使用 C++ 進行介面呼叫~~

語言: CN / TW / HK

文章首發部落格 https://glumes.com

前兩天在群裡面看到大佬轉發一篇文章:Getting started with Metal-cpp

連結在此:

https://developer.apple.com/metal/cpp/

文章大意就是:一頓操作安排上,蘋果現在支援用 C++ 開發 Metal 了。

眾所周知,在做渲染後端開發時,OpenGL 和 Vulkan 都是支援 C++ 開發的,可以直接定義 C++ 相關介面並根據平臺特性去實現。

而 Metal 則需要支援 Objective-C 才行了,編寫的檔案也是 .m 檔案格式,但是現在就可以直接寫 C++ 的渲染實現了。

前置準備

根據官方文章中的內容,首先要確保 Xcode 版本在 9.3 以上,並且要使用 C++17 的語法。

同時要下載好 Metal 對應的 C++ 標頭檔案(metal-cpp),連結地址如下:

https://developer.apple.com/metal/cpp/files/metal-cpp_macOS12_iOS15.zip

建立工程

建立一個 macOS 上的工程,可以是 App 工程也可以是命令列工程,主要是驗證一下環境配置是否正確。

接下來要把下載好的 Metal 標頭檔案(metal-cpp)放在工程搜尋路徑中的,如下圖所示:

然後把 C++ 版本改成 std=c++17 。

接下來要把 framework 依賴包含進來:

主要是:

  • Foundation.framework

  • QuartzCore.framework

  • Metal.framework

把以上的環境依賴都搞定之後,就可以進行程式碼開發了。

程式碼開發

首先需要把 Metal 相關標頭檔案包含進來,由於它只是一個頭檔案的庫,要生成對應的實現,還要把一些巨集配置加上。

核心就是如下一段程式碼,

```cpp

define NS_PRIVATE_IMPLEMENTATION

define CA_PRIVATE_IMPLEMENTATION

define MTL_PRIVATE_IMPLEMENTATION

include

include

include

```

在其他需要用到 Metal 相關物件的地方,就只用包含三個標頭檔案就好了。

三個標頭檔案都是配套一起出現的,當然也可以只包含一個頭檔案就行。

在下載 metal-cpp 的 SingleHeader 資料夾下,有一個 MakeSingleHeader.py 指令碼, 執行它來生成:

```cpp

./SingleHeader/MakeSingleHeader.py Foundation/Foundation.hpp QuartzCore/QuartzCore.hpp Metal/Metal.hpp

```

這樣一來,在 SingleHeader 資料夾下會生成 Metal.hpp 檔案,它包含了所有會用到的物件,只包含它一個就好了。

```cpp

define NS_PRIVATE_IMPLEMENTATION

define CA_PRIVATE_IMPLEMENTATION

define MTL_PRIVATE_IMPLEMENTATION

include

```

成功引入了 Metal 標頭檔案就可以進行開發了,官方也給出了一個 Demo 工程,可以執行下這個工程:

https://developer.apple.com/documentation/metal/rendering_a_scene_with_deferred_lighting_in_c

另外,用 Metal 做渲染引擎的開發,比用 OpenGL 寫要快多了,因為它本身就提供了很多封裝工具類,比 OpenGL 從零開始寫要省不少事,而且說不定效能還強不少。