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

# シーンのオーバーライド(Scene Overrides)

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

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

MPxDrawOverride

MPxDrawOverride は、古い MPxLocator クラスによって提供される描画オーバーライド機能をフォーマライズしています。 それは、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 の知識を必要としません。

MPxShaderOverride

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

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

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

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