このセクションでは、シーンの 3D リプリゼンテーションをビューポートまたはディスク上のイメージにレンダリングするときの、ビューポート 2.0 のパイプラインの基本的なシーケンスについて説明します。さまざまなレンダー項目または描画可能 UI の処理は、このシーケンス内で行われます。
ここでの前提は、レンダー項目および描画可能 UI が、レンダラ内部の統合、フィルタリング、および分類のメカニズムを経て、レンダー項目のリストまたは描画可能 UI のリストが生成されていることです。1 つの例が、不透明にシェーディングされたレンダー項目のリストです。
特定の基準に基づいてソートされるリストもあります。たとえば、透明なレンダー項目は現在のカメラとの距離でソートされることがあり、マテリアル項目はシェーダの固有性(キー)でソートされることがありますソートされていない場合、リスト内での順序は。オーバーライドでレンダー項目がソートされる順序、または Maya のシーン オブジェクトの順序を必ずしも反映しているとは限りません。
シーケンスのディスクリプションに使用される最も高い精度は、論理的な操作と呼ばれ、ビューポート 2.0 のレンダー オーバーライド(MRenderOverride)で使用される用語に一致します。複雑な内部レンダー グラフでも、操作のリニア シーケンスに分割できることを前提としています。
最も上位のレベルでは、シーケンスはフレームに分割されます。フレームは、オフスクリーン カラーおよび深度の出力ターゲットのコンテンツを生成するためにレンダリングを実行します。インタラクティブなビューポートに提供するため、またはディスク イメージに保存するために使用されるターゲットは、最終ターゲットと呼ばれます。
可能な場合、パス セマンティックを使用するかどうかに関する指示が、内部シーケンスのディスクリプションに表示されます。一意のパス セマンティックを指定する操作は、文字(P)を使って示されます。
フレームのレンダリングは、大きく 3 つのパーツに分かれます。プリシーン レンダリング、シーン レンダリング、およびポストシーン レンダリングです。UI 項目の主な条件分岐は、ポスト エフェクトが有効になっているかどうかによります。これは通常、ポスト エフェクトが適用された後に UI 項目が描画するリストに移動されることを意味します。
プリシーン レンダリング フェーズの基本的な操作には、次の操作が含まれます。
シャドウ マップの更新(以下の「シャドウ パスのレンダリング」を参照してください)
必要に応じて、深度ターゲットのコンテンツを生成するために、シーンをレンダリングします。
半透明のビットマップ レンダー項目(P)。例については、「パーティクルのレンダリング」を参照してください。
保持として機能可能なレンダー項目(P)。これは、通常の非保持シーケンスとよく似ていることに注意してください。
透明度の描画(P)「透明度のレンダリング」を参照してください。
シーン レンダリング(ビューティ パスを表しているとも考えられます)では、次の操作を使用してレンダリングします。
半透明のビットマップ レンダー項目(P)例については、「パーティクルのレンダリング」を参照してください。
透明度の描画(P)「透明度のレンダリング」を参照してください。
ポストシーン レンダリングには、2D ポスト エフェクトの操作、およびどんな 2D ポスト エフェクトが有効でも参加しないその他の UI 描画が含まれます。既定では、特定の項目はポスト エフェクトに参加しません。それ以外の場合は、MRenderItem::setExcludedFromPostEffects() メソッドをオーバーライドするオプションが使用可能です。
SSAO (スクリーン スペース アンビエント オクルージョン)ポスト エフェクト
2D テキスト項目を除く、マニピュレータ UI 項目のレンダリング。(「マニピュレータ」を参照してください)。
最前面描画可能 UI のレンダリング。これには、内部 2D カメラ UI、スカルプト描画、および 2D マニピュレータ テキストが含まれます。
透明な項目をレンダリングするプロセスは、選択する透明度アルゴリズムおよび項目の分類によって異なります。
拡張透明度(ウェイト付けした平均値(Weighted Average)、深度ピーリング(Depth Peeling))をサポートする非 UI レンダー項目(P)
拡張透明度をサポートしない非 UI レンダー項目、またはオブジェクトのソート(Object Sorting)、簡易(Simple)の透明度が使用されている場合。
MRenderItem::setSupportsAdvancedTransparency() メソッドを使用して、明示的に拡張透明度からはずすことができることに注意してください。
オブジェクトにはさまざまな表示バリエーションを指定できるため、パーティクル システムではさまざまなタイプの項目を作成できます。ポイントおよびストリークの大部分は、不透明または透明なレンダー項目リストおよび透明なビットマップ リストに追加されます。すべての数値は、最終的に X 線表示リストに追加されます。(MShaderManager から取得したストック数値シェーダも最終的に X 線表示リストに追加されることに注意してください)。球とメタボール項目は、最終的に不透明リストまたは不透明 UI リスト(後者はワイヤフレーム用)に追加されます。クラウドおよびチューブは、最終的に透明または不透明 UI リスト(後者はワイヤフレーム用)に追加されます。
3D シーンのレンダリングに使用されるすべてのシャドウ マップは、必要に応じて、プリシーン レンダリング中に更新されます。レンダー項目(描画可能 UI を除く)だけは、次のシーケンスを使用して、シャドウ マップの作成時に考慮されます。
イメージ プレーンのレンダリングでは、不透明または透明なオブジェクトを作成できますが、これらのオブジェクトはポスト エフェクトに参加しないものに分類されるため、常に非ポスト エフェクト リストに追加されます。
MUIDrawManager は、さまざまな UI 描画を処理するための API インタフェースで、さまざまな API インタフェースから使用できます。API と内部描画の両方で、使用するクラス メソッドに基づいて、さまざまな描画可能項目を生成できます。
オブジェクト オーバーライドおよびレンダー オーバーライドの描画では、次の一般的なマッピングが行われます。
メッシュ: これにはさまざまなジオメトリ プリミティブ タイプおよびストック ジオメトリが含まれます。これらの項目は、シャドウ パスまたはポスト エフェクト パスに参加することはありませんが、プリミティブ タイプによっては、Maya のライトを使用して光を当て、シェーディングできることに注意してください。
footPrintManip の例: Stretch Me! および Stretch Me 2D! のテキストは、Footprint Locator (MPxDrawOverride)のテキスト(X 線表示)、および uiDrawManager (MPxDrawOverride)のサンプル テキスト(透明 UI 2D)の上に描画されます。
ツール コンテキストの描画はすべて、オーバーレイを描画するパイプライン操作内で行われます。このため、項目は 2D または 3D オーバーレイ リストに追加されます。これは、3D ビューポートおよび UV エディタ(UV Editor)に適用されます。通常、オーバーレイの描画時には、3D シーンの要素は再描画されません。
バックグラウンド テクスチャのレンダリングは、シェーダ オーバーライド(MPxShaderOverride)で提供されます。この場合、描画は MUIDrawManager を介して実行され、常にすべてのオブジェクト UI、2D マニピュレータの前に描画されます。
MPxDrawOverride による描画は、既定では不透明なレンダー項目に分類されていますが、どのポスト エフェクト、透明度にも参加しません。ただし、シャドウ マップの作成には参加できます。
Developer Kit サンプル: rawFootPrintNode
1 つの項目が X 線表示リストに追加されます(MUIDrawManager を介したテキスト)。
MPxGeometryOverride および MPxSubSceneOverride で作成されたレンダー項目は、項目ごとに設定されたプロパティに応じて、不透明な UI または非 UI レンダー項目に分類されることも、されないこともあります。
Developer Kit サンプル: footPrintNode_GeometryOverrride (MPxGeometryOverride)
MHWRender::MRenderItem::DecorationItem の RenderItemType がすべてのカスタム レンダー項目に使用されているため、これらの項目は不透明な UI 項目として分類されます。
明示的に定義された項目は、統合されていない場合、リストに最大 4 つ(ワイヤフレームに 2 つ、塗り潰しに 2 つ)追加でき、ワイヤフレームおよびシェーディングの描画モードがいずれも有効です。
Developer Kit サンプル: apiMeshShape (MPxGeometryOverride)
このサンプルでは、同じオブジェクトのトランスフォーム インスタンスが 6 つあります。
単一オブジェクトでは、1 つの項目が不透明リストに追加されています(シェーディング)。この項目は、ポスト エフェクト リストにも追加されます。
サブシーン オーバーライドでは、ハードウェアによるインスタンス化を使用するため、合計で 1 つの項目しか追加されません。各項目では、インスタンスごとに異なるワールド空間でのトランスフォームを使用して、ハードウェアによるインスタンス描画を使用します。
1 つのワイヤフレーム項目が不透明 UI リストに追加されます。
頂点が表示されるとき、他の 1 つの項目が不透明 UI リストに追加されます。
シェーディング上にワイヤフレームを重ねると、2 つの UI 項目が追加されます。休止状態のワイヤフレームに 1 つ、アクティブなワイヤフレームに 1 つです。
2 つの項目は、バウンディング ボックス用にも追加されます。これらは、MHWRender::MRenderItem::NonMaterialSceneItem の RenderType であるため、シーン項目とはみなされませんが、まだ不透明 UI リストと分類され、このリストに追加されます。
MPxShaderOverride、MPxSurfaceShadingNodeOverride、および Maya が割り当てる内部シェーダは常に、不透明または透明な非 UI レンダー項目を生成します。このため、これらの項目はポスト エフェクト リストに追加され、シャドウ マップ パス用にレンダリングされます。
MPxShaderOverride C++ API リファレンス ドキュメントに記載されているように、プラグインのインスタンスは、既定では、オーバーライドされない限り、メイン カラー パスで描画するときのみ呼び出されます。たとえば、SSAO の法線の深度のパスでは、既定では、プラグインを呼び出しません。
MPxSurfaceShadingNodeOverride で提供するシェーダの実装は 1 つだけであり、これはメイン カラー パスで使用されます。
通常の 3D ビューティ レンダー、および 3D ビューポートのオーバーレイ レンダリングに使用できる空でないリストについてのトレース情報を取得できます。コマンド:
ogs -traceRenderPipeline true;
を使用して、デバッグ出力を、インタラクティブ モードではスクリプト エディタ(Script Editor)に、コマンド ライン モードでは stderr に送信できます。
たとえば、ワイヤフレームで塗り潰されて描画された球をトレースすると、次のように出力されることがあります。
// -- VP2 Rendering [modelPanel4] [3d Beauty Render] // // Count for list: [Opaque UI] = 1 // // Count for list: [Opaque] = 1 // // Count for list: [Post Effect] = 1 // // Count for list: [Non Post Effect] = 1 //
コンテキストでは、実行されたレンダーの他に、レンダリング先(MFrameContext::renderingDestination() から返される値と同じ)が得られます。ここでは、名前 3d Beauty Render が、内部レンダーを示すために返されています。
この結果では、1 つの不透明 UI 項目(ワイヤフレーム)と、1 つの不透明項目(塗り潰し)が分類されたことを示しています。さらに、塗り潰し項目がポスト エフェクト描画の待ち行列に入れられ、ワイヤフレームが非ポスト エフェクト描画の待ち行列に入れられています。これらが使用可能であるということは、必ずしもリストがレンダリングされるということではありません。これは、ポスト エフェクトが有効になっているかどうかによります。
リストは必ずしも使用される順番で与えられるわけではなく、各リストは、シーン レンダーにつき一度だけ与えられます。このセクションのシーケンスは、特定のリストが描画される可能性のある場所を確認するために参照する必要があります。
複数のシーン レンダーが各レンダーの項目を表示します。たとえば、立体視のレンダリングでは次のようになることがあります。
// -- VP2 Trace[StereoPanel][stereoOverrideVP2] // // Count for list: [Opaque UI] = 18 // // Count for list: [Opaque] = 34 // // Count for list: [Post Effect] = 33 // // Count for list: [Non Post Effect] = 19 // // Count for list: [Opaque UI] = 18 // // Count for list: [Opaque] = 34 // // Count for list: [Post Effect] = 33 // // Count for list: [Non Post Effect] = 19 // // Count for list: [HUD] = 1 //
2 行目から 5 行目は 1 つのシーン描画を表し、6 行目から 9 行目は別の 1 つを表しています。
レンダー オーバーライド(MRenderOverride)がトレースでアクティブになっている場合、オーバーライドの UI 名がトレースの一部として提供されることに注意してください。ここでは、stereoOverrideVP2 というオーバーライド名が表示されています。
もう 1 つの例は、viewOverrideSimple プラグインのトレースで、Simple VP2 Override という名前が示されています。
// -- VP2 Trace[modelPanel1][Simple VP2 Override] // // Count for list: [Opaque UI] = 17 // // Count for list: [Pre-Opaque UI] = 2 // // Count for list: [Opaque] = 34 // // Count for list: [Post Effect] = 33 // // Count for list: [Non Post Effect] = 18 // // Count for list: [Orthographic On-Top UI] = 5 // // Count for list: [HUD] = 1 //