【Unity】シェーダーのCgプログラミングの関数について

最近手に入れた「Unityでわかる!ゲーム数学」の簡単なレンダリング(4章)を読んでみました。ShaderForgeを使ってシェーダーを作ったことがあるのですが、計算の意味が説明されていましたので参考になる部分が多かったと感じました。

小数点以下を取り出す frac()

[c] fixed4 col = fixed4(0.0, 0.0, 1.0, 1.0); col.b = frac(i.uv.x - 0.5); [/c]

UVは0 ~ 1.0の値ということでなので、上記のコードを書くと次の画像のようになります。 ちょうど0.5(真ん中)の時に小数点が0になります。

NewImage

動かす

Timeを使えばUVスクロールができます。 [c] col.b = frac(i.uv.x - (0.5 * Time.g)); [/c]

Time

絶対値を取り出す abs()

[c] col.b = abs*1; [/c]

平方根を使って円の情報を取り出します。

circle.2018.png

画像を見てわかるように中心点が右上になっています。 UVの位置を調整すると次のように表示されます。 [c] float2 newUv = float2(i.uv.x - 0.5, i.uv.y - 0.5); col.b = frac(sqrt(newUv.x * newUv.x + newUv.y * newUv.y) * 2.0); [/c]

circle2.2018

距離 : distance()

先程は平方根を使いましたが、中心点がわかればdistance()で同じようなことができます。 [c] float2 newUv = distance(i.uv, float2(0.5,0.5)); [/c]

*1:frac(i.uv.x - (0.5 * _Time.g) ) * 2.0) - 1.0); [/c]

取り出した小数点を2倍して1.0を引いた値の絶対値を取り出すことで滑らかなグラフィックを実現することができます。

Time2

平方根 : sqrt()

[c] col.b = frac(sqrt(i.uv.x * i.uv.x + i.uv.y * i.uv.y