for ループ ノードを使用する
for ループ ノードを作成するためには詳細モードである必要もあります。
次の例は、for ループを使用してテクスチャを別の UV オフセットで 3 回サンプリングする手順を示したものです。サンプル値は、加算され、合計が 3 で除算されて、その平均値が TraditionalGameSurfaceShader の拡散反射光カラー チャネルに適用されます。
for ループを設定するには:
- ShaderFX 作業領域で、右クリックして、[ツール](Tools)[詳細モードを切り替え](Toggle Advanced Mode)を選択し、詳細モードがアクティブであることを確認します。
- 右クリックして、[Hw シェーダ ノード](Hw Shader Nodes) [フロー コントロール](Flow Control) [for ループ](For Loop) を選択し、ForOp ノードを作成します。
ヒント: 正方形のポートは、ポートが複数の入力を受け入れることができることを示します。
- [Hw シェーダ ノード](Hw Shader Nodes) [各種](Values) [Int] を選択して整数ノードを作成します。[プロパティ](Properties)パネルで、その値を 3 に設定します。for ループ ノードの B アトリビュートに接続します。
- A アトリビュートは、ループの開始を表します。
- B アトリビュートは、ループの終了を表します。
- C アトリビュートは、ループの間隔を表します。
既定値では、A の値は 0、C の値は 1 です。ループにこれらの既定値を使用する場合、これらのアトリビュートを接続する必要はありません。
この例では、for i = 0, i < 3, i++ を設定します。したがって、A と C の値を明示的に設定する必要はありません。
- [Hw シェーダ ノード](Hw Shader Nodes) [各種](Various) [文字列](String) を選択して、反復子として使用する文字列を作成します。[プロパティ](Properties)パネルで、[既定値のオプション](Default Options)ドロップダウン リストで i を選択します(この選択肢を確認するには、下にスクロールする必要があります)。for ループ ノードの反復子アトリビュートを文字列ノードの出力ポートに接続します。
- [Hw シェーダ ノード](Hw Shader Nodes) [各種](Values) [Float3] を選択して、ループ内で計算される値を保存する変数を作成します。
ヒント: Float3 または Float4 を使用して値を保存します。カラー ノードは使用しないでください。
- [プロパティ](Properties)パネルで、Float3 ノードの名前を LoopResult に変更して、3 つの値が 1.0 に初期化されていることを確認します。
- LoopResult ノードを for ループ ノードの変数アトリビュートに接続します。これは変数が 1 つのみ使用される簡単なループであるため、LoopResult を for ループの出力アトリビュートにも接続します。
テクスチャ サンプリングの設定:
- [Hw シェーダ ノード](Hw Shader Nodes) [Textures ] [テクスチャ マップ](Texture Map) を選択して TextureMap ノードを作成します。[プロパティ](Properties)パネルで、MyTexture / パス コントロールを使用して、テクスチャ ファイルをこのノードに割り当てます。
さらに、[プロパティ](Properties)パネルで、サンプラー / U 座標およびサンプラー / V 座標のアトリビュートが WRAP に設定されていることを確認します。
テクスチャがオフセットでサンプリングされるため、サンプリングが 0 ~ 1 の UV 範囲を超える場合があります。これらのアトリビュートを WRAP に設定することによって、UV 範囲が 1.0 を超えたときにピクセルがテクスチャの最初からサンプリングされることを確認します。
- [Hw シェーダ ノード](Hw Shader Nodes) [値](Values) [配列](Array)を選択して、配列ノードを作成します。オフセット値の 3 つのセットがこの配列に保存されます。
- [Hw シェーダ ノード](Hw Shader Nodes) [値](Values) [Float2] を 3 回選択して、3 つの Float2 ノードを作成して、オフセット値の 3 つのセットを保存します。[プロパティ](Properties)パネルを使用して、3 つの Float2 アトリビュートを次のように設定します。
- Name: Offset1, X: 0.1, Y: 0.3
- Name: Offset2, X: 0.2, Y: -0.4
- Name: Offset3, X: 0.3, Y: 0.2
- 配列ノードの値アトリビュートに 3 つの Float2 ノードすべてを接続します。
- [Hw シェーダ ノード](Hw Shader Nodes) [入力共通](Inputs Common) [UV 設定および Hw シェーダ ノード](UV Set and Hw Shader Nodes) [計算](Math) [追加](Add) を選択して、UV セット ノードおよび追加ノードを作成します。
- 次のようにノードを接続します。
- 追加の値アトリビュートに配列の値アトリビュートを接続します。
- UV セットの UV アトリビュートを追加の他の値アトリビュートに接続します。
- 追加の結果アトリビュートを TextureMap の UV アトリビュートに接続します。
- 反復子(文字列ノード)の出力アトリビュートを配列のインデックス アトリビュートに接続します。これにより、for ループでオフセットの値を取得できます。
- テクスチャ マップのカラー アトリビュートを for ループの計算アトリビュートに接続します。これにより、for ループの計算を設定します。テクスチャ マップを 3 回サンプリングします。
サンプリング結果の平均を計算します。
- [Hw シェーダ ノード](Hw Shader Nodes) [各種](Various) [文字列](String)を選択して、文字列ノードを作成します。[プロパティ](Properties)パネルで、[既定のオプション](Default Options)ドロップダウン リストから += を選択します。
- 新しい文字列ノードの出力値を for ループ ノードのオペレータ アトリビュートに接続します。
for ループは、ループ結果の変数にテクスチャ サンプリングの結果を追加します。
- [Hw シェーダ ノード](Hw Shader Nodes) [計算](Math) [分割](Divide)を選択して、分割ノードを作成します。for ループの出力アトリビュートを分割の最初の値アトリビュートに接続します。
ループの結果が 3 つのサンプリング値の合計であるため、その値を 3 で割って平均を求める必要があります。
- [Hw シェーダ ノード](Hw Shader Nodes) [値](Values) [浮動小数](Float)を選択して、浮動小数ノードを作成します。[プロパティ](Properties)パネルで、値を 3.0 に設定します。浮動小数アトリビュートを分割の他の値アトリビュートに接続して、サンプリング結果の合計を 3 で分割します。
- 分割の結果アトリビュートを TraditionalGamesSurfaceShaderの拡散反射光カラーアトリビュートに接続します。
(Quicksilver レンダラーを使用してレンダリングした)チェッカーボード パターンの反復の結果
シェーダ ファイルに 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 = chessboard_woodjpg.Sample(MMMLWWWSampler, AddOp);
LoopResult += Sampler.xyz;
}
シェーダ ファイルへの書き出しについての詳細は、「HLSL、CgFX および GLSL への書き出し」を参照してください。