レンダリング オーバーライド
このセクションでは、新しいレンダリング インタフェースについて説明します。 MPx3dModelView で公開されている既存のハードウェア「マルチパス」インタフェースを含めることが意図されています。
新しいインタフェースの主な機能
- 更新またはバッチ レンダーの開始時にレンダー ループを制御することができます。
- 明示的なレンダリング「操作」 (シーン レンダーなど)を定義し、それらのレンダー操作を任意の数だけ実行することができます。
- 明示的な「レンダー ターゲット」 (カラー、深度ステンシル バッファなど)を定義することができます。
- レンダリングがどこで発生するかについての「コンテキスト」を認識できます(レンダリングが発生するビューポートなど)。
- 現在利用可能なものに類似したレンダー操作の「オーバーライド」、およびオーバーライドの将来の拡張が可能です。
- シーンの描画と UI 要素を論理的に分離します。
- ハードウェア リソースにアクセスすることができます。
新しいインタフェースにおける主な相違点
- レンダリングの実行方法をオーバーライドまたは拡張するために統合レベルをビューまたはパネルにする必要はありません。 つまり、新しい API ビューと API パネルは不要です。 オーバーライドを導入するためのオーバーヘッドの量が大幅に減少しました。
- 前後にコールバックがある N 回の更新反復が必要な固定のループ ロジックはありません。
- 内部のレンダー ループ ロジックからのコールバックを遮断する代わりに、ロジックによって API ライタはレンダリング操作のセットをキューに入れることができます。
- レンダー ターゲットまたは出力バッファを外部的に定義する必要はなく、それらは公式のレンダリング リソースとして表示されます。
- メカニズムは標準化され、対話レンダリングとバッチ レンダリングの両方に対して動作します。
- レンダー ロジックの記述は、レンダラを実行するためにユーザによって公式に定義されます。 これは、「保持されたモード実行」と「即時のモード実行」の関係として考えることができます。
レンダー オーバーライド(Render Override)
レンダリング オーバーライドについては公式の概念があります。 オーバーライドは、インタラクティブ レンダリングの場合は更新ごと、バッチ レンダリング場合はフレーム出力ごとにレンダリングをすべてオーバーライドします。 オーバーライドはレンダリング操作のセットで構成されています。 このセットの主要なクラスが MRenderOverride です。
概して、操作は MPx3dModelView のパス ベース システムの「パス」と同じものと考えることができますが、明示的に定義されるという点が異なります。このセットの主要なクラスが MRenderOperation です。カスタムのユーザ操作のほかに、事前定義された操作があります。 基本の操作セットには以下が含まれます。
レンダー ターゲットのオーバーライド(Render Target Overrides)
レンダー ターゲットがフォーマライズされました。 そのため、レンダラとプラグイン ライタの両方で使用できる、管理され認識されるリソースのセットがあります。 フォーマライズされているということは、リソースを描画 API に依存しない方法で定義できるということです(たとえば OpenGL や DirectX など)。 提示されるインタフェースはレンダー ターゲットの記述、MRenderTargetDescription です。記述は、レンダリング動作に対する希望のレンダー ターゲット入力または出力を記述するために使用されます。
- デバイス レベル リソースへのアクセスは、ユーザがターゲットにアクセスするためのカスタム コードを書くことができるように提供されています。
- ユーザ定義のレンダー ターゲットを使用することもできますが、デバイスの状態を復元しないと、レンダラのレンダー ターゲットの状態が破損します。 これは新しい制限ではありません。
シェーダのオーバーライド(Shader Overrides)
MShaderManager インタフェースを使用すると、いくつかの単純なストック シェーダや、ファイル ベースのエフェクトにアクセスすることができます。続いて、これらのシェーダは、オーバーライドとして以下の 2 つの場所のいずれかに適用することができます。
- 3d シーン レンダーに対するオブジェクト シェーダ オーバーライドにより適用。
- quad blits に対する四角形レンダー シェーダーにより適用。
状態のオーバーライド(State Overrides)
状態の設定はフォーマライズされており、レンダラによって管理されます。 状態の設定はレンダー操作ごとに実行することができます。
シーン全般とユーザ操作のオーバーライド(General Scene and User Operation Overrides)
公式に提示される基本オーバーライドには以下が含まれます。
- カメラ仕様
- ワールドまたはシーンのフィルタリング
- オブジェクト タイプ フィルタ
- 描画モードのフィルタリング(塗り潰し、ワイヤ、コンポーネントなど)
- ユーザが別の既存オーバーライドを使用できるようにするインタラクティブ レンダリングのための M3dView へのアクセス。
- バッチ レンダリングの場合、ユーザはハードウェアおよび共通のレンダー グローバルにアクセスすることもできます。
- カスタムのユーザー動作が利用可能なので、ユーザは、以前のデバイスレベルの状態を復元するという制限のもと、自分自身の直接描画を自由に実行することができます。 同じ制限が、現在 MPx3dModelView オーバーライドを含むすべての既存のハードウェア レンダリング インタフェースに適用されます。
レンダー オーバーライドの定義のおもな手順は次のとおりです。
- カスタムのレンダー オーバーライドを派生させます。
- オーバーライドをレンダラに登録します。 オーバーライドはいくつでも登録できます。
- ビューポートまたはバッチ レンダリングのためのアクティブなオーバーライドを設定します。
- レンダー操作およびオーバーライドのセットを順番に並んだリストとして設定します。 レンダー ロジックがグラフの場合は、一連のレンダー操作に分割することができます。
- 照会された操作のリストを提供し、必要に応じて操作ごとにパラメータを更新します。
- カスタムの動作およびカスタムのオーバーライドは、中間および最終のレンダー ターゲットを遮断することができ、必要に応じてリソースを使用する場合にその機能を実行します(ディスクへの保存、カスタムのレンダリング コードへのルーティングなど)。
- レンダリング中にはシーン修正は発生しません。 これは新しい制限ではありません。
- 現在、シーン レンダーの特定のポイントに対するフィードバック(ループ)オーバーライドを提供するために使用できる正式なメカニズムはありません。このような特定のポイントに対するインタフェースはまだ存在しないからです。たとえば、シャドウ マップからカスタム ライトへのループは現在は不可能です。現在、カスタムのライト インタフェースが存在していないからです。