シーンのオーバーライド

シーンのオーバーライド クラスによって、プラグインは、ジオメトリ、シェーダ、およびその他のレンダリング可能な要素を含む、シーンの要素をオーバーライドできます。これらのクラスは、MPxLocatorNodeMPxSurfaceShapeMPxComponentShapeMPxHwShaderNode、および MPxHardwareShader 内の古いレンダリング コードを置き換える新しい API を提供します。MPxNode から派生したプラグイン ソフトウェア シェーディング ノードのハードウェア シェーダのフラグメント コードを定義することもできます。ユーザ プラグインはこれらの既存のベース クラスから引き続き派生させることができます。ただし、ビューポート 2.0 でカスタム レンダリング ロジックを定義するには、次のオーバーライドの 1 つを登録する必要があります。したがって、既存のレンダリング コードをそのままにしておくことができます。これにより、プラグインはパイプラインを遷移させるときに、旧式のビューポートとビューポート 2.0 の両方で同時に動作することができます。旧式のビューポート描画では、引き続き古いコードを呼び出し、ビューポート 2.0 では、下に定義されているオーバーライドを使用します。

古いインタフェースの多くは、レンダリング時に生の C++ インタフェースを提供しましたが、この方法では、特にシーン内のプラグイン要素の数が多い場合に十分なパフォーマンスが発揮されません。 新しいオーバーライドは、上記のジオメトリ データ オブジェクトを使用し、キャッシュされ、保持されたモードのレンダリング インタフェースをサポートします。このインタフェースはシェーダとシェイプをより明確に分離し、また、新しいビューポート内で、パフォーマンス最適化機能の多くをそれらに対して利用できるようにします(ジオメトリの結合など)。 それでも、レンダリング対象の選択を完全にコントロールする必要がある場合があります。そのために、MPxLocatorNode および MPxSurfaceShapeUI に備わっているインタフェースを継承する即時モード インタフェースが提供されています。

MPxDrawOverride

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 クラスを参照してください。

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

MPxSubSceneOverride は、MPxDrawOverride および MPxGeometryOverride の代替の 1 つであり、多数の独立した描画可能オブジェクトを生成するために必要なビューポート 2.0 でプラグインの DAG オブジェクトを表すために最適化されています。たとえば、単一のノードで数万の描画可能オブジェクトを生成する必要がある場合があるため、サブシーン全体(gpuCache プラグインなど)を定義できるプラグイン ノードは、このインタフェースに適しています。

MPxSubSceneOverride の実装は、インタフェース MRenderItem を使用して動作し、関連付けられた DAG オブジェクトのすべてのインスタンスを描画するために必要なレンダー項目のリストを提供します。実装は、MPxDrawOverride 同様、DAG オブジェクト タイプに登録する必要があります。

MPxSubSceneOverride の実装によって生成されたレンダー項目は、多数のレンダー項目(数万以上)をパフォーマンスの高い方法で処理するために最適化された、特別なコンテナに保存されます。実装は、各レンダー項目にシェーダおよびオプションの行列を割り当てる必要があり、シェーダの必要に応じて各レンダー項目にジオメトリを提供する必要もあります。ジオメトリはレンダー項目間で共有でき、ジオメトリの管理は実装に委ねられます。

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

MPxShaderOverride

MPxShaderOverride を使用すると、ユーザは「フル シェーディング効果」を Maya のシェーディング ノード(カスタムまたは標準)に関連付けるためのカスタム オーバーライドを作成することができます。 その主要な用途は、既存のプラグイン シェーダにハードウェアの効果を関連付けることです。

「フル シェーディング効果」は、指定したオブジェクトをレンダリングするために含まれる完全なシェーディングおよびライティングを定義します。 ジオメトリ、テクスチャ、ライトなどのシェーディングのための入力リソースが定義され、必要に応じてオーバーライドを介してシェーディング効果にバインドされます。 オーバーライドはこれらのタスクを完全に実行します。 たとえば、ハードウェア シェーディングの場合、これは Maya シーン内で定義されたリソースを使用することができる CgFx または HLSL エフェクト ファイル レンダラを実装することと考えることができます。

MPxDrawOverride と同様、これは低レベルのクラスです。 関連するシェーダのインスタンスを使用して描画を行うオブジェクトは、描画時に MPxShaderOverride 描画コールバックをトリガします。 実装ではすべてのシェーディング情報のセットアップを実行します。 その後、MDrawContext を通してジオメトリ自身を問い合わせ、すべてのバインドと描画を実行するか、あるいは Maya へのコールバックを実行し、ビューポート 2.0 が現在の状態を使用して描画を処理できるようにします。

他の 2 つの新しいインスタンスと同様に、分類文字列を使用して MPxShaderOverrideMDrawRegistry に登録しなければなりません。 これは、プラグイン シェーダ タイプあるいは既存の Maya シェーダ タイプのいずれかに関連付けることができることを意味します。 ビューポート 2.0 シェーダの分類文字列は、「drawdb/shader/」で始まらなければなりません(たとえば、標準の Lambert は「drawdb/shader/surface/lambert」となります)。

MPxShadingNodeOverride

MPxShadingNodeOverride を使用して、ユーザは、ビューポート 2.0 で、プラグイン ソフトウェア シェーディング ノード(MPxNode から派生)が他のソフトウェア シェーディング ノードと相互作用する方法を指定できます。具体的には、このクラスを使用すると、ビューポート 2.0 のシェーディング グラフでシェーディング ノードを表すために使用されるシェーディング フラグメント(またはフラグメント グラフ)について Maya に通知できます。このシステムを使用すると、ソフトウェア シェーディング ノードでは、内部シェーディング ノードおよび関連のないプラグインからのプラグイン シェーディング ノードの両方とシームレスに動作できます。ビューポート 2.0 にある他のすべての機能(ライト、シャドウ、エフェクト、透明度など)も MPxShadingNodeOverride の実装とシームレスに動作します。

MPxShadingNodeOverrideMPxShaderOverride の違いは、MPxShaderOverride の実装ではシェーディング ネットワーク全体(ライティングを含む)のシェーディング エフェクトを作成する必要があるのに対し、MPxShadingNodeOverride では個々のノードの小さなフラグメントを生成する必要のみがある点です。

シェーディング フラグメントおよびグラフは MFragmentManager によって管理されます。新しいフラグメントやグラフは、XML を使用して定義され、MFragmentManager を介して Maya に登録されます。次に、これらのフラグメントおよびグラフを、MPxShadingNodeOverride の実装によって参照できます。

MPxShaderOverride 同様、MPxShadingNodeOverride の実装は、分類文字列を使用して MDrawRegistry に登録する必要があります。つまり、実装はプラグイン ノードに関連付けることができ、既存の Maya シェーダの動作をオーバーライドするために実装を使用できます。ビューポート 2.0 シェーダの分類文字列は「drawdb/shader/」で始める必要があります(たとえば、Maya プロシージャ チェッカ テクスチャは「drawdb/shader/texture/2d/checker」に分類)。

MPxSurfaceShadingNodeOverride

MPxSurfaceShadingNodeOverride ソフトウェア サーフェス シェーダ ノードに特化した MPxShadingNodeOverride の拡張機能です。ビューポート 2.0 をサポートする場合は、ビューポート 2.0 の変換システムによってサーフェス シェーダと同様に処理されるように、Maya シェーディング エンジンに直接接続される可能性のあるプラグイン ソフトウェア サーフェス シェーダ ノードは、MPxShadingNodeOverride からではなくこのクラスから派生するオーバーライドを定義する必要があります。

MPxShadingNodeOverride 同様、MPxSurfaceShadingNodeOverride の実装は、分類文字列を使用して MDrawRegistry に登録する必要があります。ビューポート 2.0 のサーフェス シェーダの分類文字列は「drawdb/shader/surface/」で始める必要があります(たとえば、Maya の Blinn シェーダは「drawdb/shader/surface/blinn」に分類されます)。