プラグイン マネージャの詳細については、プラグイン マネージャ(Plug-in Manager)(『Maya の基本』マニュアル)を参照してください。
CgFX シェーダ(CgFX Shader)マテリアルを作成するには
新しいシェーディング マテリアルがハイパーシェード(Hypershade)に表示され、CgFX シェーダ マテリアル ノードがアトリビュート エディタに表示されます。
.cgfx ファイルを CgFXShader ノードにコネクトすると、プラグインはアトリビュートをアトリビュート エディタの追加のアトリビュート(Extra Attributes)セクションに自動的にロードします(アトリビュートが存在する場合)。
CgFx はプログラミング可能なシェーディング言語を使用するノードであるため、CgFX シェーダは Maya 内部にあるテクスチャ配置(place2DTexture または place3DTexture ノード)を自動的にはサポートしません。プログラミング可能なシェーディング言語を使用するということは、テクスチャのトランスフォームを外部から設定できないことを意味します。代わりに、シェーダに明示的にコード化する必要があります。明示的にコード化されたパラメータがシェーダ内にある場合は、UI の自動生成によって UI エレメントが作成されます。その後で、テクスチャ配置ノードの適切なアトリビュートをシェーダのアトリビュートにコネクトする必要があります。
cgfxShader ノードのアトリビュート エディタで、Reload(リロード)、Edit(編集)、Open(開く)ボタンを使用すると、指定した FX ファイル上で該当処理を実行することができます。
環境変数 MAYA_TEXCOORD_ORIENTATION を OPENGL に設定すると MAYA_TEXCOORD_ORIENTATION_OPENGL マクロ、DIRECTX に設定すると MAYA_TEXCOORD_ORIENTATION_DIRECTX マクロが定義されます。定義されたマクロは 1 に設定されます。
Maya 2011 以前の場合、いずれのマクロも定義されず、DirectX テクスチャの座標系を前提とします。
Maya 2012 の場合、デフォルトでは、MAYA_TEXCOORD_ORIENTATION_OPENGL マクロは 1 に設定されます。これは、Maya を起動する前に環境変数 MAYA_TEXCOORD_ORIENTATION を DIRECTX に設定すると変更できます。
デフォルト レンダラまたはハードウェア レンダラを Maya の前のバージョン用に記述して OPENGL テクスチャ座標方向用に変更していないシェーダと一緒に使用する場合、環境変数 MAYA_TEXCOORD_ORIENTATION を DIRECTX に設定すると便利です。環境変数 MAYA_TEXCOORD_ORIENTATION を Maya 2012 で DIRECTX に設定すると、以下のようになります。
これにより、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; }
したがって、CgFX シェーダは、ハードウェア レンダラを使用すると適切に動作するように見えますが、デフォルト レンダラとビューポート 2.0 レンダラでは適切な結果が得られません。この場合、DepthMask = false 状態の割り当てをシェーダ パスの一部に追加すると、問題を解決できる場合があります。
たとえば、以下のコードを使用すると、互換性を失うことなく、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)をオンにしてシーンをタンブルしたり球体を選択したりしても、チェッカボード パターンは移動しません。