🔥

Unity ShaderGraph備忘録 part2-Timeと波形

に公開

Timeノード

alt text
アニメーションするシェーダーを作る時に使うノード

  • Time
    シーン開始時からの経過時間を出力する
  • Sine Time
    弧を描くように-1~1の値を往復する。2π(≒6.28秒)で一周。開始地点は0
  • Cosine Time
    Sine Time を時間方向に少し前にずらした動きをする。開始地点が1
  • Delta Time
    1つ前のフレームからの経過時間を出力する
  • Smooth Delta
    Delta Timeを複数フレーム参照して、その平均値を出力する


特にTimeは頻繁に使う

alt text
Timeで色相を変えてる図


Timeを波形に加工することで波のうねりやライトの明滅など多彩な表現ができる
今回はその波形について軽く触れていこうと思います


波形?

まずSine TimeとCosine Timeを少し掘り下げます


この2つの単語、高校の数学で聞き覚えがある人もいると思いますが
あの三角関数のsinとcosと同じものを使ってます


もっと掘り下げると「単位円におけるsinΘとcosΘがどうのこうの…」みたいな話になるけど

凄くざっくり言うと半径1の円をぐるぐる回ってるようなものです
イメージ図(Wikipedia)

グラフで見てみる波形

Sine Timeを2次元のグラフに置き換えると、このようなグラフになる
alt text
こういう波のグラフを波形と呼びます


Cosine Timeのグラフはこう
alt text


Sine Time、Cosine Timeは内部的にはtimeノードをSine、Cosineノードに繋げた出力と同じ
なので並べると全く同じ動きをするのが見れます
alt text



ShaderGraphのWaveノード

例えば、ShaderGraphには複数のWaveノードが搭載されていて
InにTimeを繋ぐ事で、時間経過で変化する波形を気軽に出力できます

  • TriangleWave
    三角波。1秒間に-1~1を直線的に往復する波形を返す
    alt text

グラフにすると三角形の波形になる
alt text



  • SawToothWave
    alt text
    こちらは名前の通りノコギリ型の波形を返す
    alt text



  • SquareWave
    矩形波。0.5秒刻みで-1,1の値を交互に繰り返す
    alt text

グラフで見るとこのような波形になる
alt text



  • NoiseSineWave
    Sine波にMinMaxで入力した値のノイズを加える
    alt text

NoiseSineWaveのグラフ
alt text


※Noise
TimeをSimpleNoiseに加える等してランダムに0~1の値を返すことができます。
正確にはノイズの掛け方が違いますが、原理的には同じようなものを使ってSine波に加えてます
alt text


波形への乗算

Timeを波形ノードの前後でMultiplyを噛ませる事があるが
波形の前と後で振る舞いが変わる

  1. 波形の前のTimeを乗算すると、波形の速さ(周波数)が変わる
  2. 波形の後のOutを乗算すると、波の大きさが変わる

グラフで見るとそれぞれ以下になる
緑のグラフが1(Timeに3をMultiplyしてSineに通す)、
赤のグラフが2(TimeをSineに通してから2をMultiplyする)
alt text


波形の組み合わせ

波形と波形を組み合わせることもできる
上記の「1」の波形から「2」の波形をSubtractすると奇妙な曲線になったり、などなど
alt text



シェーダーでの使用例

UVで例を挙げます
UVをSplitに繋げてUやV(Split上ではR or G)の値を取り出すと白黒のグラデーションが作れます
alt text

(※Splitノード:複数にまとまってる数値を分割して取り出すノード。
RGBAは色情報の(赤・緑・青・透明度)から来てる)


水平方向のグラデーションに任意の値をMultiplyした上でTimeをAddし、波形に変換すると、水平方向にスクロールする縞模様ができる
alt text
uvへのMultiplyで縞模様の細かさ、
TimeへのMultiplyでスクロールの速度を変更できる


それぞれの縞模様をAddしてStepノードで2値化、Multiplyで値を小さくしてTiling and OffsetのOffsetに繋げると
alt text
(※Stepノード:閾値を越えたら1,超えなかったら0を返す)



alt text
陽炎のようなアニメーションになる

Discussion