Metal #1 初期化
- Lingheng Tao
- 2024年3月23日
- 読了時間 5 分
Unity Shader Content Table Metal #22 [Appendix] SwiftUI Shader CG Paper #2 KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera
#ComputerGraphics#GameEngine#TechnicalArt
このノートは Metal の概要と最もシンプルな Metal アプリの構造についてです。
レンダリングフロー
Metal のレンダリングフローは4ステップにまとめられる:
- Metal を起動
- モデルをロード
- レンダリングパイプラインを設定
- レンダリング
他の多くのグラフィックス API と同様、各ステップには多くの低レベル命令が必要。本稿の最もシンプルなアプリでは、各パートの詳細な機能は紹介せず、高レベルな視点でパイプラインの大まかな流れを観察する。
Metal は Xcode でコンパイルする必要がある。Xcode の新しい macOS Blank Playground を使用(File > New > Playground > macOS > Blank)。
ウィンドウ
ウィンドウ管理には Apple 公式の MetalKit ライブラリを使用。Playground で補助エディタでレンダリング結果をリアルタイム表示するため、import は以下を使用。
Plain Textimport PlaygroundSupport
import MetalKit
ウィンドウは MetalKit の MTKView クラスで作成。
Plain Textguard let device = MTLCreateSystemDefaultDevice() else {
fatalError()
}
let frame = CGRect(x: 0, y: 0, width: 600, height: 600)
let view = MTKView(frame: frame, device: device)
view.clearColor = MTLClearColorMake(red: 1, green: 1, blue: 1, alpha: 1)
Metal でロードされるモデルはプリミティブ(primitive)とも呼ばれる。ここでは MDLMesh で球を作成し、外部ファイルからは読み込まない。
Plain Textlet allocator = MTKMeshBufferAllocator(device: device)
let mdlMesh = MDLMesh(sphereWithExtent: [0.25, 0.25, 0.25],
segments: [100, 100],
inwardNormals: false,
geometryType: .triangles,
allocator: allocator)
let mesh = try MTKMesh(mesh: mdlMesh, device: device)
シェーダー設定
シェーダーコードをロードし、レンダリングパイプラインを設定する。
