サブシーン オーバーライド

MPxSubSceneOverride は、多数の描画可能な図形が必要なプラグイン DAG オブジェクトの高レベルのビューポート 2.0 描画を定義するための API エントリ ポイントです。任意の型の DAG オブジェクトで使用できますが、MPxSubSceneOverride は、大きくて複雑なオブジェクトのセットを Maya の他の部分に不透明な方法で管理する「シーンキャッシュ」スタイルのノードをサポートするための効率的で緊密に統合されたパスとして設計されています。Maya のシーン アセンブリ ワークフローで使用される gpuCache プラグインは、この種の DAG オブジェクト型の良い例です。

MPxSubSceneOverride の実装は、分類文字列を使用して MDrawRegistry に登録する必要があります。分類文字列は、システムで正しく認識されるように「drawdb/subscene」で始まる必要があります。オーバーライドの分類文字列を満たす分類文字列を使用する DAG オブジェクトは、オーバーライドを使用して評価されます。

MPxSubSceneOverride は描画 API に依存しません。実装は、MRenderItem インタフェースを使用して動作し、関連する DAG オブジェクトのすべてのインスタンスを描画するために MRenderItem オブジェクトのコレクションを管理するためだけに必要です。オーバーライドの登録時に使用された分類文字列を満たす分類文字列を含む Maya シーン内の各オブジェクトに対して、オーバーライドの 1 つの実装が作成されます。関連付けられた DAG オブジェクトがインスタンス化されている場合、オーバーライドがすべてのインスタンスの描画を行います。

レンダー項目のコレクションは MSubSceneContainer オブジェクトに格納されます。このコンテナは、高パフォーマンスの方法で多数のレンダー項目(数万以上)を保存してアクセスするのに適しています。実装は、各レンダー項目にシェーダおよびオプションの行列を割り当てる必要があり、シェーダの必要に応じて各レンダー項目にジオメトリを提供する必要もあります。ジオメトリはレンダー項目間で共有でき、ジオメトリの管理は実装に委ねられます。

MPxSubSceneOverride は、実装に与えられるコントロールの範囲に関して、MPxDrawOverrideMPxGeometryOverride の間になります。MPxDrawOverride は、オブジェクト全体の描画を完全にコントロールできますが、結果として実装は描画についてのすべての責任を負います。MPxGeometryOverride は、比較的簡単に使用できますが、結果として使用できる描画のコントロールは制限されます。MPxSubSceneOverride は、すべてのレンダー項目、ジオメトリ、シェーダを完全に定義でき、高度なコントロールが提供されます。ただし、この定義はハードウェア描画 API からは抽象化されます。したがって、DirectX と OpenGL の両方をサポートするために必要な実装は 1 つだけです。さらに、Maya がレンダー項目の描画を処理するので、アイテムは Maya のレンダリング パイプラインに完全に参加できます(スクリーン スペース アンビエント オクルージョン、透明度のソート、影付け/影受けなどのスクリーン スペース エフェクトを含む)。最後に、レンダー項目は描画モードを指定することができます(ワイヤフレーム、シェーディング、テクスチャ、バウンディング ボックス)。したがって、実装ではこれらのモードを手動でトラックする必要はありません。

MPxSubSceneOverride には 2 つのステージがあり、描画の開始前にこれらのステージがすべてのフレームで呼び出されます。各ステージでは、MFrameContext のインスタンスによって、レンダラの現在の状態に関する情報が提供されます。実装では、いつでも必要な情報を Maya から直接照会することもできます。

requiresUpdate() ステージでは、MPxSubSceneOverride の実装は、関連する DAG オブジェクトのレンダー項目のセットを更新する必要があるかどうかを、Maya に通知する必要があります。必要ない場合、2 番目のステージはスキップされます。これにより、関連するノードが最後の更新以降に変更されていない場合、大量の処理を避けることができます。

update() ステージでは、実装はコンテナのレンダー項目を追加または除去でき、既存のレンダー項目を修正できます。実装では、コンテナ内のレンダー項目ごとに、MPxSubSceneOverride::setGeometryForRenderItem() を呼び出して、レンダー項目のジオメトリを提供する必要があります。ジオメトリを持たないレンダー項目は描画されません。レンダー項目は更新ステージの間にのみ修正できます。それ以外のときに行うことはエラーであり、行うと不安定になることがあります。

更新ステージが完了した後、コンテナ内のレンダー項目は、有効であり、有効なシェーダがあり、シェーダの要件を満たすジオメトリがあり、ビューポート描画モード(つまり、ワイヤフレームかシェーディングか)によって除外されていない場合に限り描画されます。レンダー項目は、明示的に除去されるまでコンテナに存在しています。したがって、描画する必要のあるデータが静的である場合、MPxSubSceneOverride の実装では、初期更新ステージの後で、requiresUpdate() のすべての呼び出しで false を返すことができます。

ビューポート 2.0 での表示をコントロールするためにレンダー項目を修正する方法の詳細については、MRenderItem インタフェースを参照してください。