RenderDocをダウンロードし、
UE プラグインで RenderDoc Plugin プラグインを開くことを選択し、それを使用して実行時にフレームをキャプチャすると、UE のレンダリング プロセスを表示できます。
0. 前段階
前段階は主に透視変換、投影、初期化パラメータなどのセットです...
GAMES101: 現代コンピュータグラフィックス入門 (1) 変換、ラスタライズ、色付けを参照してください。
1. PrePass(レンダリング前処理段階)
右側でレンダリングされた深度マップを確認すると、1 つずつレンダリングされていることがわかります。
実際、ここをクリックすると、各メッシュの頂点情報と属性が表示されます。
頂点データは当然 PrePass および BasePre ステージで入力されますが、AO、Lights、および PostProcessing では主に画面空間内の三角形が入力に使用されます。
2.HZBの構築
HZB テクノロジ (階層 Z バッファ オクルージョン カリング) は、以下の BuildHZB で使用されています。これは、Z バッファ テクノロジを使用し、オブジェクトのバウンディング ボールの半径に従って、オブジェクト内の他のオブジェクトによってオクルージョンされているオブジェクトを削除します。 PrePass ステージを実行し、内部でミップマップをレイヤー化します。半径に応じて、深度テスト用にさまざまなレベルのミップマップを選択します。
注: ここでのカリングは、オクツリーではなく、ParallelFor の線形カリングです。
3.ベースパス
レンダリングは BasePass で実行されます。シーン内に 5 つのオブジェクトがあり、各オブジェクトが 5 つのライティング計算を実行する場合、最終的に 5×5=25 回、遅延レンダリングはライティング レンダリングの計算を遅らせることです。まず、レンダリングするたびに、オブジェクトの BaseColor (基本色)、表面法線、粗さ、ピクセル深度などを異なる画像にレンダリングし、これら 5 つの光源に対して 5 回の計算を実行し、最終的に 5+5=10 回の計算のみを実行します。
最初に ClearRenderTargetView が次の BasePass レンダリングのために 7 RT をクリアし、次に BasePassParallel で 6 つの並列レンダリングを実行することがわかります。
上記は 6 回のレンダリングの結果です。もちろん、実際には 7 つの RT が描画されます。ここでは最初の 3 つだけを示しています。キャラクターが 3 つのレンダリング、1 つのボール、1 つの床、1 つの椅子に分割されていることがわかります。合計 6 回のレンダリング。これは BasePass 全体のプロセスでもあります。BasePass の SceneDepth は、PrePass の出力値です。
レンダリングされたシェーダー コードは、エンジンの \UnrealEngine\UE_5.1\Engine\Shaders\Private に配置され、BasePass のメイン シェーダー コードが保存されている BasePassPixelShader.usf ファイルが見つかります。ソースコードに従ってマテリアル内のパラメータが取り出され、入力メッシュのジオメトリ情報に従って、BasePass レンダリング時に対応するシェーダ コードが生成されます。
4. 影の深さ
次に、そのシャドウマップを生成します。
5. 拡散間接と AO
AO: 新しいバージョンでは、Lumen を使用して一部の AO 操作が置き換えられ、環境光マスクのレイヤーが追加されています。
画面全体の法線マップを計算する前回のBasePassのAとBのRTとSceneDepthZを入力します
Lumen についてはここでは解析しませんので、今後の新しい記事で詳しく解析しますが、ここでは Lumen は多くの計算を行い、多くの画像を生成し、最後に AO を重ね合わせて、最終的に次の画像を取得しました。
6. ライト
シーンには DirectionalLight があるため、ここで光源が計算され、影が生成されます。
平行光でないと、カメラで間引いた物体に点光源(非平行光)が当たると描画されないので面倒です。したがって、カメラが照明ジオメトリ内にあるかどうかを判断する必要があり、そうである場合、深度テストはオフになります。
7.その他のハンドル
シーン内の特定の光源が処理された後、ボリューム雲、大気、高さフォグ、そして最後に透明なボリュームが処理されます。
8.PostProcess(後処理)
上記では、処理が完了しても出力結果は非常に悪いため、後処理でアンチエイリアス、露光、色補正などの操作が実行されます。
したがって、その後、後処理動作が実行される。
最終的な結果は悪くありません。