API ガイド > ビューポート 2.0 API (Viewport 2.0 API) >

# レンダリング オーバーライド(Rendering Overrides)

このセクションでは、新しいレンダリング インタフェースについて説明します。 「パス」という用語は、既存の mental ray ベースの「レンダー パス」システムとの混同を避けるため意図的に使用していません。 これはそのシステムのラッパーではありません。 その代りに、これは MPx3dModelView に表示される既存ハードウェアの「マルチパス」インタフェースを含めるように意図されています。

新しいインタフェースの主な機能

- 更新またはバッチ レンダーの開始時にレンダー ループを制御することができます。
- 明示的なレンダリング「操作」 (シーン レンダーなど)を定義し、それらのレンダー操作を任意の数だけ実行することができます。
- 明示的な「レンダー ターゲット」 (カラー、深度ステンシル バッファなど)を定義することができます。
- レンダリングがどこで発生するかについての「コンテキスト」を認識できます(レンダリングが発生するビューポートなど)。
- 現在利用可能なものに類似したレンダー操作の「オーバーライド」、およびオーバーライドの将来の拡張が可能です。
- シーンの描画と UI 要素を論理的に分離します。
- ハードウェア リソースにアクセスすることができます。

新しいインタフェースにおける主な相違点

- レンダリングの実行方法をオーバーライドまたは拡張するために統合レベルをビューまたはパネルにする必要はありません。 つまり、新しい API ビューと API パネルは不要です。 オーバーライドを導入するためのオーバーヘッドの量が大幅に減少しました。
- 前後にコールバックがある N 回の更新反復が必要な固定のループ ロジックはありません。
- 内部のレンダー ループ ロジックからのコールバックを遮断する代わりに、ロジックによって API ライタはレンダリング操作のセットをキューに入れることができます。
- レンダー ターゲットまたは出力バッファを外部的に定義する必要はなく、それらは公式のレンダリング リソースとして表示されます。
- メカニズムは標準化され、対話レンダリングとバッチ レンダリングの両方に対して動作します。
- レンダー ロジックの記述は、レンダラを実行するためにユーザによって公式に定義されます。 これは、「保持されたモード実行」と「即時のモード実行」の関係として考えることができます。

主要なコンセプトと構成

レンダー オーバーライド(Render Override)

レンダリング オーバーライドについては公式の概念があります。 オーバーライドは、インタラクティブ レンダリングの場合は更新ごと、バッチ レンダリング場合はフレーム出力ごとにレンダリングをすべてオーバーライドします。 オーバーライドはレンダリング操作のセットで構成されています。 このセットの主要なクラスが MRenderOverride です。

レンダー操作(Render Operation)

概して、操作は MPx3dModelView のパス ベース システムの「パス」と同じものと考えることができますが、明示的に定義されるという点が異なります。 このセットの主要なクラスが MRenderOperation です。 カスタムのユーザ操作のほかに、事前定義された操作があります。 基本の操作セットには以下が含まれます。

- バックグラウンドのクリア操作(MClearOperation)
- 3D シーンのレンダー操作(MSceneRender)
- A 2D HUD (ヘッドアップ ディスプレイ操作)(MHUDRender)
- ユーザ定義操作(MUserRenderOperation)
- 2D スクリーンのスペース四角形をレンダリングする quad blit 操作(MQuadRender)
- ターゲット表現操作(MPresentTarget)

レンダー ターゲットのオーバーライド(Render Target Overrides)

レンダー ターゲットがフォーマライズされました。 そのため、レンダラとプラグイン ライタの両方で使用できる、管理され認識されるリソースのセットがあります。 フォーマライズされているということは、リソースを描画 API に依存しない方法で定義できるということです(たとえば OpenGL や DirectX など)。 提示されるインタフェースはレンダー ターゲットの記述、MRenderTargetDescription です。 記述は、レンダリング動作に対する希望のレンダー ターゲット入力または出力を記述するために使用されます。

- デバイス レベル リソースへのアクセスは、ユーザがターゲットにアクセスするためのカスタム コードを書くことができるように提供されています。
- ユーザ定義のレンダー ターゲットを使用することもできますが、デバイスの状態を復元しないと、レンダラのレンダー ターゲットの状態が破損します。 これは新しい制限ではありません。

シェーダのオーバーライド(Shader Overrides)

MShaderManager インタフェースを使用すると、いくつかの単純なストック シェーダや、ファイル ベースのエフェクトにアクセスすることができます。 続いて、これらのシェーダは、オーバーライドとして以下の 2 つの場所のいずれかに適用することができます。

- 3d シーン レンダーに対するオブジェクト シェーダ オーバーライドにより適用。
- quad blits に対する四角形レンダー シェーダーにより適用。

状態のオーバーライド(State Overrides)

状態の設定はフォーマライズされており、レンダラによって管理されます。 状態の設定はレンダー操作ごとに実行することができます。

シーン全般とユーザ操作のオーバーライド(General Scene and User Operation Overrides)

公式に提示される基本オーバーライドには以下が含まれます。

- カメラ仕様
- ワールドまたはシーンのフィルタリング
- オブジェクト タイプ フィルタ
- 描画モードのフィルタリング(塗り潰し、ワイヤ、コンポーネントなど)
- ユーザが別の既存オーバーライドを使用できるようにするインタラクティブ レンダリングのための M3dView へのアクセス。
- バッチ レンダリングの場合、ユーザはハードウェアおよび共通のレンダー グローバルにアクセスすることもできます。
- カスタムのユーザー動作が利用可能なので、ユーザは、以前のデバイスレベルの状態を復元するという制限のもと、自分自身の直接描画を自由に実行することができます。 同じ制限が、現在 MPx3dModelView オーバーライドを含むすべての既存のハードウェア レンダリング インタフェースに適用します。

レンダー ロジックの構築

レンダー オーバーライドの定義のおもな手順は次のとおりです。

1. カスタムのレンダー オーバーライドを派生させます。
2. オーバーライドをレンダラに登録します。 オーバーライドはいくつでも登録できます。
3. ビューポートまたはバッチ レンダリングのためのアクティブなオーバーライドを設定します。
4. レンダー操作およびオーバーライドのセットを順番に並んだリストとして設定します。 レンダー ロジックがグラフの場合は、一連のレンダー操作に分割することができます。
5. 照会された操作のリストを提供し、必要に応じて操作ごとにパラメータを更新します。
6. カスタムの動作およびカスタムのオーバーライドは、中間および最終のレンダー ターゲットを遮断することができ、必要に応じてリソースを使用する場合にその機能を実行します(ディスクへの保存、カスタムのレンダリング コードへのルーティングなど)。

主要な制限

- レンダリング中にはシーン修正は発生しません。 これは新しい制限ではありません。
- フィードバック(ループ)オーバーライド出力をシーン レンダー内の特定の場所に戻すためのインタフェースは存在しますが、公式のメカニズムはありません。 たとえば、シャドウ マップからカスタム ライトへのループは現在はカスタムのライト インタフェースとしては存在していません。