Substance DesignerにPixel Processorというピクセルシェーダのような処理が出来る機能を知ったので習作で法線テクスチャーの回転をやってみました。ここのところ座標の回転をやっているので今回もその流れでいこうかと思います。
法線テクスチャーはベクトルを画像にしたデータで、XYZの座標がそのままRGBに格納されています。ベクトルの値は-1~1までの範囲ですが、画像にはマイナスがないので0~1(または0~255)の値にスケーリングされています。画像を回転させるにはベクトルの方向を維持しないとなりません。
法線テクスチャーにPixel Processorノードをつなぎます。Editボタンでノードの中に入り処理を組んでいきます。
全体のノードはこのような感じ。入力した座標を回転させ、その座標に該当するピクセルを画像データから取得し、そこに回転の計算を掛けて出力する、という流れ。
画像を中心で回転させるためにGet Float2($posに設定)ノードで入力された座標を(-0.5, -0.5)でオフセットして中心が原点に来るように移動し、Rotate Positionノードで回転させた後、(0.5, 0.5)でオフセットして元の座標に戻します。入力の値は0~1の範囲。時計回りに回転させるために入力の回転値に-1を掛けています。
回転の値はベクトルの計算に使うのでTurns to Degreesでオイラー角にスケールし直した後にDegrees To Radianでラジアンに変換させています。ところどころ単位には気を付ける必要あり。
画像のそれぞれの成分を分解。回転に使う要素はXとYなのでSwizzle Float1等を使って取り出し、[0, 1] to [-1, 1]ノードでベクトルの範囲にスケーリングします。
ここでも書いたように、ベクトルを回転させる計算を組みます。
x’ = x*cosθ – y*sinθ
y’ = x*sinθ + y*cosθ
x, y成分と角度(ラジアン)を組み合わせて式をつくり、[-1, 1] to [0, 1]で元の画像の成分にスケーリングしてVector Float2, Vector Float4ノードで統合していきます。最後にfloat4ノードを右クリックしてSet as Output Nodeを設定すれば結果が出力されるようになります。
Substance Designerはまだ使いこなせているレベルではないですが何かと可能性は感じています。