ShaderFX ネットワークで for ループを使用する

カスタム コード(Custom Code)ノードを使用する

さまざまな方法で for ループを作成することができます。カスタム コード(Custom Code)ノードを作成する方法もあります。詳細設定モードに移行するには、 クリックしてツール > 高度なモードの切り替え(Tools > Toggle Advanced Mode)を選択してから、Hw シェーダ ノード > 各種 > カスタム コード(Hw Shader Nodes > Various > Custom Code)を選択します。アトリビュート エディタ(Attribute Editor)編集(Edit)を押すと、表示されるカスタム コード(Custom Code)エディタでコードを入力できます。両方のモードを使用する場合は、DirectX および OpenGL の両方で実行される関数を使用します。

Extension for Maya 2015 で、ShaderFX メニュー バーから設定 > 高度なモードの切り替え(Settings > Toggle Advanced Mode)を選択して詳細設定モードを有効にします。

for ループ(For Loop)ノードを使用する

また、for ループ(For Loop)ノードを作成するためには、詳細設定モードにする必要があります。

次の例では、for ループ(For Loop)を使用して、テクスチャを異なる UV オフセットで 3 回サンプリングする方法を示します。サンプリングされた値を加算し、合計を 3 で除算して、平均値が TraditionalGameSurfaceShader拡散カラー(Diffuse Color)チャネルに適用されます。

for ループを設定する

  1. Hw シェーダ ノード > フロー コントロール > for ループ(Hw Shader Nodes > Flow Control > For Loop)を選択して、for ループ(For Loop)ノードを作成します。
    ヒント: 正方形のポートは、複数の入力を受け入れることができることを示します。
  2. Hw シェーダ ノード > 値 > 整数(Hw Shader Nodes > Values > Int)を選択して、整数(Integer)ノードを作成します。アトリビュート エディタ で値を 3 に設定し、for ループ(For Loop)ノードの B アトリビュートに接続します。
    • A アトリビュートは、ループの開始を示します。
    • B アトリビュートは、ループの終了を示します。
    • C アトリビュートは、ループの間隔を示します。
    • 既定では、A の値は 0 で、C の値は 1 です。ループにこれらの既定値を使用する場合、これらのアトリビュートを接続する必要はありません。

      この例では、for i = 0, i < 3, i++ を設定します。したがって、A および C の値を明示的に設定する必要はありません。

  3. Hw シェーダ ノード > 各種 > 文字列(Hw Shader Nodes > Various > String)を選択して、イテレータを作成します。アトリビュート エディタで、既定のオプション(Default options)ドロップダウン リストから i を選択し、for ループ(For Loop)ノードのイテレータ(Iterator)アトリビュートに接続します。
  4. Hw シェーダ ノード > 値 > Float 3(Hw Shader Nodes > Values > Float 3)を選択して、ループ内で計算された値を格納する変数を作成します。
    ヒント: 値を格納するには Float3 または Float4 を使用します。カラー(Color)は使用しません。
  5. Float3 アトリビュート エディタで、ノードの名前をループ結果(Loop Result)に変更し、値を 1 に初期化します。
  6. float3 アトリビュートを for ループ(For Loop)ノードの変数(Variables)アトリビュートに接続します。これは 1 つの変数のみを使用する単純なループであるため、float3for ループ(For Loop)出力(Output)アトリビュートにも接続します。

テクスチャ サンプリングを設定する

  1. Hw シェーダ ノード > テクスチャ > テクスチャ マップ(Hw·Shader·Nodes·>·Textures·>·Texture·Map)を選択して、テクスチャ マップ(Texture Map)ノードを作成します。テクスチャをアトリビュート エディタMyTexture/Path アトリビュートに接続します。
  2. Hw シェーダ ノード > 値 > 配列(Hw Shader Nodes > Values > Array)を選択して、配列(Array)ノードを作成します。オフセット値の 3 つのセットが配列に格納されます。
  3. Hw シェーダ ノード > 値 > Float 2(Hw Shader Nodes > Values > Float 2)を 3 回選択して、オフセット値の 3 つのセット用に Float 2 ノードを 3 つ作成します。各 Float 2 ノードに対して、アトリビュート エディタでアトリビュートを次のように設定します。
    • 名前(Name): Offset1、X: 0.1、Y: 0.3
    • 名前(Name): Offset2、X: 0.2、Y: -0.4
    • 名前(Name): Offset3、X: 0.3、Y: 0.2
  4. 3 つの Float 2 ノードをすべて配列(Array)ノードの Values アトリビュートに接続します。
  5. テクスチャ マップ(Texture Map)ノードを選択します。アトリビュート エディタで、サンプラ / U 座標(Sampler / U Coordinate)およびサンプリング / V 座標(Sampling / V Coordinate)アトリビュートがラップ(WRAP)に設定されていることを確認します。

    テクスチャにはオフセットが指定されてサンプリングされるため、サンプリングが 0 ~ 1 の UV 範囲を超えることがあります。このアトリビュートをラップ(WRAP)に設定することで、UV 範囲が 1.0 を超えた場合に、ピクセルがテクスチャの先頭からサンプリングされるようになります。

  6. Hw シェーダ ノード > 共通入力 > UV セット(Hw Shader Nodes > Inputs Common > UV Set)および Hw シェーダ ノード > 数値演算 > 加算(Hw Shader Nodes > Math > Add)を選択して、それぞれ UV セット(UV Set)ノードおよび加算(Add)ノードを作成します。
  7. 次のようにノードを接続します。
    • 配列(Array)値(Value)アトリビュートを加算(Add)値(Value)アトリビュートに接続します。
    • UV セット(UV Set)UV アトリビュートを加算(Add)値(Value)アトリビュートに接続します。
    • 加算(Add)結果(Result)アトリビュートをテクスチャ マップ(Texture Map)UV アトリビュートに接続します。
    • イテレータ(文字列(String)ノード)の出力(Output)アトリビュートを配列(Array)インデックス(Index)アトリビュートに接続します。これにより、for ループでオフセット値を取得できるようになります。
    • テクスチャ マップ(Texture Map)カラー(Color)アトリビュートを for ループ(For Loop)計算(Calculations)アトリビュートに接続します。これにより、for ループの計算が設定され、テクスチャ マップが 3 回サンプリングされます。

サンプリング結果の平均値を計算する

  1. Hw シェーダ ノード > 各種 > 文字列(Hw Shader Nodes > Various > String)を選択して文字列(String)ノードを作成し、既定のオプション(Default options)ドロップダウン リストから += を選択します。
  2. 文字列(String)出力(Output)の値を for ループ(For Loop)ノードのオペレータ(Operators)アトリビュートに接続します。for ループ(For Loop)では、ループ結果(Loop Result)変数にテクスチャ サンプリングの結果を追加します。
  3. Hw シェーダ ノード > 数値演算 > 除算(Hw Shader Nodes > Math > Divide)を選択して、除算(Divide)ノードを作成します。for ループ(For Loop)出力(Output)アトリビュートを除算(Divide)の最初の値(Value)アトリビュートに接続します。ループ結果(Loop Result)は 3 つのサンプリング値の合計であるため、平均を取得するには値を 3 で除算する必要があります。
  4. Hw シェーダ ノード > 値 > 浮動小数(Hw Shader Nodes > Values > Float)を選択して浮動小数(Float)ノードを作成し、アトリビュート エディタで値を 3 に値を設定します。floatアトリビュートを除算(Divide)の他の値(Value)アトリビュートに接続して、サンプリング結果の合計を 3 で除算します。
  5. 除算(Divide)結果(Result)アトリビュートを TraditionalGamesSurfaceShader拡散カラー(Diffuse Color)アトリビュートに接続します。

ShaderFX マテリアルをシェーダ ファイルに書き出してシェーダ コードを調べ、作成した for ループを確認することができます。

float3 LoopResult = float3(1.0, 1.0, 1.0);	
for(int i=0; i<3; i+=1)	
{		
    float2 AddOp = (Array_bphdfiwhhj[i] + IN.map1.xy);		
    float4 Sampler = numberTestTexture.Sample(MMMLWWWSampler, AddOp);		
    LoopResult += Sampler.xyz;
}

シェーダ ファイルへの書き出しの詳細については、「ShaderFX マテリアルを HLSL、CgFX、および GLSL に書き出す」を参照してください。