フォワード シェーディング が描画時にジオメトリとライティングを処理するのに対し、ディファード シェーディング はそれらを 2 つのパスに分けて処理します。これにより、ライティングの計算がジオメトリの計算から分離され、マテリアルや高度なライティング機能に対してより効率的な実装が可能になります。
モバイル ディファード シェーディング モデル では、これらのメリットを提供するだけでなく、タイルベース GPU を活用して、システム メモリと CPU に及ぼすパフォーマンス上の影響を軽減しています。これにより、タイル メモリをサポートするモバイル デバイスにおいて、より優れたレンダリング品質とパフォーマンスを実現します。
このページでは、以下について説明します。
-
モバイル ディファード シェーディングのメリットと制限の概要。
-
モバイル ディファード シェーディング モデルに対応しているデバイスに関する情報。
-
プロジェクトでモバイル ディファード シェーディングを設定する手順。
モバイル ディファード シェーディング モードを有効にする方法
モバイル ディファード シェーディングを有効にするには、次の手順を実行します。
-
[Project Settings (プロジェクト設定)] を開きます。
-
[Engine - Rendering (エンジン - レンダリング)] > [Mobile (モバイル)] に移動します。
-
[Mobile Shading (モバイル シェーディング)] のドロップダウンをクリックし、[Deferred Shading (ディファード シェーディング)] に設定して、エディタを再起動します。
モバイル デバイス用のプロジェクトをビルドした場合、モバイル ディファード シェーディング モデルが使用されます。
概要
ディファード シェーディングでは、レンダリング プロセスを次の 2 つのパスに分割します。
-
ジオメトリ パス。BaseColor パラメータ、Metallic パラメータ、および Roughness パラメータを処理し、それらのパラメータを一時バッファ (通常、GBuffer という) に格納します。
-
ライティング パス。マテリアル属性を GBuffer から読み取り、マテリアル属性のライティングを計算し、シェーディングされたピクセルをフレームバッファに書き込みます。
一方、フォワード シェーディングは、描画時にライトおよびシャドウとのマテリアルのインタラクションを計算します。つまり、他のすべてのパラメータとともにライトとシャドウのコードがマテリアルに含まれている必要があります。ディファード シェーディングは、この情報を省略し、よりシンプルなシェーダーとマテリアルを使用することができるため、コンパイル時間が短縮されます。
ディファード シェーディングはシャドウとリフレクション テクスチャをバインドする必要がないため、ドロー コールごとに必要なグラフィックスの状態管理も減り、CPU のパフォーマンスが向上します。つまり、レンダリング ハードウェア インターフェース (RHI) スレッドの作業が軽減され、その結果、他のスレッドのためにコアが大幅に解放され、使用可能なスレッド間のコンフリクトが減ります。
ディファード シェーディングでは、ライティングの処理の負荷とメモリの負荷がジオメトリのレンダリングの負荷と分離されるため、ライティングのデバッグおよび最適化をより柔軟に行うことができます。
モバイル ディファード シェーディング
モバイル デバイスでディファード シェーディングを効率的に実現するために、モバイル ディファード シェーディング モデルでは、GBuffer を GPU 内のタイル メモリに配置します。つまり、GBuffer がシステム メモリに格納されることはありません。また、LAZILY_ALLOCATED
メモリ タイプがサポートされている場合、モバイル ディファード シェーディング モデルではメモリを割り当てません。メモリレス レンダリング ターゲットをサポートするデバイスは、モバイル ディファード シェーディングを使用するとより少ないメモリを使用しますが、サポートしていないデバイスは GBuffer のためにシステム メモリを割り当て、使用するメモリが若干多くなります。
パフォーマンスの改善例
以下のマテリアルは、単純な色とラフネスの入力を使用しています。モバイル フォワード レンダリングでは、147 の命令と 2 つのサンプラーを使用します。モバイル ディファードでは、ライティング命令とシェーディング命令を含める必要がないため、34 の命令と 0 個のサンプラーしか使用しません。この結果、フレームレートのヒッチが低下し、全体的なメモリ使用量も減ります。

左:シンプルな色とラフネスの入力を使用した基本的なマテリアル。右上:モバイル フォワードを使用したこのマテリアルの統計情報。右下:モバイル フォワードを使用したこのマテリアルの統計情報。
モバイル ディファード シェーディングおよびモバイル フォワード シェーディングの使用に関するガイドライン
モバイル ディファード シェーディングは、次のような場合に適しています。
- ターゲット デバイスがタイルベースのモバイル GPU を使用している。
- ゲームで事前計算されたライティングが使用されていない。
- フォワード シェーディングでは提供されない高度なライティング機能が必要である。
- 複雑なライティングのためにパフォーマンスを向上させ、メモリを節約する必要がある。
これらのプロファイルに該当するプロジェクトの一般的な例としては、大規模な屋外環境を備え、動的ライティングを多用しているゲームが挙げられます。Unreal Engine がサポートするほとんどのデバイスは、ディファード シェーディングのハードウェア要件を満たしているため、ディファード シェーディングによりパフォーマンス上の大きなメリットが得られます。そのため、UE のほとんどのモバイル プロジェクトでは、モバイル ディファード シェーディングを使用することをお勧めします。ただし、事前計算されたライティングを主に使用している場合は、フォワード シェーディング モデルの方が適しています。フォワード シェーディングにより、ローカル ライトや多数の反射キャプチャを使用する場合にメリットが得られます。
モバイル ディファード シェーディングのサポート対象のレンダリング機能
このセクションでは、モバイル フォワード シェーディング モードでは使用できないモバイル ディファード シェーディング モードがサポートするレンダリング機能をリストします。
ライティング機能
モバイル ディファード シェーディングモードは、以下のライティング機能を提供します。
- ライト関数
- ライト プロファイル
- IES ライト プロファイル
-
ライティング デカール
- ローカル ライトのレンダリング効率の向上
レンダリングの制限事項
事前計算されたライティングおよびシェーディング モデルの制限事項
プロジェクトで事前計算されたライティングが使用されている場合、ディファード シェーディングは DefaultLit および Unlit シェーディング モデルのみを提供します。プロジェクトで事前計算されたライティングが使用されている場合は、ディファード シェーディングではなく、フォワード シェーディングを使用することを強くお勧めします。
透過処理パス
透過処理は、ディファード シェーディング モードで使用できますが、透過処理パスは常にフォワード シェーディングを使用します。ガラス、水などの半透明マテリアルでは、[Lighting Mode (ライティング モード)] が [Surface ForwardShading (サーフェス フォワード シェーディング)] に設定されていることを確認してください。
マルチサンプル アンチエイリアス (MSAA)
ディファード レンダリングは、GBuffer で必要な容量のため、マルチサンプリング アンチエイリアス (MSAA) をサポートすることができません。また、ディファード レンダリングは、各ピクセルではなく各サンプルのシェーディングを行う必要があるため、より多くのリソースを消費するシェーディング パスを使用します。
ライティング デカールの制限事項
ディファード モードの静的ライティングでは、デカール用に追加のバッファが必要になるため、ライティング デカール はサポートされていません。これは、メモリの制約により、モバイル デバイスでは実装できません。ただし、エミッシブ デカールは静的ライティングで問題なく動作します。
その他のデカールの制限事項
GBuffer の容量制限のため、デカールは法線に 8 面体エンコーディングを使用してサイズを縮小しています。このエンコーディングでは、GBuffer で法線をブレンドしたり修正することはできません。ただし、その代わりに完全に上書きすることができます。
シェーディング モデルの制限事項
複数のシェーディング モデルを同時にサポートすることは、モバイル ディファード シェーディングでは非常に大きな負荷がかかります。そのため、複雑なシェーディング モデルの使用は、それを必要としているオブジェクトのみに制限する必要があります。
デバイスの互換性
Unreal Engine では、PC プラットフォーム、iOS、Android Vulkan、Android GLES など、モバイル レンダラを使用するすべてのプラットフォームでモバイル ディファード シェーディングをサポートしています。次のセクションでは、このシェーディング モードをサポートするための各デバイス ファミリーのタイル メモリの使用方法、および特定のデバイスの制限事項について説明します。
タイル メモリの使用方法
各モバイル プラットフォームは、タイル メモリでシェーディングを実行する方法が異なります。
- iOS は、タイル メモリ上の GBuffer にアクセスするために
framebuffer_fetch
と同様の機能を使用します。 - Android Vulkan は、Vulkan のサブパスを使用します。
- Android GLES では拡張機能が必要であり、すべての GPU に対応する普遍的な方法はありません。
- Mali および PowerVR は PLS 拡張機能を使用します。
- Adreno GPU は
framebuffer_fetch
拡張機能を使用します。
その他の GPU は即時モード レンダラを使用しているため、これらのタイル メモリ手法は適用されません。この場合、GBuffer はシステム メモリに通常のテクスチャとして割り当てられ、メモリ上のメリットが得られない可能性があります。
ハードウェアの制限事項
Android Vulkan を実行する Mali デバイスでは、色と入力アタッチメントに関して次の厳しい制限があります。
- GBuffer でピクセルあたり 16 バイトまたは 128 ビット。
- 最大 4 つの入力アタッチメントしか使用できない。
- ライティング パスの間、最大 3 つのカラー アタッチメントと 1 つのデプス アタッチメントしかフェッチできない。
モバイル ディファード シェーディング モードは、すべてのデバイスで一貫性を確保するために、デフォルトでこれらの制限を採用しています。これらの制限を取り除くには、「*Engine.ini
」ファイル内の MobileUsesExtendedGBuffer
パラメータを true
に設定します。この設定を行うと、モバイル ディファード シェーディング モードは、GBuffer を拡張して、ユーザーのデバイスの機能をフルに活用できます。