MPxDrawOverride は、ビューポート 2.0 でプラグイン DAG オブジェクトの低レベルの描画を定義するための API エントリ ポイントです。このインタフェースは、シェーダの割り当てに関係なく、関連付けられた DAG オブジェクトを描画するための完全かつ総合的なコントロール(と責任)を提供する古い(固定機能など)描画コードのバック ドアとして設計されています。インタフェースの開放的な性質により、Maya はこのインタフェースを使用して描画するオブジェクト(統合なしや頂点データの共有なしなど)のレンダリングを最適化できません。このインタフェースは描画 API にまったく依存しないわけではありません。つまり、プラグインで OpenGL と DirectX の両方をサポートする必要がある場合は、複数のコード パスを記述して保持する必要があります。ライティングとの統合は存在しません。透明度はサポートされています。ただし、MPxDrawOverride::isTransparent() が true に設定されている場合でも、MPxDrawOverride は、ウェイト付けした平均値や深度ピーリングなどの拡張透明度アルゴリズムをサポートしません。ウェイト付けした平均値(Weighted Average)または深度ピーリング(Depth Peeling)のいずれかの透明度アルゴリズムが選択されている場合、既定のオブジェクトのソート(Object Sorting)アルゴリズムが代わりに使用されます。エフェクトは、MPxDrawOverride::excludedFromPostEffects() によってサポートされます。セットアップの一部が Maya によって実行される MPxGeometryOverride や MPxShaderOverride とは異なり、MPxDrawOverride では、プラグインの作成者がすべてのシェーダのセットアップ、ジオメトリのバインド、および描画の呼び出しを手動で行う必要があります。このインタフェースは、プラグイン DAG オブジェクトの描画を管理するための最高レベルの機能を提供しますが、それに見合うレベルの責任も伴います。
MPxDrawOverride の実装は、分類文字列を使用して MDrawRegistry に登録する必要があります。分類文字列は、システムが正しく認識できるように「drawdb/geometry」で始まる必要があります。オーバーライドの分類文字列を満たす分類文字列を使用する DAG オブジェクトは、オーバーライドを使用して評価されます。Maya は、関連付けられている DAG オブジェクトごとに、登録されている MPxDrawOverride のインスタンスを 1 つずつ作成します。
オーバーライドには、いくつかのヘルパー メソッド(transform()、boundingBox()、および isBounded())があります。これらのメソッドは、描画可能シーンの管理目的に関する情報を取得するために、描画前に Maya によって呼び出される場合があります。Maya は、「バウンディング ボックス」表示モードのときに、MPxDrawOverride のバウンディング ボックスを描画します。isBounded() が false 値を返す場合、Maya は描画内容を判断できません。この場合は、MPxDrawOverride が独自のバウンディング ボックスを描画します。
実際の描画はリフレッシュのたびに行われ、準備と実行の 2 つのステージで構成されます。
prepareForDraw() ステージで Maya ディペンデンシー グラフから必要なデータを取得してキャッシュする必要があります。描画メソッドで Maya ディペンデンシー グラフからデータを取得することは無効です。これを行うと、Maya が不安定になる可能性があります。実装では、このメソッドからデータへのポインタを返すことにより、データ キャッシングを Maya で処理できる場合があります。この同じポインタが描画コールバックに渡されます。それ以降の描画で、データを再割り当てする代わりに修正して再利用できるように、このポインタが再び prepareForDraw() メソッドに渡されます。
描画メソッドでは、オーバーライドは必要に応じて(Maya ディペンデンシー グラフの評価をトリガーすることとは別に)自由にオブジェクトを描画できます。デバイス情報へのアクセスは MDrawContext を使用して取得でき、オーバーライドは MStateManager および MTextureManager を使用してデバイスの状態とリソースを処理できます。オーバーライドが(何らかの方法で)状態を変更する必要がある場合は、描画の破損を防ぐために、実行が完了する前にその状態を復元できるようにする必要があります。
図 44: 描画オーバーライドは、カリングの変換および範囲情報を提供し、「更新フェーズ」中に描画準備を実行するために呼び出され、その後、「描画フェーズ」中に描画を実行するために呼び出されます。更新と描画の間の中間フェーズはスキップされます。