UE4 翻訳メモ Mesh Drawing Pipeline Conversion Guide for Unreal Engine 4.22

4.22で大幅に変更されたらしいメッシュ描画パイプラインのドキュメントをGoogle翻訳先生の力を借りて翻訳しつつメモ

docs.unrealengine.com

より詳細は
docs.unrealengine.com

www.youtube.com
を参照


Introduction

Unreal EngineUE4)4.22リリースでは、Mesh Drawing Pipelineは完全に書き直されました。主な変更点は、フレーム毎に描画の準備をするImmediate Mode からすべてのシーン描画が事前に準備される Retained Mode に移行したことです。これは、シーン全体のシェーダバインディングテーブルを必要とするDirectX Raytracing(DXR)や、CPUが可視性の情報無しに描画の準備をする必要がある GPU-Driven-Rendering など、今後のテクノロジをサポートできるようになるための重要な変更です。

UE4 4.22でのMesh Drawing Pipelineの変更についての詳細は、Mesh Drawing PipelineのドキュメントおよびGame Developer's Conference(GDC)のプレゼンテーションUnreal Engine 4.22用Mesh Drawing Pipelineのリファクタリングを参照してください。

Mesh Draw Commands

古いパイプラインでは、mesh pass draw policiesはFMeshBatchに基づいてRendering Hardware Interface(RHI)コマンドを直接実行していました。新しいパイプラインでは、メッシュ描画コマンドFMeshDrawCommandの概念が導入されています。これは、FMeshBatchとRHIの間のインタフェースとして機能します。 Mesh drawコマンドは完全なスタンドアロンの描画記述です。FMeshDrawCommandはRHIが描画について知る必要があるすべての情報を格納します。これにより、描画ステート全体をそれらのシェーダバインディングと一緒にキャッシュして再利用することができます。

Static Draw Lists and Primitive Sets

4.22メッシュレンダリングパイプラインでは、静的描画リスト(TStaticMeshDrawList)とプリミティブセット(たとえば、FTranslucentPrimSet、FCustomDepthPrimSet)はFParallelMeshDrawCommandPassによって置き換えられました。 FParallelMeshDrawCommandPassはパスごとの可視メッシュ描画コマンドリストをカプセル化します。

新しいデザインには2つの重要な変更があります。まず、シーンごとのMesh ListsがVisible Mesh Listsに置き換えられました。以前のStatic Mesh Passではシーン内のパス毎のStatic Mesh List(TStaticMeshDrawList)をトラバースして個々のStatic MeshについてFViewInfo :: StaticMeshVisibilityMapをチェックすることで表示可能なMeshを選択していました。新しいデザインでは、描画は可視メッシュの描画コマンド配列(FMeshDrawCommandPassSetupTaskContext :: MeshDrawCommands)の単なるトラバースです。新しいアプローチは、シーンの複雑さに応じてスケールします。 2つ目の重要な変更は、静的および動的メッシュ描画リストをマージすることです。これにより、メッシュ描画パイプライン全体が簡素化され、レンダラーは静的描画と動的描画を並べ替えることもできます。

このパイプラインには、DrawDynamicMeshPass関数によるImmediate Modeのメッシュレンダリングエミュレーションもあります。これは非常に柔軟なレンダリングパスですが、キャッシング、自動インスタンス化、および複数の動的メモリ割り当てをサポートしていないため、パフォーマンスが重要でないメッシュパスにのみ使用してください。たとえばこの機能はエディタ専用ヘルパーメッシュのレンダリングを担当していたDrawViewElementsの置き換えとなります。

Drawing Policies

FDepthDrawingPolicyやFBasePassDrawingPolicyなどのdraw policiesは、FDepthPassMeshProcessorおよびFBasePassMeshProcessorに置き換えられました。特定のパスメッシュプロセッサはFMeshProcessor基本クラスから派生し、各FMeshBatchをパス用の一連のメッシュ描画コマンドに変換します。ここが最終的な描画フィルタリングが行われる場所です。シェーダの組み合わせ(Permutation)が選択され、シェーダバインディングが揃えられます。

Shader Bindings

以前はすべてのシェーダーパラメーターは適切なDrawing PoliciesによってRHICmdListに直接設定されていました。新たな仕組みではすべてのパラメータがFMeshDrawSingleShaderBindingsに集められ、後で描画中にSetOnCommandListを呼び出すことでRHICmdListに設定されます。これはシェーダバインディングを使用してすべての描画ステートをキャッシュできるようにするために必要な仕組みです。

古いパイプラインは、FDrawingPolicyRenderStateを使用して、common high-level mesh pass render stateを渡します(例えばuniform bufferを渡すのと同じように)。新しいパイプラインは、機能を大幅に変更することなくFDrawingPolicyRenderStateをFMeshPassProcessorRenderStateにリネームします。

シェーダバインディングの他の部分は、シェーダのSetParametersとSetMesh関数に埋め込まれました。これらはGetShaderBindingsとGetElementShaderBindingsに置き換えられました。上記の関数はカスタマイズ可能なShaderElementDataTypeに描画単位のパラメータを渡します。

リファクタリングにより多くのLooseパラメータがパス毎、または他のuniform buffersに移動しました。Looseパラメータを使用すると自動インスタンス化が無効になるだけでなく、各描画の間で定数バッファ更新を実行する必要があるため、処理速度の低下の原因となります。

ViewUniformBufferやDepthPassUniformBufferのような以前の標準的なuniform buffersは、新しいデータで毎フレームを作り直されていました。新しいパイプラインではこれらは永続的かつグローバルです(FScene :: FPersistentUniformBuffers内に保持されます)。これによってメッシュ描画コマンドがキャッシュされていてもシェーダはフレームごとに適切なデータを受信できます。

FPrimitiveViewRelevance

FPrimitiveViewRelevanceは、2つの追加の関連性フラグで拡張されました。

  • Separate Velocity Pass にはbVelocityRelevanceフラグが必要です。
  • Translucency Self Shadow にはbTranslucentSelfShadowフラグが必要です。

さらに、すべての動的描画はview relevanceに依存するようになり、view relevanceで特定のパスを無効にすることでレンダリングも無効になります。

Shaders

新しいパイプラインではGPUSceneが導入されました。これはシーン内のすべてのプリミティブのprimitive uniform bufferデータを含む構造化バッファです。現在、local vertex factory(Static Mesh Component)とSM5 feature levelのみがこのレンダリングパスを利用できます。シェーダは、GPUSceneを有効にしてコンパイルするためにPrimitiveのuniform bufferに直接アクセスする代わりに、GetPrimitiveData(PrimitiveId)を使用する必要があります。

プリミティブデータアクセスは、[Custom Expression Material ]ノード内で度々使用されます。たとえば、プリミティブのバウンディングボックスにアクセスするためです。それらを変換するためには、Primitive.MemberをGetPrimitiveData(Parameters.PrimitiveId).Memberに置き換える必要があります。