MFrameContext は、現在のレンダー フレームの情報にアクセスできます。利用可能な情報はデバイスの状態とは無関係であるため、描画以外でも使用できます。
このインタフェースは、すべてのビューポート 2.0 インタフェースで一般的に使用できます。これには、一時的な UI (ツールやマニピュレータなど)を描画する MUIDrawManager を使用しているインタフェース内からのアクセスが含まれます。
MFrameContext (および MDrawContext)を使用する上での重要な利点の 1 つは、再計算を回避するために状態がキャッシュ化されることです。通常のデータ クエリーは GPU デバイスにアクセスしないため、コストのかかるパイプラインの区画を回避するのに役立ちます。たとえば、プラグインは OpenGL で次のようにモデル ビューと投影行列を取得するためのコールを行う場合があります。
float tmp[4][4]; glGetFloatv(GL_MODELVIEW_MATRIX, &tmp[0][0]); glGetFloatv(GL_PROJECTION_MATRIX, &tmp[0][0]);
HWRender::MDrawContext& context; MStatus status; MMatrix transform = context.getMatrix(MHWRender::MDrawContext::kWorldViewMtx, &status); MMatrix projection = context.getMatrix(MHWRender::MDrawContext::kProjectionMtx, &status);
アクセスできるデータをさまざまな頻度で更新できます。ビューポートのサイズは各フレーム データの例を示しています。モデリングの行列は、レンダー項目ごとのデータの例を示しています。
使用可能なデバイス情報のもう 1 つの注目すべき点は、現在使用しているカラーと深度ターゲット(バッファ)です。この情報は、マルチパス レンダリング実行中の場合は、パスごとに変更することができます。このパス情報は、描画時に MDrawContext インタフェースを介した場合のみ使用できます。
デバイスの状態に加えて、さまざまな表示モード情報を使用できます。たとえば、ワイヤフレームとシェーディング モード、現在のライティング モード、全体のレンダー設定(現在使用している透明度アルゴリズムなど)といった Maya の描画モードについてです。この情報がフレーム レベル単位で使用できるとしても、MDrawContext を必要とする自己描画インタフェースから一般的にアクセスできます。
MDrawContext は MFrameContext から派生したクラスで、描画時にデバイス レベルの状態を提供するメソッドとメソッドのオーバーライドが追加されています。
MDrawContext は、内部レンダラの状態に応じてレンダーする状態を使用し、自己を描画して Maya に統合しようとするインタフェースに合わせてほとんど単独で調整します。これには、MPxShaderOverride、MPxDrawOverride、および MRenderOverride に使用される MUserRenderOperationが含まれます。
状態マネージャ(MStateManager)はこのクラスからのみアクセスできます。これは、MDrawContext がアクティブな場合にのみデバイスの状態を変更できるからです。
追加のセマンティックに関する情報は、「パス コンテキスト」(MPassContext)の形式で提供されます。現在、パスの識別子とセマンティックのリストを照会することができます。パスの識別子は、内部的に生成するか、またはレンダリング ループ オーバーライドによって指定することができます。詳細については、「レンダリング ループ オーバーライド」を参照してください。
セマンティック リスト内の項目は、パイプライン内の状態または場所に関する情報を段階的に洗練した一連の情報を提供します。(最初の要素では広範囲に説明し、その他の要素では前の要素に関する詳細が追加されています。)次に、いくつかの例を示します。
ライティング情報(MLightParameterInformation)は MDrawContext を介して使用できます。詳細については、「ライティング インタフェース」を参照してください。
現在のカラーと深度ターゲットのコピーを作成する機能や特定のパスに使用される特定のテクスチャにアクセスする機能など、その他のレンダー ターゲット機能を描画時に使用できます。たとえば、深度ピーリング(Depth Peeling)に使用するテクスチャを利用できます。
プラグイン作成者は、レンダリング時に Maya がアクティブなオプションを有効にした状態で、プラグインをどのように統合する必要があるのかを決めることができます。フレームと描画コンテキストのインタフェース(MFrameContext と MDrawContext) は、描画時「コンテキスト」にアクセスして、必要な追加をコードを決定できます。
たとえば、表示スタイルを処理するには MFrameContext::getDisplayStyle() を使用します。
また、ハードウェア フォグなどの機能は、MFrameContext::getHwFogParameters() が返す情報に基づいてシェーダを調整することでもサポートできます。
場合によっては、シェーダ入力としてバインドするために、シェーダが現在のカラーと深度レンダー ターゲットにアクセスする必要があります。MDrawContext::copyCurrentColorRenderTargetToTexture() メソッドおよび MDrawContext::copyCurrentDepthRenderTargetToTexture() メソッドは、このような用途に最適です。
ライト操作、カスタム ジオメトリ、およびポスト エフェクトなどのより複雑な統合シナリオについては、「高度なトピック」の見出しで説明しています。