Metal 開發 | 使用 C++ 進行介面呼叫~~
文章首發部落格 http://glumes.com
前兩天在群裡面看到大佬轉發一篇文章:Getting started with Metal-cpp 。
連結在此:
http://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),連結地址如下:
http://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 工程,可以執行下這個工程:
http://developer.apple.com/documentation/metal/rendering_a_scene_with_deferred_lighting_in_c
另外,用 Metal 做渲染引擎的開發,比用 OpenGL 寫要快多了,因為它本身就提供了很多封裝工具類,比 OpenGL 從零開始寫要省不少事,而且說不定效能還強不少。
- 音視訊開發系統入門大致路線
- 乾貨 | 快速抽取縮圖是怎麼練成的?
- 關於直播、WebRTC、FFmpeg 的那些事
- 005 | 播放器系列專欄-在 Windows 上檢視 MP4 格式資訊
- 將音視訊中的花屏、綠屏、黑屏問題一網打盡
- 關於音視訊裡面的解碼幀率和渲染幀率
- 003 | 認識MP4視訊(上)
- 入門或者轉行音視訊,應該要怎麼做?
- Metal 開發 | 使用 C 進行介面呼叫~~
- FFmpeg 呼叫 MediaCodec 硬解碼到 Surface 上
- 程式碼吸貓 | 用 OpenGL 影象渲染的養貓計劃
- 音訊變速 | libsonic 開源庫的介紹與實踐
- FFmpeg 呼叫 Android MediaCodec 進行硬解碼(附原始碼)
- iOS開發 - 在 Swift 中去呼叫 C/C 程式碼
- 聲網 SDK 接入以及音視訊通話應用開發指南
- Shader 優化 | OpenGL 繪製網格效果
- KodeLife | Shader 實時編輯預覽的強大工具使用實踐