CgFX シェーダのテクスチャ座標系の方向

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 2015、2014、2013、2012 の場合、既定では、MAYA_TEXCOORD_ORIENTATION_OPENGL マクロは 1 に設定されます。これは、Maya を起動する前に環境変数 MAYA_TEXCOORD_ORIENTATION を DIRECTX に設定すると変更できます。

既定のレンダラまたはハードウェア レンダラを Maya の前のバージョン用に記述して OPENGL テクスチャ座標方向用に変更していないシェーダと一緒に使用する場合、環境変数 MAYA_TEXCOORD_ORIENTATION を DIRECTX に設定すると便利です。環境変数 MAYA_TEXCOORD_ORIENTATION を Maya 2015、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;
}