フォワード シェーディング はジオメトリとライティングを描画時間に処理しますが、ディファード シェーディング はそれらを 2 つの異なるパスに分けます。これによってライティングの計算とジオメトリの計算が分離されるため、マテリアルのより効率的な実装と高度なライティング機能を実現できます。
モバイル ディファード シェーディング モデル はこれらのメリットを提供するだけでなく、タイルベースの GPU を活用してシステムのメモリと CPU へのパフォーマンスの影響を軽減します。これにより、タイル メモリをサポートするモバイル デバイスでのレンダリング品質とパフォーマンスを向上できます。
このページでは以下の情報を提供します。
-
モバイル ディファード シェーディングのメリットと制限の概要。
-
モバイル ディファード シェーディング モデルと互換性のあるデバイスの情報。
-
プロジェクトでモバイル ディファード シェーディングを構成する手順。
モバイル ディファード シェーディング モードを有効にする方法
モバイル ディファード シェーディングを有効にするには以下を実行します。
-
[Project Settings (プロジェクト設定)] を開きます。
-
[Engine - Rendering (エンジン - レンダリング)] > [Mobile (モバイル)] に進みます。
-
[Mobile Shading (モバイル シェーディング)] のドロップダウンをクリックして [Deferred Shading (ディファード シェーディング)] に設定し、エディタを再起動します。
モバイル デバイス向けにプロジェクトをビルドする場合は、モバイル ディファード シェーディング モデルが使用されます。
概要
ディファード シェーディングはレンダリング プロセスを以下の 2 つのパスに分けます。
-
geometry pass はベースカラー、メタリック、ラフネス (粗さ) のパラメータを処理し、通常は GBuffer と呼ばれる一時的なバッファに保存します。
-
lighting pass は GBuffer からマテリアルの属性を読み取り、マテリアルのライティングを計算して、シェーディングされたピクセルをフレームバッファに書き込みます。
一方で、フォワード シェーディングはマテリアルとライトおよびシャドウの相互関係を描画時間に計算します。つまり、マテリアルには他のすべてのパラメータと合わせてライトとシャドウのコードが含まれている必要があります。ディファード シェーディングではこの情報を無視して、より短時間でコンパイルできるシンプルなシェーダーとマテリアルを使用できます。
ディファード シェーディングはシャドウ テクスチャと反射テクスチャをバインドする必要がないため、各ドロー コールのグラフィックス ステート管理が少なくて済み、CPU のパフォーマンスが向上します。つまり、レンダリング ハードウェア インターフェース (RHI) スレッドの作業が減り、他のスレッドのために大きなコアが解放されるため、使用可能なスレッド間の競合が少なくなります。
ディファード シェーディングは、ジオメトリのレンダリング コストからライティングの処理コストとメモリコストを分離するため、ライティングのより柔軟なデバッグと最適化が可能になります。
モバイル ディファード シェーディング
モバイル デバイス上で効率的にディファード シェーディングを実現するために、モバイル ディファード シェーディング モデルは GPU 内のタイル メモリに GBuffer を配置します。つまり、GBuffer がシステム メモリに保存されることはありません。また、デバイスが LAZILY_ALLOCATED
メモリ タイプをサポートする場合に、メモリを割り当てません。メモリレス レンダーターゲットをサポートするデバイスはモバイル ディファード シェーディングのメモリ使用量が減りますが、サポートしていないデバイスは GBuffer にシステム メモリを割り当てるため、メモリの使用量が少し増えます。
パフォーマンス向上の例
以下のマテリアルはシンプルなカラーとラフネスのインプットを使用しています。モバイル フォワード レンダリングでは、147 個の命令と 2 つのサンプラを使用します。モバイル ディファード レンダリングでは、ライティングとシェーディングの命令を含める必要がないため、34 個の命令のみを使用してサンプラは 0 です。これにより、フレームレートのヒッチと全体的なメモリ使用量を削減できます。

左: シンプルなカラーとラフネスのインプットを使用する基本的なマテリアル。右上: モバイル フォワードを使用したこのマテリアルの統計情報。右下: モバイル フォワードを使用したこのマテリアルの統計情報。
モバイル ディファード シェーディングとモバイル フォワード シェーディングの使用に関するガイドライン
以下の場合はモバイル ディファード シェーディングが適しています。
- ターゲット デバイスがタイルベースのモバイル GPU を使用している。
- ゲームで事前計算されたライティングを使用していない。
- フォワード シェーディングでは提供されていない高度なライティング機能が必要。
- 複雑なライティングのためにパフォーマンスを向上し、メモリを節約する必要がある。
上記のプロファイルに当てはまる典型的なプロジェクトの例は、大規模な屋外環境があり、動的ライティングへの依存度が高いゲームです。Unreal Engine がサポートするデバイスのほとんどはディファード シェーディングのハードウェア要件を満たしており、ディファード シェーディングはパフォーマンス面で大きなメリットがあります。したがって、UE のモバイル プロジェクトの大部分で、モバイル ディファード シェーディングを使用することをお勧めします。ただし、主に事前計算されたライティングを使用している場合はフォワード シェーディング モデルが適しています。また、ローカル ライトや多数の反射キャプチャを使用している場合にもメリットがあります。
モバイル ディファード シェーディングでサポートされるレンダリング機能
このセクションでは、モバイル ディファード シェーディング モードでサポートされ、モバイル フォワード シェーディング モードではサポートされないレンダリング機能を記載します。
ライティング機能
モバイル ディファード シェーディング モードは以下のライティング機能を提供します。
- ライト関数
- ライト プロファイル
- IES ライト プロファイル
-
ライティング デカール
- ローカル ライト レンダリング効率の向上
レンダリングの制限
事前計算されたライティングとシェーディング モデルの制限
プロジェクトで事前計算されたライティングを使用している場合、ディファード シェーディングは DefaultLit と Unlit のシェーディング モデルのみを提供します。プロジェクトで事前計算されたライティングを使用している場合は、ディファード シェーディングではなくフォワード シェーディングを使用することを強くお勧めします。
透過処理パス
ディファード シェーディング モードで透過処理は利用可能ですが、透過処理パスは常にフォワード シェーディングを使用します。ガラスや水のような透明なマテリアルの [Lighting Mode (ライティング モード)] が、[Surface ForwardShading] に設定されていることを確認してください。
マルチサンプル アンチエイリアス (MSAA)
GBuffer で必要な空き容量が原因で、ディファード レンダリングは マルチサンプル アンチエイリアス (MSAA) をサポートできません。また、各ピクセルではなく各サンプルをシェーディングする必要があるため、シェーディング パスはより多くのリソースを消費します。
ライティング デカール制限
デカールには追加のバッファが必要となるため、ライティング デカール はディファード モードの静的ライティングではサポートされていません。メモリの制約により、これはモバイル デバイスでは不可能です。ただし、エミッシブ デカールは静的ライティングで問題なく機能します。
その他のデカール制限
GBuffer の空き容量の制限のため、デカールは法線に八面体エンコーディングを使用して、サイズを縮小します。このエンコーディングが原因で、GBuffer で法線をブレンドまたは修正することはできません。ただし、完全に上書きすることは可能です。
シェーディング モデルの制限
モバイル ディファード シェーディングでは、複数のシェーディング モデルを同時にサポートするには非常に多くのコストがかかります。したがって、複雑なシェーディング モデルは、それを必要とするオブジェクトにのみ使用する必要があります。
デバイスの互換性
Unreal Engine は、PC プラットフォーム、iOS、Android Vulkan、Android GLES など、モバイル レンダラを使用するすべてのプラットフォームでモバイル ディファード シェーディングをサポートしています。以下のセクションでは、各デバイス ファミリがどのようにタイル メモリを使用してこのシェーディング モデルをサポートしているかと、特定のデバイスの制限について詳しく説明します。
タイル メモリの使用
各モバイル プラットフォームは、タイル メモリでシェーディングを実行する方法が異なります。
- iOS は
framebuffer_fetch
に似た機能を使用してタイル メモリの GBuffer にアクセスします。 - 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 を拡張し、ユーザーのデバイスの完全な機能を使用できるようにします。