フラグメントは、高レベル言語におけるプロシージャまたは関数の定義のことです。フラグメントには入力および出力が挿入されていて、入力に対して何らかのプロシージャが実行され、出力が生成されるようになっています。
シェーディング フラグメントを記述するか、一連のコマンドを実行するスクリプト フラグメントを記述して、パラメータや状態の設定、さまざまなターゲットのクリア、またはさまざまなターゲットへのレンダリングを行うことができます。
その後、フラグメントをフラグメント グラフに接続できます。フラグメント グラフにコマンドは含まれていません。フラグメント グラフが行うことは、一連のフラグメントをインスタンス化して、これらの間の接続を記述することです。
1 つの .xml ファイルには 1 つのスクリプト フラグメントまたはフラグメント グラフを保存できます。
Maya をインストールすると、一連のスクリプト フラグメントおよびフラグメント グラフの xml ファイルがインストール フォルダの bin/ScriptFragment フォルダに格納されます。これらのフラグメントおよびフラグメント グラフは、ビューポート 2.0 にレンダリングする場合に使用されます。
Default.xml は、Viewport 2.0 での Maya のレンダリング方法を示すメインのフラグメント グラフです。このフラグメント グラフを実行すると、ビューポートにシーンが表示されます。
これにより、さまざまなフラグメントおよびフラグメント グラフが接続されます。たとえば、HoldOutPasses などのフラグメント グラフを接続する Maya_3d_Renderer、mayaUIDrawPass や Maya_SSAO などのフラグメントとフラグメント グラフを接続する Maya_PostEffects などです。
これらの xml ファイルは、フラグメント レンダラ用の独自のスクリプト フラグメントおよびフラグメント グラフを記述する例として使用できます。
独自のフラグメント レンダラを作成する場合は、既存の Maya フラグメントを再利用し、カスタマイズするフラグメントの xml のみを記述することができます。たとえば、独自のカスタム モーション ブラー パスを作成する場合は、モーション ブラー フラグメントを記述して既存の Maya フラグメントと結合することができます。
この操作を実行するには、次のような手順を実行します。
プロシージャの中にはスクリプト フラグメントとして表現するのが困難なものがあり、それらは Maya によってハードコードされた C++ プロシージャ フラグメントとして提供されています。C++ プロシージャ フラグメントはフラグメント グラフ内のスクリプト フラグメントと結合することができます。
Maya のレンダラを再現するには、まず次のような一連の操作を行って MRenderOverride を初期化します。
class FragmentRenderOverride(omr.MRenderOverride): def __init__(self, name): self.operatioIndex = 0 self.operations = [omr.MSceneRender("myRendererSameAsMaya", “default”), omr.MHUDRender(), omr.MPresentTarget("present")]
default は、オーバーライドされていない場合に Maya が使用するレンダー フラグメントの名前です。default.xml は Maya インストール フォルダの bin/ScriptFragment フォルダ内にあります。
default では、ビューティー パスが描画され、UI、シャドウ マップ、HUD など、MSceneRender の要素となるものは含まれません。
フラグメント レンダラを作成するための API エントリ ポイントは次のとおりです。これらのインタフェースの使用例については、Developer Kit の viewRenderOverrideFromFragments プラグインおよび フラグメント レンダラ サンプル プラグインを作成する を参照してください。
(オプション) MRenderScriptCallback クラスから派生して、スクリプト フラグメント .xml から登録および呼び出し可能なコールバック関数を作成します。execute()関数を実装して、現在のレンダー グラフから MRenderParameters を取得し、スクリプトから渡された 3 つのオプション値を取得できるようにします。このメソッドを使用して目的の動作を計算し、MRenderParameters::setParameter() を呼び出し、スクリプトまたはグラフ内の接続された他のフラグメントに結果を戻します。詳細については、「スクリプト フラグメント コマンド」トピック内の Call コマンドを参照してください。
MRenderer::registerScriptCallback()インタフェースおよび MRenderer::deregisterScriptCallback()インタフェースにより、MRenderScriptCallback を登録または登録解除できます。登録後にこのコールバックを呼び出すには、スクリプト フラグメント .xml 内で Call コマンドを使用します。
例については 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>
必須の入力パラメータ セットである properties。
<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.res を Maya_MotionBlur.input に接続します。
<connect from="Maya_SSAO.res" to="Maya_MotionBlur.input" name="input" />
別のパスまたはフラグメント グラフ内で Maya_SSAO に対する別の接続を作成する場合は、次の手順を実行します。
<fragment_ref name="Maya_SSAO_instance1" ref="Maya_SSAO" />
次のように接続します。
<connect from="Maya_SSAO_instance1.res" to="Maya_MotionBlur.input" name="input" />
Maya_MotionBlur.input は別のフラグメント グラフで異なる入力を受け取ることができるようになりました。
フラグメント間のすべての接続を指定します。各接続要素は、1 つのプロパティ入力 to に接続された 1 つの出力 from を指定します。
入力に含めることができるのは 1 つの接続のみですが、出力には任意の数の接続を含めることができます。接続されていない入力にはセマンティックで照合されるシステム入力変数を指定するか、または API を通して微調整することができます。
<connections> <connect from="mayaPreUIScript.output" to="Maya_UI.final" name="final" /> .... </connections>
サブフラグメント/フラグメント グラフの名前とアトリビュート、およびこれを表すために使用する外部名を指定して、未接続のすべての入力パラメータをリストします。
たとえば、次のようになります。
<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>