T.TAO
Back to Blog
/2 min read/Others

Metal #1 初期化

Metal #1 初期化

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ステップにまとめられる:

  1. Metal を起動
  2. モデルをロード
  3. レンダリングパイプラインを設定
  4. レンダリング

他の多くのグラフィックス 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)

シェーダー設定

シェーダーコードをロードし、レンダリングパイプラインを設定する。