本日はグラフィックス枠です。
筆者はグラフィックにかかわる仕事についているということもあり、UnityにおいてはShader言語(HLSL)を駆使してDirectXに関する理解もありますが、最近Apple VisionProを触るうえでMetalの勉強もしたくなったため今回まずは概要について学んでいきます。
〇Metalとは?
MetalはApple製品で使用されているグラフィックスAPIです。
グラフィックスAPIとは、一言で表すとGPU上で処理を行うためにソフトウェア側から呼ばれるAPIを指します。
これはレンダリングに使用され、グラフィックス全般にかかわってきます。
また、シェーダーはグラフィックスパイプライン上で実行される、グラフィックスAPIを使用したプログラムです。
MetalはAppleが開発し、iOS,
macOSからVisionOSまで使用されています。
Apple製品ではOSからハードウェアまでAppleが開発しており、SoC自体を最大限発揮することができます。
〇Metalで使用されるシェーダー言語
DirectXではHLSL言語、AndroidではOpenGLなどではGLSLなどが用いられますが、Metalの場合のシェーダー言語はMSLになります。
これはMetal Shader Laungageを意味します。(そのままですね)
サンプルコードは次のようなります。
#include <metal_stdlib>
using namespace metal;
// 頂点データの構造体
struct VertexIn {
float4 position [[attribute(0)]];
float4 color [[attribute(1)]];
};
// 頂点シェーダーの出力構造体
struct VertexOut {
float4 position [[position]];
float4 color;
};
// 頂点シェーダー
vertex VertexOut vertex_main(VertexIn in [[stage_in]]) {
VertexOut out;
out.position = in.position;
out.color = in.color;
return out;
}
// フラグメントシェーダー
fragment float4 fragment_main(VertexOut in [[stage_in]]) {
return in.color;
}
他のシェーダー
〇Metalで使用できる機能
DirectX12とMetal 3でサポートしている機能を比較していきます。
| 機能 | DirectX 12 | Metal |
|---|---|---|
| プラットフォーム | Windows, Xbox | iOS, macOS, tvOS, watchOS |
| マルチスレッドレンダリング | 〇 | 〇 |
| レイトレーシング | 〇 | 〇 |
| シェーダー言語 | HLSL | MSL |
| コンピュートシェーダー | 〇 | 〇 |
| テッセレーション | 〇 | 〇 |
| ジオメトリシェーダー | 〇 | ✕ |
| ダイナミックライティング | 〇 | 〇 |
| テクスチャ圧縮 | 〇 | 〇 |
| 高度なデバッグツール | 〇 | 〇 |
| クロスプラットフォーム | 制限あり | Appleデバイス内での互換性 |
上記表を見てわかるようにMetalとDirectXは機能としては大体同じようなことができることがわかります。
これは使い勝手等以外にもDirectXのゲームの互換性などを容易に移植することなど、Appleの戦略が見えます。
〇ジオメトリシェーダーステージについて
Metalはジオメトリシェーダーステージをサポートしていません。
これにはいくつかの理由があります。
・パフォーマンス
ジオメトリシェーダーステージでは頂点ごとに処理を行うためメモリ帯域幅が無駄に使用されることがあります。
・代替手段
メッシュシェーダー、メッシュレット化リングなどの新技術によって効率的なジオメトリ処理が可能になったため・
Metalの場合テッセレーションステージやコンピュートシェーダーを使用することで等々の結果を実現できます。
今回は簡単に概要をまとめていきました。