Choose your operating system:
Windows
macOS
Linux
Unreal Engine (UE4) 4.22 のリリースで、メッシュ描画パイプラインが完全に書き直されました。主な変更点は、表示の描画を毎フレーム行う 即時 モードから、すべてのシーン描画を事前に準備しておく リテインド モードへの移行です。これは、シーン全体のシェーダ バインディング テーブルを必要とする DirectX Raytracing (DXR) や、CPU がビジビリティの情報なしに描画を準備する必要のある GPU 駆動レンダリングなど、今後のテクノロジーをサポートするための重要な変更です。
UE4 4.22 におけるメッシュ描画パイプラインの変更に関する詳細については、「メッシュ描画パイプライン」ドキュメントと、Game Developers Conference (GDC) のプレゼンテーション「Refactoring the Mesh Drawing Pipeline for Unreal Engine 4.22」をご覧ください。
メッシュ描画コマンド
以前のパイプラインでは、メッシュ パス描画ポリシーは FMeshBatch
に基づいて Rendering Hardware Interface (RHI) コマンドを直接実行していました。新しいパイプラインでは、FMeshBatch
と RHI の間のインターフェースとして機能するメッシュ描画コマンド FMeshDrawCommand
の概念を取り入れています。メッシュ描画コマンドは、完全なスタンドアローンの描画記述です。ここには、RHI が描画について知る必要のあるすべての情報が格納されます。これにより、描画ステート全体をそれらのシェーダ バインディングと一緒にキャッシュして再利用することができます。
静的描画リストとプリミティブ セット
4.22 で、メッシュ レンダリングパイプライン、静的描画リスト (TStaticMeshDrawList
)、およびプリミティブ セット (FTranslucentPrimSet
、FCustomDepthPrimSet
など) は FParallelMeshDrawCommandPass
に置き換えられました。FParallelMeshDrawCommandPass
は、パスごとに 1 つの可視メッシュ描画コマンド リストをカプセル化します。
新しいデザインには次の 2 つの重要な変更があります。
1 つ目は、 シーンごとのメッシュ リスト が 可視メッシュ リスト に置き換えられたことです。これまで、スタティック メッシュ パスの描画ではシーン内のパスごとのスタティック メッシュ リスト (
TStaticMeshDrawList
) 全体をトラバースし、各スタティック メッシュのFViewInfo::StaticMeshVisibilityMap
を確認することで、可視メッシュを選択していました。新しいデザインでは、描画は可視メッシュ描画コマンド配列 (FMeshDrawCommandPassSetupTaskContext::MeshDrawCommands
) を単にトラバースするだけです。新しいアプローチでは、シーンの複雑さに応じてスケーリングします。2 つ目の重要な変更は、スタティック メッシュ描画リストとダイナミック メッシュ動画リストのマージ方法です。この変更により、メッシュ描画パイプライン全体が簡素化され、レンダラによる静的描画と動的描画のソートも可能になっています。
このパイプラインには、DrawDynamicMeshPass
関数を使用した即時モード メッシュ レンダリング エミュレーションもあります。これは非常に柔軟なレンダリング パスですが、キャッシングと自動インスタンス化をサポートしておらず、複数の動的メモリ割り当てを行うので、パフォーマンスが重要ではないメッシュ パスにのみ使用してください。たとえば、これはエディタ専用のヘルパー メッシュのレンダリングを担っていた DrawViewElements
の代わりとなります。
描画ポリシー
FDepthDrawingPolicy
や FBasePassDrawingPolicy
などの描画ポリシーは、FDepthPassMeshProcessor
と FBasePassMeshProcessor
に置き換えられました。具体的なパス メッシュ プロセッサは FMeshProcessor
基本クラスから派生し、各 FMeshBatch
をそのパスに対する一連のメッシュ描画コマンドに変換する役割を担います。ここで、最終的な描画フィルタリング、シェーダ順序の選択、シェーダ バインディングの収集が行われます。
シェーダ バインディング
これまでは、すべてのシェーダ パラメータは、RHICmdList
で適切な描画ポリシーによって直接設定されていました。今では、すべてのパラメータが FMeshDrawSingleShaderBindings
に集められ、後で、描画中に SetOnCommandList
を呼び出すことで RHICmdList
に設定されます。これは、描画ステート全体をシェーダ バインディングと一緒にキャッシュするために必要です。
以前のパイプラインでは、FDrawingPolicyRenderState
を使用して、パス ユニフォーム バッファなどの一般的な高レベルのメッシュ パス レンダラ ステートを渡していました。新しいパイプラインでは、機能を大幅に変更することなく、FDrawingPolicyRenderState
を FMeshPassProcessorRenderState
に名前変更しています。
シェーダ バインディングの他の部分は、シェーダの SetParameters
と SetMesh
関数に埋め込まれました。これらの関数は、GetShaderBindings
および GetElementShaderBindings, and
によって置き換えられ、カスタマイズ可能な ShaderElementDataType
に描画ごとのパラメータを渡します。
リファクタリングによって、多くの緩いパラメータがパスごとまたは他のユニフォーム バッファに移動されました。これはパラメータを設定するうえで好ましい方法であり、緩いパラメータを使用すると自動インスタンス化が無効になるうえ、各描画の間に発生する定数バッファ更新による速度低下が起こります。
これまで、ViewUniformBuffer
や DepthPassUniformBuffer
といった標準ユニフォーム バッファは、毎フレーム新しいデータで再作成されていました。新しいパイプラインでは、それらは永続的でグローバル (FScene::FPersistentUniformBuffers
内に維持される) です。新しいデータ (コンテンツは新しい RHI 関数によって更新される) を RHIUpdateUniformBuffer
に渡すために再作成されることはありません。この間接参照により、メッシュ描画コマンドがキャッシュされている場合でも、シェーダはフレームごとのデータを受け取ることができます。
FPrimitiveViewRelevance
FPrimitiveViewRelevance
は、次の 2 つの追加の関連性フラグによって拡張されました。
bVelocityRelevance: 個別の速度パスに必須です。
bTranslucentSelfShadow: 透過セルフシャドウイングに必須です。
さらに、動的描画のすべてがビューの関連性に依存するようになりました。また、ビューの関連性で特定のパスを無効にすると、その描画も無効になります。
シェーダ
新しいパイプラインには GPUScene が導入されました。これは、シーン内のすべてのプリミティブに対するプリミティブ ユニフォーム バッファ データを含む構造化バッファです。現在このレンダリング パスを利用できるのは、ローカル頂点ファクトリ (スタティック メッシュ コンポーネント) と SM5 機能レベルだけです。GPUScene を有効にした状態でコンパイルするには、シェーダは、プリミティブ ユニフォーム バッファに直接アクセスするのではなく、GetPrimitiveData(PrimitiveId)
を使用する必要があります。
プリミティブ データへのアクセスは、Custom 表現式 マテリアル ノード内でよく使用されます。たとえば、プリミティブのバウンディング ボックスにアクセスする場合です。これらを変換するには、 Primitive.Member
を GetPrimitiveData(Parameters.PrimitiveId).Member
で置き換える必要があります。