シーンのオーバーライド クラスによって、プラグインは、ジオメトリ、シェーダ、およびその他のレンダリング可能な要素を含む、シーンの要素をオーバーライドできます。これらのクラスは、MPxLocatorNode、MPxSurfaceShape、MPxComponentShape、MPxHwShaderNode、および MPxHardwareShader 内の古いレンダリング コードを置き換える新しい API を提供します。MPxNode から派生したプラグイン ソフトウェア シェーディング ノードのハードウェア シェーダのフラグメント コードを定義することもできます。ユーザ プラグインはこれらの既存のベース クラスから引き続き派生させることができます。ただし、ビューポート 2.0 でカスタム レンダリング ロジックを定義するには、次のオーバーライドの 1 つを登録する必要があります。したがって、既存のレンダリング コードをそのままにしておくことができます。これにより、プラグインはパイプラインを遷移させるときに、旧式のビューポートとビューポート 2.0 の両方で同時に動作することができます。旧式のビューポート描画では、引き続き古いコードを呼び出し、ビューポート 2.0 では、下に定義されているオーバーライドを使用します。
古いインタフェースの多くは、レンダリング時に生の C++ インタフェースを提供しましたが、この方法では、特にシーン内のプラグイン要素の数が多い場合に十分なパフォーマンスが発揮されません。 新しいオーバーライドは、上記のジオメトリ データ オブジェクトを使用し、キャッシュされ、保持されたモードのレンダリング インタフェースをサポートします。このインタフェースはシェーダとシェイプをより明確に分離し、また、新しいビューポート内で、パフォーマンス最適化機能の多くをそれらに対して利用できるようにします(ジオメトリの結合など)。 それでも、レンダリング対象の選択を完全にコントロールする必要がある場合があります。そのために、MPxLocatorNode および MPxSurfaceShapeUI に備わっているインタフェースを継承する即時モード インタフェースが提供されています。
MPxDrawOverride は、古い MPxLocatorNode クラスで規定された描画オーバーライド機能を正式なものにしています。それは、Maya によって特定のシェイプ タイプを描画する必要のあるときに、ユーザが任意の OpenGL 呼び出しを実行できるようにする単純なインタフェースを提供します。 このインタフェースを使用する場合、プラグインは描画に必要なすべてのジオメトリ、マテリアル リソースおよびセットアップを完全に制御することができます。 これはまた、プラグインが新しいビューポートによって提供されるリソース管理およびリソース最適化機能を利用しないことを意味します。 それでも、軽量の UI あるいは大きなプロキシ ジオメトリにとっては、このアプローチが適していることがあります。
MPxDrawOverride の実装を、特定の種類の Maya DAG オブジェクト(プラグインまたは標準)に対する MDrawRegistry クラスに登録しなければなりません。登録は分類文字列によって行います。 このクラスは、プラグイン シェイプの描画を提供するため、すなわちメッシュや NURBS サーフェスなど標準シェイプの描画を完全にオーバーライドするために使用することができます。 DAG オブジェクト タイプがビューポート 2.0 で認識されるようにするには、「drawdb/geometry/」で始まる、MPxDrawOverride の実装を登録するために使用されるのと同じ分類文字列で登録しなければなりません。たとえば、標準の Maya メッシュ タイプは「drawdb/geometry/mesh」として登録されます。そのため、標準の描画を MPxDrawOverride の実装によってオーバーライドするには、この実装を分類文字列「drawdb/geometry/mesh」で登録します。
このクラスは、描画に対して非常に低レベルのアクセスを提供します。 正しい描画を取得し、他のオブジェクトの描画を破壊しないよう、すべてのシェーダを手動でセットアップし、適切な状態管理を行う必要があります。 状態管理を支援するため、MDrawContext と呼ばれる新しいユーティリティ クラスが追加されました。このオブジェクトのインスタンスは常に MPxDrawOverride の描画呼び出しに渡されます。
ジオメトリに対する上位インタフェースについては、新しい MPxGeometryOverride クラスを参照してください。
このクラスは、古い API からの大幅な変更のうちの 1 つを表します。MPxSurfaceShapeUI が C++ の描画コントロール機能を提供していたとすると、MPxGeometryOverride は純粋にジオメトリとレンダー項目を定義するためのインタフェースです。実際のレンダリングのすべての制御はシェーダによって行われます。 これにより、このクラスは外部シェーダを扱うことができ、ジオメトリ統合などのパフォーマンス最適化機能を利用することができます。
MPxGeometryOverride は高レベルのインタフェースで、ユーザはこれを使用することにより、ビューポート 2.0 システムが特定の DAG オブジェクトを描画するために使用するジオメトリ バッファ、インデックス バッファ、およびカスタムのレンダー項目を提供することができます。データは、主として上に述べた MGeometry クラスによって転送されます。MPxGeometryOverride の実装は、MPxDrawOverride のような DAG オブジェクト タイプに対して登録しなければなりません。
MPxGeometryOverride の実装は、関連する DAG オブジェクトが変更されると呼び出されます。実装は、更新されたジオメトリ バッファおよびインデックス付け情報を提供するものと期待されます。これらはビューポート 2.0 によってパックされ、グラフィックス カードに格納されます(可能な場合)。MPxGeometryOverride は、何らかの更新が必要で、その更新がすべてのフレームでは実行されない場合にのみ呼び出されます。
MPxDrawOverride と同様、MPxGeometryOverride は、いずれかのプラグイン シェイプのジオメトリを提供するか、標準の Maya シェイプの動作をオーバーライドするために使用することができます。この上位クラスを使用することの最大の利点は、それを使用するオブジェクトがビューポート 2.0 によってサポートされるシェーダを自動的に処理するということです。このクラスはデバイスに依存しないため、直接的な OpenGL の知識を必要としません。
MPxSubSceneOverride は MPxDrawOverride および MPxGeometryOverride に代わるインタフェースで、多数の独立した描画可能オブジェクトを生成する必要があるビューポート 2.0 のプラグイン DAG オブジェクトを表すために特別に最適化されています。たとえば、サブシーン全体を定義できるプラグイン ノード(gpuCache プラグインなど)はこのインタフェースによく適合します。単一ノードは何万もの描画可能オブジェクトを生成しなければならない場合があるからです。
MPxSubSceneOverride の実装は、インタフェース MRenderItem を使用して動作し、関連付けられた DAG オブジェクトのすべてのインスタンスを描画するために必要なレンダー項目のリストを提供します。実装は、MPxDrawOverride と同様、DAG オブジェクト タイプに対して登録する必要があります。
MPxSubSceneOverride の実装によって生成されたレンダー項目は、多数のレンダー項目(数万以上)をパフォーマンスの高い方法で処理するために最適化された、特別なコンテナに保存されます。実装は、各レンダー項目にシェーダおよびオプションの行列を割り当てる必要があり、シェーダの必要に応じて各レンダー項目にジオメトリを提供する必要もあります。ジオメトリはレンダー項目間で共有でき、ジオメトリの管理は実装に委ねられます。
MPxSubSceneOverride は、実装に与えられるコントロールの量に関して、MPxDrawOverride と MPxGeometryOverride の間に位置します。MPxDrawOverride はオブジェクト全体の描画を完全にコントロールできますが、結果として実装は描画についてのすべての責任を負います。MPxGeometryOverride は、比較的簡単に使用できますが、結果として使用できる描画のコントロールは制限されます。MPxSubSceneOverride はすべてのレンダー項目、ジオメトリ、シェーダを完全に定義し、詳細にコントロールすることができます。ただし、この定義はハードウェアの描画 API から抽象化されます。そのため、DirectX と OpenGL の両方のサポートを得るための実装が 1 つで済みます。さらに、Maya がレンダー項目の描画を処理するので、項目は Maya のレンダリング パイプラインへの関与を強化できます(スクリーン スペース アン ビエント オクルージョン、透明度のソート、影付け/影受けなどのスクリーン スペース エフェクトを含む)。
MPxShaderOverride を使用すると、ユーザは「フル シェーディング効果」を Maya のシェーディング ノード(カスタムまたは標準)に関連付けるためのカスタム オーバーライドを作成することができます。その主要な用途は、既存のプラグイン シェーダにハードウェアの効果を関連付けることです。
「フル シェーディング効果」は、指定したオブジェクトをレンダリングするために含まれる完全なシェーディングおよびライティングを定義します。 ジオメトリ、テクスチャ、ライトなどのシェーディングのための入力リソースが定義され、必要に応じてオーバーライドを介してシェーディング効果にバインドされます。 オーバーライドはこれらのタスクを完全に実行します。 たとえば、ハードウェア シェーディングの場合、これは Maya シーン内で定義されたリソースを使用することができる CgFx または HLSL エフェクト ファイル レンダラを実装することと考えることができます。
MPxDrawOverride と同様、これは低レベルのクラスです。関連するシェーダのインスタンスを使用して描画を行うオブジェクトは、描画時に MPxShaderOverride 描画コールバックをトリガします。この実装は、すべてのシェーディング情報のセットアップを行います。その後、MDrawContext を通してジオメトリ自身を問い合わせ、すべてのバインドと描画を実行するか、あるいは Maya へのコールバックを実行し、ビューポート 2.0 が現在の状態を使用して描画を処理できるようにします。
他の 2 つの新しいインスタンスと同様に、分類文字列を使用して MPxShaderOverride を MDrawRegistry に登録しなければなりません。これは、プラグイン シェーダ タイプあるいは既存の Maya シェーダ タイプのいずれかに関連付けることができることを意味します。 ビューポート 2.0 シェーダの分類文字列は、「drawdb/shader/」で始まらなければなりません(たとえば、標準の Lambert は「drawdb/shader/surface/lambert」となります)。
ユーザは MPxShadingNodeOverride を使用して、ビューポート 2.0 でプラグイン ソフトウェア シェーディング ノード(MPxNode から派生)が他のソフトウェア シェーディング ノードと相互作用する方法を指定できます。具体的には、このクラスを使用すると、ビューポート 2.0 のシェーディング グラフでシェーディング ノードを表すために使用されるシェーディング フラグメント(またはフラグメント グラフ)について Maya に通知できます。このシステムを使用すると、プラグイン ソフトウェア シェーディング ノードは、内部シェーディング ノードおよび関連のないプラグインからのプラグイン シェーディング ノードの両方とシームレスに動作できます。ビューポート 2.0 にある他のすべての機能(ライト、シャドウ、エフェクト、透明度など)も MPxShadingNodeOverride. の実装とシームレスに動作します。
MPxShadingNodeOverride と MPxShaderOverride の違いは、MPxShaderOverride の実装ではシェーディング ネットワーク全体(ライティングを含む)のシェーディング エフェクトを作成する必要があるのに対し、MPxShadingNodeOverride では個々のノードの小さなフラグメントのみを生成する必要がある点です。
シェーディング フラグメントおよびシェーディング グラフは MFragmentManager によって管理されます。新しいフラグメントやグラフは、XML を使用して定義され、MFragmentManager を介して Maya に登録されます。これらのフラグメントおよびグラフは、後で MPxShadingNodeOverrid の実装によって参照できます。
MPxShaderOverride と同様、MPxShadingNodeOverride の実装は、分類文字列を使用して MDrawRegistry に登録する必要があります。つまり、実装はプラグイン ノードに関連付けることができ、既存の Maya シェーダの動作をオーバーライドするために実装を使用できます。ビューポート 2.0 シェーダの分類文字列は「drawdb/shader/」で始める必要があります(たとえば、Maya プロシージャ チェッカ テクスチャは「drawdb/shader/texture/2d/checker」に分類)。
MPxSurfaceShadingNodeOverride は、ソフトウェア サーフェス シェーダ ノードに特化した MPxShadingNodeOverride の拡張機能です。ビューポート 2.0 をサポートする場合は、ビューポート 2.0 の変換システムによってサーフェス シェーダと同様に処理されるように、Maya シェーディング エンジンに直接接続される可能性のあるプラグイン ソフトウェア サーフェス シェーダ ノードは、MPxShadingNodeOverride からではなく、このクラスから派生するオーバーライドを定義する必要があります。
MPxShadingNodeOverride と同様、MPxSurfaceShadingNodeOverride の実装は、分類文字列を使用して MDrawRegistry に登録する必要があります。ビューポート 2.0 のサーフェス シェーダの分類文字列は「drawdb/shader/surface/」で始める必要があります(たとえば、Maya の Blinn シェーダは「drawdb/shader/surface/blinn」に分類されます)。