CgFX シェーダを操作する

 
 
 

CgFX プラグインをロードするには

  1. ウィンドウ > 設定/プリファレンス > プラグイン マネージャ(Window > Settings/Preferences > Plug-in Manager)を選択します。

    プラグイン マネージャ(Plug-in Manager)が表示されます。

  2. cgfxShader.mll プラグインをロードします。

    プラグイン マネージャ(Plug-in Manager)の詳細については、プラグイン マネージャ(Plug-in Manager)を参照してください。

  3. 閉じる(Close)をクリックします。

CgFX シェーダ(CgFX Shader)マテリアルを作成するには

  1. ハイパーシェード(Hypershade)で、Maya > サーフェス(Maya > Surface)リストから CgFX シェーダ(CgFX Shader)マテリアルを選択します。

    新しいシェーディング マテリアルがハイパーシェード(Hypershade)に表示され、CgFX シェーダ(CgFX Shader)マテリアル ノードがアトリビュート エディタ(Attribute Editor)に表示されます。

  2. CgFX シェーダ(CgFX Shader)セクションで、使用する .cgfx ファイルへのパスを入力するか、または .cgfx ファイルを参照します。

    .cgfx ファイルを CgFXShader ノードに接続すると、プラグインはアトリビュートをアトリビュート エディタの追加のアトリビュート(Extra Attributes)セクションに自動的にロードします(アトリビュートが存在する場合)。

  3. 追加のアトリビュート(Extra Attributes)セクションを開き、必要に応じてアトリビュートを調整します。
  4. 新しい CgFX シェーダ(CgFX Shader)マテリアルをシーンのオブジェクトに割り当てます。詳細については、サーフェスに既存マテリアルを割り当てるを参照してください。
  5. シーン ビュー内でシェーディング > ハードウェア テクスチャリング(Shading > Hardware Texturing)を選択して、ハードウェア テクスチャリング(Hardware Texturing)をオンに設定します。

CgFX シェーダに配置を追加する

CgFx はプログラミング可能なシェーディング言語を使用するノードであるため、CgFX シェーダは Maya 内部にあるテクスチャ配置(place2DTexture または place3DTexture ノード)を自動的にはサポートしません。プログラミング可能なシェーディング言語を使用するということは、テクスチャのトランスフォームを外部から設定できないことを意味します。代わりに、シェーダに明示的にコード化する必要があります。明示的にコード化されたパラメータがシェーダ内にある場合は、UI の自動生成によって UI 要素が作成されます。その後で、テクスチャ配置ノードの適切なアトリビュートをシェーダのアトリビュートに接続する必要があります。

CgFX ファイルのリロード、編集、および表示

cgfxShader ノードのアトリビュート エディタ(Attribute Editor)で、Reload (リロード)Edit (編集)Open (開く)ボタンを使用すると、指定した FX ファイル上で該当処理を実行することができます。

Reload (リロード)

指定した CgFx ファイルをディスクからリロードします。

Edit (編集)

Windows の Microsoft® メモ帳か Linux の vi で、指定したCgFx ファイルを編集用に開きます。必要に応じてファイルを編集して保存します。Maya は、自動的にこの CgFx ファイルをリロードします。

Open (開く)

Windows のメモ帳の読み取り専用フォーマットと Linux の vi で、指定した CgFx ファイルを開きます。

テクスチャ座標系の方向

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 に設定されます。

OPENGL
テクスチャの原点をテクスチャの左下隅にする OpenGL 規則を使用するよう指定します。
DIRECTX
テクスチャの原点をテクスチャの左上隅にする DirectX 規則を使用するよう指定します。

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 に設定すると、次のようになります。

これにより、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 レンダラの動作では、CgFX 状態割り当てに違いがあります。DepthMask 状態の既定値は異なります。既定値はCgFX シェーダで指定されていない場合に使用される値で、レンダラによって以下のようになります。

  • 既定のレンダラ: 指定されていない場合、DepthMask = truen。
  • ハードウェア レンダラ: 指定されていない場合、DepthMask = false。
  • ビューポート 2.0 レンダラ: 指定されていない場合、DepthMask = true。

したがって、CgFX シェーダは、ハードウェア レンダラを使用すると適切に動作するように見えますが、既定のレンダラとビューポート 2.0 レンダラでは適切な結果が得られません。この場合、DepthMask = false 状態の割り当てをシェーダ パスの一部に追加すると、問題を解決できる場合があります。

CgFX シェーダをカスタマイズする

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)をオンにしてシーンをタンブルしたり球を選択したりしても、チェッカボード パターンは移動しません。