ビューポートでレンダー パスをコントロールするスクリプト フラグメントおよびフラグメント グラフを記述する

はじめに

Maya のビューポートは、次の 2 つの異なるタイプの一連のフラグメント(XML 形式でシリアル化されたスクリプト)を利用します。 * シェード フラグメントは、XML 形式の入力および出力定義と共に、コード フラグメントをリアルタイム シェーディング言語(GLSL、HLSL、または Cg)でラップします。このようなフラグメントはネストされたシェード フラグメント グラフに接続され、最終的に、GPU によって実行される最終的なシェーダにコンパイルされます。 * スクリプト フラグメントは、一連の必須のスクリプト コマンドを定義します。これらのコマンドは、実行時に Maya によって解釈され、最終的に GPU 状態が変更されたり、描画が呼び出されたりします。スクリプト フラグメントは、上位のコントロール フローを決定するネストされたスクリプト フラグメント グラフに接続することもできます。

Maya をインストールすると、一連のスクリプト フラグメントおよびフラグメント グラフの XML ファイルがインストール フォルダの bin/ScriptFragment サブフォルダに格納されます。

Maya 2020 以前のリリースでは、default.xml は、ビューティ パス(シーンとポスト エフェクト パスを含むが、シャドウ マップとさまざまな UI パスおよび HUD パスは除く)の既定の実装を定義するトップレベルのフラグメント グラフでした。このグラフによって、Maya_3d_Renderer.xml などのさまざまなフラグメントとフラグメント グラフが接続され、そこから、HoldOutPasses.xmlMaya_PostEffects.xml などのフラグメント グラフ、さらに mayaUIDrawPass.xmlMaya_SSAO.xml などのフラグメントとフラグメント グラフが順に接続されました(以下同様)。これらのグラフで参照されるフラグメントの一部は、ハードコードされた C++ プロシージャ フラグメントとして実装されます。

Maya の新しいバージョンでも、default.xml およびそのディペンデンシーは Maya に付属していますが、既定のビューティ パスの実装は再設計されていて、単一のスクリプト フラグメント グラフで示されることはなくなりました。

MRenderOverride プラグインでは、ビューティ パスは MSceneRender 操作で表されます。MSceneRender を構築する場合は、次のように、fragmentName パラメータを使用して、既定の Maya ビューティパスの実装をオーバーライドするカスタムのスクリプト フラグメントまたはフラグメント グラフの名前を指定することができます。

class FragmentRenderOverride(omr.MRenderOverride):

    def __init__(self, name):
        self.operatioIndex = 0
        self.operations =  [omr.MSceneRender("myRendererSameAsMaya", fragmentName=“customBeauty”),
                           omr.MHUDRender(),
                           omr.MPresentTarget("present")]

カスタム フラグメントを作成するときに、bin/ScriptFragment フォルダに含まれている XML ファイルをリファレンスとして使用できますが、Maya の破損を防ぐために、このフォルダ内のファイルを直接変更することはお勧めしません。

API クラスおよびインタフェース

フラグメント レンダラを作成するための API エントリ ポイントは次のとおりです。これらのインタフェースの使用例については、Developer Kit の viewRenderOverrideFromFragments プラグインおよび「フラグメント レンダラ サンプル プラグインを作成する」を参照してください。

MSceneRender (const MString &name, const MString &fragmentName)

MRenderer::registerScriptCallback() および MRenderer::deregisterScriptCallback() インタフェースで、MRenderScriptCallback の登録または登録解除を行うことができます。登録した後に、スクリプト フラグメント .xml で Call コマンドを使用して、このコールバックを呼び出すことができます。

フラグメントおよびフラグメント グラフ XML の定義

フラグメントの各部の説明

例については maya_DepthPrePass.xml を参照してください。

すべてのフラグメントは複合要素 fragment に含まれています。

<fragment  uiName="maya_DepthPrePass" name="maya_DepthPrePass" type="sceneEffect" class="ScriptFragment" version="1.0" feature_level="30" >

フラグメントの定義には次の要素も含まれています。

<description> <![CDATA[ depth pre-pass: make depthStencil & linear, readable opaque depth texture]]> </description>

<type name ="myParam"> 形式を使用します。type はパラメータのタイプ(int、float4 など)、name はパラメータの必須の名前です(セット内で一意である必要があります)。

ここには Maya で事前に定義された既知の入力である preOpaqueUIList、transparentBitmapsList、カメラ、ビューポートなども含まれます。

<properties> <countedObject name="preOpaqueUIList" /> .... </properties>

value 要素内で初期値を持つパラメータを定義するには、次の形式を使用します。

<type name ="myParam" value ="…" />

value 文字列の正確な形式は、パラメータのタイプによって決まります。複数の値を指定するには、カンマ区切りリストを使用します。たとえば、「0,1,3」は int3 または float3 パラメータと一致します。

同じ名前を共有するフラグメント グラフ内のすべてのアトリビュートは、これらの値を使用して初期化されます。

<values> <float4 name="viewport" value="0.000000,0.000000,1.000000,1.000000" /> .... </values>

<outputs> <target name="depthOut" /> <target name="opaquedepthtexture" /> </outputs>

各コマンドは次の形式の単一の要素によって定義されます。

<command value="theValue" />

<implementation render="OGS" language="ScriptInterpreter" version="0.1" > <scriptCommands> <AcquireTarget name="localZ" format="EFORMAT_R32_FLOAT" size="@finalDesc.size" relSize="1.0,1.0" msaa="0" /> .... </scriptCommands> </implmentation>

使用可能なコマンドのリストについては、「スクリプト フラグメント コマンド」を参照してください。

コマンドをリストする場合は、記号 @ を使用して、値をローカル値によって設定するのではなく、パラメータから取得するように指定します。たとえば、上記のコード スニペットでは、値は finalDesc パラメータから取得されます。

フラグメント グラフの各部の定義

上記のように、さまざまなフラグメントおよびフラグメント グラフを相互に接続して単一のフラグメント グラフを形成できます。

例については Maya_PostEffects.xml を参照してください。

すべてのフラグメントは次のように複合要素 fragment_graph に含まれています。

<fragment_graph  name="Maya_PostEffects" ref="Maya_PostEffects" class="FragmentGraph" version="1.0" feature_level="0" >

ref アトリビュートをフラグメント グラフの内部名に設定します。

  • name アトリビュートを内部名と同じにしたり、外部名を指定したりできます。

  • class アトリビュートは FragmentGraph に設定する必要があります。

  • fragment_graph の定義には次の要素も含まれます。

    このグラフに含まれているすべてのフラグメントをリストします。リストの順番は重要ではありません。

    <fragments> <fragment_ref name="Maya_UI" ref="mayaUIDrawPass" /> .... </fragments>

    ref アトリビュートをフラグメントの内部名または既定名に設定します。つまり、XML ファイル内の fragment 要素の name アトリビュートで定義された名前に設定します。

    name アトリビュートを ref アトリビュートと同じ値に設定できます。また、異なるインスタンスで使用するように別の名前に設定することもできます。このように、2 つの異なるパスで同じアトリビュートを使用する場合、そのアトリビュートに 2 つのパスで別々の接続を設定することができます。

    たとえば、Maya_PostEffects.xml を参照してください。Maya_PostEffects フラグメント グラフにはグラフ Maya_SSAO が含まれています。

    <fragment_ref name="Maya_SSAO" ref="Maya_SSAO" />

    その後で、Maya_SSAO.resMaya_MotionBlur.input に接続します。

    <connect from="Maya_SSAO.res" to="Maya_MotionBlur.input" name="input" />

    別のパスまたはフラグメント グラフ内で Maya_SSAO に対する別の接続を作成する場合は、次の手順を実行します。

    <fragment_ref name="Maya_SSAO_instance1" ref="Maya_SSAO" />

    次のように接続します。

    ```

    ```

    Maya_MotionBlur.input は別のフラグメント グラフで異なる入力を受け取ることができるようになりました。

    フラグメント間のすべての接続を指定します。各接続要素は、1 つのプロパティ入力 to に接続された 1 つの出力 from を指定します。

    入力に含めることができるのは 1 つの接続のみですが、出力には任意の数の接続を含めることができます。接続されていない入力にはセマンティックで照合されるシステム入力変数を指定するか、または API を通して微調整することができます。

    <connections> <connect from="mayaPreUIScript.output" to="Maya_UI.final" name="final" /> .... </connections>

    注: finalは、操作の最後に結果を描画するバッファを示します。

    サブフラグメント/フラグメント グラフの名前とアトリビュート、およびこれを表すために使用する外部名を指定して、未接続のすべての入力パラメータをリストします。

    たとえば、次のようになります。

    <properties> <float4 name="viewport" ref="Maya_SSAO.viewport" /> .... </properties>

    Maya_SSAO はサブフラグメント グラフです。このビューポート アトリビュートを公開するには、エイリアス viewport を使用する必要があります。

    未接続の入力パラメータの初期値を定義します。

    <values> <float4 name="viewport" value="0.000000,0.000000,1.000000,1.000000" /> .... </values>

    ここで出力を指定し、一次出力を最初にリストします。

    <outputs> <target name="output" ref="Maya_UI.output" /> </outputs>