プラグイン マネージャ(Plug-in Manager)の詳細については、プラグイン マネージャ(Plug-in Manager)を参照してください。
CgFX シェーダ(CgFX Shader)マテリアルを作成するには
新しいシェーディング マテリアルがハイパーシェード(Hypershade)に表示され、CgFX シェーダ(CgFX Shader)マテリアル ノードがアトリビュート エディタ(Attribute Editor)に表示されます。
.cgfx ファイルを CgFXShader ノードに接続すると、プラグインはアトリビュートをアトリビュート エディタの追加のアトリビュート(Extra Attributes)セクションに自動的にロードします(アトリビュートが存在する場合)。
CgFx はプログラミング可能なシェーディング言語を使用するノードであるため、CgFX シェーダは Maya 内部にあるテクスチャ配置(place2DTexture または place3DTexture ノード)を自動的にはサポートしません。プログラミング可能なシェーディング言語を使用するということは、テクスチャのトランスフォームを外部から設定できないことを意味します。代わりに、シェーダに明示的にコード化する必要があります。明示的にコード化されたパラメータがシェーダ内にある場合は、UI の自動生成によって UI 要素が作成されます。その後で、テクスチャ配置ノードの適切なアトリビュートをシェーダのアトリビュートに接続する必要があります。
cgfxShader ノードのアトリビュート エディタ(Attribute Editor)で、Reload (リロード)、Edit (編集)、Open (開く)ボタンを使用すると、指定した FX ファイル上で該当処理を実行することができます。
Maya 2012 から、CgFX プラグインで CgFX シェーダをコンパイルした場合、コンパイル マクロ MAYA_TEXCOORD_ORIENTATION_OPENGL または MAYA_TEXCOORD_ORIENTATION_DIRECTX が 1 に設定され、テクスチャ座標系で使用する方向が指定されます。
環境変数 MAYA_TEXCOORD_ORIENTATION を OPENGL に設定すると MAYA_TEXCOORD_ORIENTATION_OPENGL マクロ、DIRECTX に設定すると MAYA_TEXCOORD_ORIENTATION_DIRECTX マクロが定義されます。定義されたマクロは 1 に設定されます。
Maya 2011 以前の場合、いずれのマクロも定義されず、DirectX テクスチャの座標系を前提とします。
Maya 2014、2013、2012 の場合、既定では、MAYA_TEXCOORD_ORIENTATION_OPENGL マクロは 1 に設定されます。これは、Maya を起動する前に環境変数 MAYA_TEXCOORD_ORIENTATION を DIRECTX に設定すると変更できます。
Maya の前のバージョン用に記述して OPENGL テクスチャ座標方向用に変更していないシェーダと一緒に既定のレンダラまたはハードウェア レンダラを使用する場合、環境変数 MAYA_TEXCOORD_ORIENTATION を DIRECTX に設定すると便利です。環境変数 MAYA_TEXCOORD_ORIENTATION を Maya 2014、2013、2012 で DIRECTX に設定すると、次のようになります。
ただし、引き続きビューポート 2.0 は OpenGL を使用して UV 座標を生成するという制限があります。これにより、ビューポート 2.0 を使用する場合に、テクスチャが V 軸に沿ってレンダーされて反転することがあります。
これにより、UV 座標の生成とテクスチャ イメージのロードの両方が変更され、たとえば、シェーダが UV 座標を使用してテクスチャをサンプリングすると、レンダーされたイメージは両方の座標系で同じになります。ただし、シェーダによってプロシージャルに生成した UV (Maya が生成する UV ソース ストリームとは反対)を使用してテクスチャをサンプリングする場合、このプラグインで両方の規則を処理できる必要があります。$ (MAYA_ROOT) /presets/CgFX/example にある brix.cgfx サンプルにこの例があります。
/******************** pixel shader *********************/ #ifdef MAYA_TEXCOORD_ORIENTATION_OPENGL float GBalanceCorr = 1.0f - GBalance; #else float GBalanceCorr = GBalance; #endif float v = ((float4)tex2D(stripeSampler,float2(IN.BrickUV.x,0.5))).x; float4 dColor1 = lerp(SurfColor1,SurfColor2,v); v = ((float4)tex2D(stripeSampler,float2(IN.BrickUV.x*2,GBalanceCorr))).x; dColor1 = lerp(GroutColor,dColor1,v); v = ((float4)tex2D(stripeSampler,float2(IN.BrickUV.x+0.25,0.5))).x; float4 dColor2 = lerp(SurfColor1,SurfColor2,v); v = ((float4)tex2D(stripeSampler,float2((IN.BrickUV.x+0.25)*2,GBalanceCorr))).x; dColor2 = lerp(GroutColor,dColor2,v); v = ((float4)tex2D(stripeSampler,float2(IN.BrickUV.y,0.5))).x; float4 brix = lerp(dColor1,dColor2,v); v = ((float4)tex2D(stripeSampler,float2(IN.BrickUV.y*2,GBalanceCorr))).x; brix = lerp(GroutColor,brix,v); return IN.DCol * brix; }
既定のレンダラ、ハードウェア レンダラ、ビューポート 2.0 レンダラの動作では、CgFX 状態割り当てに違いがあります。DepthMask 状態の既定値は異なります。既定値はCgFX シェーダで指定されていない場合に使用される値で、レンダラによって以下のようになります。
したがって、CgFX シェーダは、ハードウェア レンダラを使用すると適切に動作するように見えますが、既定のレンダラとビューポート 2.0 レンダラでは適切な結果が得られません。この場合、DepthMask = false 状態の割り当てをシェーダ パスの一部に追加すると、問題を解決できる場合があります。
MAYA_CGFX マクロを使用すると、CgFX シェーダをカスタマイズし、同じ CgFX シェーダを使用する可能性のあるほかのアプリケーションとの互換性を失くことなく、Maya 固有のアトリビュートの注釈を含めることができます。
たとえば、以下のコードを使用すると、互換性を失うことなく、Maya と別のアプリケーションの両方でディレクショナル ライト アトリビュートを宣言できます。
#if defined(MAYA_CGFX) || defined(XSI) // Declares the « dirlight0 » with attribute annotations for Maya or XSI float4 dirlight0 : Direction < string UIName = "Distant Light 0 Direction"; string Object = "DirectionalLight"; string Space = "World"; > = {-1.0f, -1.0f, 0.3f, 0.0f}; #else // Declares the « dirlight0 » with attribute annotations for another application: .... #endif
#if defined (MAYA_CGFX) || defined (XSI) と #else の間の行は、Maya/XSI によってロードした場合のみ解析されます。
ビューポート 2.0 を使用する場合、レンダラ > ビューポート 2.0 (Renderer > Viewport 2.0) > の統合ワールド(Consolidate world)オプションを有効にすると、ローカル頂点の位置に依存する CgFx プラグインが期待した動作をしないことがあります。
以下の例では、check3d.cgfx シェーダが、オブジェクトのローカル空間のサーフェスの位置に相対的に 3D チェッカボード パターンをオブジェクトに適用しているため、ビューポート 2.0 で予期せぬ結果が生じています。同じシェーダを両方の球に適用すると、統合ワールド(Consolidate world)をオンにしてシーンをタンブルしたり球を選択したりしても、チェッカボード パターンは移動しません。