CgFX シェーダを作成する

CgFX シェーダ(CgFX shader)を作成する

Maya は Cg バージョン 3.0.015 をサポートしています。

Maya には CgFX のサンプルが付属しています。これらのサンプルは次の場所にあります。

可変パラメータのパック

複数のメッシュ入力を単一の可変パラメータ レジスタにパックすることができます。たとえば、2 つのセットの UV 座標を 1 つの float4 レジスタにパックすることができます。

以下にサンプル ワークフローを示します。

  1. 次の頂点シェーダ入力構造体は、1 つの可変パラメータに 2 つの UV セットを含んでいる必要がある、パックされた float4 を示します。
    struct appdata {     float3    Position: POSITION;     float4    UVs:      TEXCOORD0; };
    
  2. この入力にパックする要素を記述した 2 番目の構造体を作成します。Maya がこの 2 番目の構造体を見つけることができるようにするには、その名前がオリジナルの可変パラメータの名前(この場合、UVs)と一致している必要があります。

    この例で、この補助構造体は、UV1UV2 という名前の 2 つの float2 入力からオリジナルの float4 パラメータをすぐに集める必要があることを Maya に通知します。シェーダ自体はこの構造体を使用しません。この構造体は、この入力のデータを集める方法を Maya に知らせるだけです。

    struct UVs {     float2 UV1;     float2 UV2; };
    
  3. Maya はこれがパックされた入力であることを知っているので、アーティストには、最終的なパックされた構造体(UVs)ではなく、基礎データ(UV1UV2)へのインタフェースが提示されます。ここで、シーン内の既存のシェーダの結合を解除することなく、シェーダを使用して可変パラメータのレジスタ割り当てを最適化および認識することができます。

    詳細については、例として UVPacking.cgfx を参照してください。

    注:

    構造体要素に割り当てられたデータが指定された Cg データ型には大きすぎる場合(たとえば、(x, y, z)座標を持つ位置が float2 値に渡される場合)、最初の n 個の値を使用して値が埋められ、後続の要素は無視されます(たとえば、x と y が渡され、z は無視されます)。

その他の CgFX シェーダ(CgFX shader)機能

時間セマンティック(Time semantic)

Maya は、時間によって変化するパラメータをサポートしています。時間とともに移動するシェーダの例は、MrWiggle.cgfx を参照してください。

行列セマンティック(Matrix semantic)

CgFX シェーダ(CgFX shader)で行列を指定することができます。Maya は、行列セマンティックのすべてのキーワードをサポートしています。

透明な CgFX シェーダ

Maya は、透明な CgFX シェーダのレンダリングをサポートしています。Maya は、最初のパスでブレンディング状態が有効になっているかどうかを検出します。ブレンディングが有効な場合、Maya はシーン ビューでオブジェクト透明度ソート(Object Transparency Sorting)またはポリゴン透明度ソート(Polygon Transparency Sorting)オプションを使用して透明なシェーダを正しくレンダーします。

Maya シェーダ ファイル

Maya では、開発者が独自の CgFX シェーダに組み込むことができるシェーダ ファイルが、次のディレクトリに提供されています。

  • (Windows) <install_dir>¥bin¥cg
  • (Linux) <install_dir>/bin/cg
  • (Mac OS X) <install_dir>/Maya.app/Contents/bin/cg
  • <install_dir> は Maya をインストールしたフォルダです。

Maya_*.cgh コード サンプルを選択します。たとえば、maya_blends.cgh はレイヤ テクスチャのブレンディングに使用されるコードです。

テクスチャ座標系の方向
CgFX プラグインで CgFX シェーダをコンパイルした場合、コンパイル マクロ MAYA_TEXCOORD_ORIENTATION が OpenGL または DirectX に設定され、テクスチャ座標系で使用する方向が指定されます。詳細については、「CgFX シェーダのテクスチャ座標系の方向」を参照してください。

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 によってロードした場合のみ解析されます。