viewRenderOverrideFromFragments サンプル プラグインは、一連の API の使用法を示すのに使用します。 これにより、スクリプト フラグメントとフラグメント グラフを使用してシーンや目的のポスト エフェクトをレンダリングできます。スクリプト フラグメントは、標準のビューポート レンダリング エフェクトを適用するために Maya 内部で使用される構築ブロックで、Maya インストール フォルダの bin/ScriptFragment フォルダ内の一連の .xml ファイル内に格納されています。
これらの API を使用すると、Maya 独自の標準構築ブロックと自分自身で作成した構築ブロックを組み合わせて、Maya ビューポートおよびハードウェア レンダラを再使用、修正、拡張することができます。
サンプル プラグインの機能は次のとおりです。
サンプル プラグインについては、pyGroundReflectionRenderer.py を参照してください。
このサンプルを使用すると、Renderer ビューポート パネル メニューに Ground Reflections レンダラが作成されます。Ground Reflections レンダラに切り替えると、ビューポートによってオブジェクトおよびその反射がレンダリングされます。
サンプルをロードする前に、pyGroundReflectionRenderer.py ファイルの initializePlugin 関数(行 242)にプラグインのパスを設定する必要があります。
フラグメント xml ファイルは viewRenderOverrideFromFragments プラグイン フォルダの ScriptFragment フォルダ内にあります。このレンダラのメイン フラグメント グラフは GroundReflections.xml です。指定した .xml ファイルはシェーダ検索パス内になければなりません。
プラグイン コードの initializePlugin 関数も、このプラグインの Shaders フォルダをシェーダ検索パスに追加します。
フラグメント マネージャにアクセスして、新しいフラグメント グラフを追加するには、次のように MRenderer.getFragmentManager()を呼び出します。
omr.MRenderer.getFragmentManager().addFragmentGraphFromFile("GroundReflections.xml")
MSceneRender を使用してシーン レンダーを作成し、フラグメント グラフの名前を指定します(ここでは “GroundReflections”)。
class FragmentSceneRender(omr.MSceneRender): def __init__(self, name): super(FragmentSceneRender, self).__init__(name, "GroundReflections")
MRenderOverride を作成してフラグメント レンダラを作成し、以下を呼び出してこのレンダラを登録します。
omr.MRenderer.registerOverride(fragmentRenderer)
MRenderOverride を作成する場合は、MSceneRender から派生したカスタム レンダー操作が含まれている MRenderOperation のリストを指定します。
class FragmentRenderOverride(omr.MRenderOverride): def __init__(self, name): self.operatioIndex = 0 self.operations = [FragmentSceneRender("sceneAndGroundReflections"), omr.MHUDRender(), omr.MPresentTarget("present")]
preSceneRender 関数をオーバーライドする場合は、MSceneRender::getParameters()を呼び出して、一連のレンダー パラメータを取得します。MRenderParameters を参照してください。
def preSceneRender(self, context): params = self.getParameters()
まだ存在していない場合は、オプション ノードを作成します。
optionsNodeName = 'groundReflectionOptions' optionObj = nameToNode(optionsNodeName) if optionObj is None: optionObj = nameToNode(cmds.createNode(RenderOverrideOptions.kTypeName, name=optionsNodeName, skipSelect=True))
次にオプション ノードからプラグを取得し、MRenderParameters::setParameter()を呼び出して、カスタム MSceneRender (カスタム シーン レンダラ操作)で使用されるレンダー フラグメントに値を渡します。
if optionObj is not None: # set the fragment's enabled input optionPlug = om.MPlug(optionObj, RenderOverrideOptions.enableReflections) if optionPlug is not None: enabled = getBoolPlugValue(optionPlug) params.setParameter('EnableReflection', enabled)
GroundReflections フラグメント グラフには DepthTarget などのフラグメント、およびフラグメント グラフ Reflection_Renderer を含む ReflectionPass などの他のフラグメント グラフが含まれています。フラグメント グラフ Reflection_Renderer には、simpleBlitScript、MayaShadedBeauty、DrawPreUIOption などのフラグメントが含まれています。GroundReflections フラグメント グラフでは、ハードコードされた C++ プロシージャ フラグメント VE_ReflectCamera も使用されます。
サンプル フラグメント グラフ内のフラグメントの一部は、スクリプト フラグメントです。これらは、レンダリング操作を実行する場合に使用されるコマンドを含む、グラフ内のリーフ フラグメントです。これらのコマンドの中には、パスにエフェクトを割り当てて、エフェクト パラメータをコントロールできるものがあります。
エフェクトを設定するには SetEffect コマンドを使用します。
これらのコマンドの使用例については、VE_PlanarReflection_RenderFragment.xml を参照してください。
<SetEffect name="DilateH" path="DistanceDilate" technique="DilateHoriz" /> <SetEffectParameter effect="DilateH" name="gAmount" value="_UseDistanceDilate_Amount" /> <SetTexture effect="DilateH" name="gSourceTex" value="PointClamp" texture="@DistanceMap" /> <SetEffectParameter effect="DilateH" name="gSourceSamp" value="PointClamp" /> <SetTarget index="0" value="tempDilate" /> <Render name="Quad" />
エフェクトはフラグメントでない MShaderInstance のインスタンスと同等ですが、スクリプト内で直接使用することはできません。name アトリビュートはこのエフェクトを参照する場合に使用される名前です。path アトリビュートはエフェクト ファイルのパスおよび名前です。ファイル拡張子を指定する必要はありません。Maya では、使用されているデバイスに基づいて適切な拡張子が検索されます(DX11 の場合は .fx、コア プロファイルの場合は .ogsfx、コア プロファイル以外の OpenGL の場合は .cgfx)。technique アトリビュートは、使用する必要があるエフェクト ファイル内のテクニックを示します。1 つのファイル内に複数のテクニックが存在することがあります。
SetEffectParameter コマンドを使用してエフェクト値を設定してから、SetTexture コマンドを使用してエフェクトで使用されるテクスチャを設定します。
参照しているシェーダがマクロを使用する場合は、macrolist 値を設定してシェーダのコンパイル方法をコントロールすることもできます。
<SetEffect name="BlurH" path="Blur" technique="BlurHoriz" macrolist="BLUR_AMOUNT=12" />
<RestoreOverrideEffect />