すぎしーのXRと3DCG

主にXR, Unity, 3DCG系の記事を投稿していきます。

【Unity】Shader Graphで走査線っぽいもの

f:id:tsgcpp:20200908230132j:plain

概要

今回は Shader Graph で走査線っぽいもの作り方を紹介します。 併せてシェーダーを作るときの考え方も解説したいと思います!

動作環境

  • Unity 2020.1.4f1
    • Universal RP 8.2.0

今回作るもの

以下の動画の様にスクロールする走査線を作ります。

www.youtube.com

実装機能

せっかくのシェーダなので、パラメータで以下のものを調整できるようにしましょう。

  • 走査線の色
  • 走査線の幅
  • 走査線の速度
  • 走査線の出現頻度
  • UV座標のV方向に走査線が移動(理由は後述)

シェーダーテクニック

シェーダーを実装する前にいくつかテクニックを紹介します。

UVノード と 分離(Split)

UVノード は文字通りUV座標を取り出すことができます。
R要素にはU座標、G要素にはV座標が含まれています。

UV座標は[0, 1]の範囲のため、Splitノードで要素をU, Vに分離することでグレースケールのグラデーションを作ることができます。

f:id:tsgcpp:20200909001555p:plain

V要素に関して言えば下方(0の方)が黒、上方(1の方)が白というグレースケールを取り出すことができます。

Fraction

Fractionノード というものがあります。
「入力数値の小数点を取り出す」ノードとなります。

グラフで表すと以下のような一次関数を並べた感じになります。

f:id:tsgcpp:20200909003158j:plain
Fractionのグラフ(横軸: 入力、縦軸: 出力)

簡単に言うと 0 から 1 (厳密には0.999...) を繰り返すノードを作成することができます。

www.youtube.com

Time + UV + Split + Fraction

www.youtube.com

www.youtube.com

所謂「UVスクロール」です。

UVをSplitノードで分離することでU or V方向にスクロールするノードとなります。
また、AddノードとSubtractノードでスクロール方向が反転する性質があります。

三角波

www.youtube.com

所謂「三角波ノード」です。

このノード、見た目はシンプルですが 「走査線の幅」の調整とかなり相性が良かったりします

f:id:tsgcpp:20200909014633p:plain
三角波のイメージ

Fractionを[0, 1] → [-1, 1]に変換して絶対値を取ると、0 → 1 → 0...を繰り返す三角波を実現できます。

三角波 + Step

先程作成した三角波ノードをStepに渡すと以下のようなノードになります。

www.youtube.com

何が言いたいかというと「波の幅をパラメータで設定しやすい」ということです!

三角波 + Smoothstep

今回の主役ノードです!

www.youtube.com

三角波はSmoothstepとも相性が良いです。
グラデーション付きの波をシームレスに作ることができます。

余談:Time + Fraction + Smoothstep

stepをであれば"Time + fraction"で十分ですが、 Smoothstepの場合は残念ながらシームレスになりません。
三角波を作った理由は「シームレスな波が必要」だったからなんですね。

波の出現の周期を変える

www.youtube.com

これはUVスクロールの値を周期数で割り、StepのEdgeも同様に周期数で割れば実現できます。

※UVスクロールの値だけだと走査線になる部分の幅が広がってしまいますので、幅も割って調整します。

UVスクロールのスピードを遅らせるということですね。

完成形

上記のテクニックを組み合わせて、プロパティで調整可能にしてアルファ(不透明度)に使用したのが今回のシェーダになります!

www.youtube.com

Githubのプロジェクトに完成形を置いておきますので、良かったらどうぞ。

サンプルプロジェクト

github.com

雑感

今回はShader Graphを題材にしてみました。
記事を書いていて思ったのは「これ、音声解説 + 動画のほうが絶対わかりやすいだろ」でした。。。

別にAviutl使えないわけじゃないんですがちょっとトークに自信がないです。。。
ただ動画のほうが情報をたくさん詰め込めますし、僕みたいに字だとわからなくても動画だと理解しやすい人のほうが多いと思いますのでいつか挑戦してみたいです。

次回ですが、そろそろ以前から考えていたポートフォリオに本格的に集中しようと思いますので、 しばらくは投稿頻度は下がると思います。

それでは~。