MetalはAppleのゲーム向け高速グラフィックレンダリング技術ですが、MetalFXはApple Siliconでさらに優れた性能を発揮できるよう改良を加えています。MetalFXの仕組みをご紹介します。
2014 年に Apple は Metal と呼ばれる新しいグラフィックスおよびゲーム レンダリング テクノロジーを導入しました。
Metalは、Appleハードウェア向けに最適化された高速パフォーマンスを提供するレンダリングAPIです。Apple Silicon GPUの登場により、Metalのパフォーマンスはさらに向上します。
コンピュータゲームのグラフィックスレンダリングにおける課題の一つは、高解像度のサーフェスシェーダーとエフェクトを用いて、大量のポリゴンモデルを高速に描画することです。フレームレートとゲームシーンの複雑さが増すにつれ、この問題はグラフィックスレンダリングパイプラインのボトルネックとなってきました。
Metal APIはApple C++ APIであり、その名の通りMetal Shading Language (MSL)と呼ばれる独自のシェーディング言語を備えています。Metal APIは、WindowsのDirectX 12やサードパーティ製のグラフィックレンダリングライブラリVulkanと比較されることがあります。
Metal API には Swift および Objective-C バージョンもあります。
ただし、Metal は Apple 製であり、Apple ハードウェア用に設計されているため、これらのデバイスで利用可能なレンダリング テクノロジの中で最高のグラフィック レンダリング パフォーマンスを提供します。
iOS または tvOS デバイスで Apple Arcade ゲームを起動するたびに、Metal レンダリングのサンプルを見ることができます。これは、すべての Apple Arcade ゲームが Metal を使用してレンダリングされる前に実行される、短い Apple Arcade ロゴのバウンス アニメーションです。
多くのゲームでは、GPUハードウェアアクセラレーションと事前計算シェーダーを使用してグラフィックレンダリングを高速化しています。Metalでは、グラフィックコマンドは事前にエンコードされ、GPUに送信されてレンダリングされます。
事前計算されたレンダリング状態は、レンダリング パイプラインを構成してパフォーマンスを最大限に高める方法を GPU に事前に伝えます。
レンダリングシェーダー(光、暗さ、色を制御する事前計算プログラム)は、3Dシーンのレンダリング時にリアリティと特殊効果を実現するために使用されます。MSLはMetalシェーダーの仕組みを説明しています。
シェーダーは、1988 年に Pixar の RenderMan ソフトウェアによって初めて商用ソフトウェアに導入されました。このソフトウェアは、Mac では数十年にわたる長い歴史を持っています。
最新の GPU レンダリング パイプラインのほとんどでは、3D データとシェーディング言語プログラムの両方が処理のために GPU に送信され、その後、シーン内の各フレームを作成するための複数ステップのプロセスまたはパイプラインが管理されます。
レンダリング手順は、大まかに言うと、ジオメトリ変換、モデルの三角形と四角形への分解、フラグメントシェーダーの適用、深度テストと合成、そして遮蔽された面とオブジェクトの除外で構成されます。最後のステップでは、これらすべてを最終的なフレームバッファに合成し、表示します。
これらすべてが、最新の GPU ハードウェアでは 1 秒間に数十回発生します。
Metalには、GPU負荷を軽減しながらレンダリングを高速化するパフォーマンスシェーダーも含まれています。パフォーマンスシェーダーには、画像フィルタリング、ニューラルネットワーク、高度な数学演算、レイトレーシングなどが含まれます。
レイ トレーシングにより、3D モデル オブジェクトの表面、テクスチャ、光源からの反射が大幅に改善されます。
2020年、AppleはMetalをApple Silicon CPUとGPUに移植し、パフォーマンスを大幅に向上させたと発表しました。WWDC 2022では、AppleはMetalの新機能「MetalFX」を発表しました。
MetalFX は、一部のフレームを再計算してアンチエイリアシングし、レンダリングされたオブジェクトのエッジを再計算して滑らかにすることで、より高速で正確なシーン レンダリングを可能にします。
MetalFX の秘密兵器は、アップスケーリングと呼ばれる技術です。
右側はアップスケーリングの例です。ピクセルとオブジェクトのエッジがよりシャープかつ滑らかになっています。
オブジェクトまたはシーンを低解像度でレンダリングすることで、フレームバッファ全体のレンダリング速度を向上させます。そして、シーンを拡大することで、表示前に追加のステップを追加します。
シーンのレンダリングの大部分を小さなスケールで行うことで、シーンをより高速に、より詳細かつ複雑な形でレンダリングできます。多くの場合、シーン全体をより大きなスケールでレンダリングするよりも、シーンオブジェクトを小さなスケールでレンダリングしてから最終フレームの全体的な解像度を向上させる方が高速です。
アップスケーリングを使用すると、MetalFX はシーンのレンダリングを高速化し、オブジェクトの詳細と鮮明さを向上させることができます。
MetalFXアップスケーリングの例。右側のフレームはより鮮明に見えます。
MetalFX は、空間アップスケーリングと時間アンチエイリアシング アップスケーリングという 2 つの異なるアップスケーリング タイプを使用します。
空間アップスケーリングでは、2つのMetalクラス(MTLFXSpatialScalerDescriptorとMTLFXSpatialScaler)が作成されます。記述子オブジェクトは空間スケーラーオブジェクトの詳細を記述し、MTLFXSpatialScalerオブジェクトは(そのencode
メソッドを介して)実際のエンコードを実行します。
が呼び出されるとencode
、MTLFXSpatialScalerオブジェクトはレンダリングコマンドを作成し、MTLCommandBufferオブジェクトに送信してレンダリングを行います。このプロセスはシーン内のフレームごとに繰り返されます。
MetalFX 空間アップスケーリングでは、パフォーマンスを大幅に低下させることなく、シーンの詳細を最大で約 2 倍にすることができます。
MTLFXSpatialScaler オブジェクトの作成は計算コストが高いため、アプリケーションの起動時またはディスプレイの解像度が変更されたときにのみ実行する必要があります。
時間的アンチエイリアシング アップスケーリングでは、前のフレームのデータが現在のフレームのアップスケーリングの入力として使用されます。
スーパーサンプリングとテンポラルサンプリングは、フレーム内の個々のピクセルデータを用いてアップスケーリングを実現する技術です。各ピクセルのデータと、複数のフレームにまたがるピクセルのデータの両方がサンプリングされます。
時間的アンチエイリアシングは若干計算負荷が高く、機能するには追加の色、深度、およびモーション データが必要です。
以下は、Apple の WWDC プレゼンテーションからのアンチエイリアシング アップスケーリングの別の例です。
左は 1080p、右はアンチエイリアシング アップスケーリングで 4K にアップスケールしたものです。
ほとんどの MetalFX アップスケーリング処理は、レンダリング後、フレームに対して最終的な後処理が行われる前に実行する必要があります。
MetalFX アンチエイリアシング アップスケーリングの用途の 1 つは、1080p フレームの解像度を上げて 4K 解像度に近づけることです。
空間アップスケーリングと同様に、MetalFX はアンチエイリアシング アップスケーリング用に MTLFXTemporalScalerDescriptor と MTLFXTemporalScaler という 2 つのクラスを提供します。
MetalFXに関する完全なドキュメントは、Appleの開発者向けウェブサイトで公開されています。AppleはWWDC '22で「MetalFXアップスケーリングによるパフォーマンス向上」と題したMetalFXセッションビデオも公開しており、サンプルコードを含め、MetalFXの使い方を詳細に説明しています。
No Man's Skyを含むいくつかの AAA ゲームタイトルはすでに Apple デバイスで MetalFX を使用しています。
MetalFXは、最新のGPUハードウェア上でシーン解像度とゲームパフォーマンスの両方を向上させる最新のグラフィックスコンピューティング技術を約束します。この新しいMetalテクノロジーは、Appleデバイスのゲームに革命をもたらす可能性が高いでしょう。