デコシノニッキ

ホロレンジャーの戦いの記録

Shader Graph Example Libraryを整理してみる

www.tattichan.work

参考
tips.hecomi.com

Color Rim

f:id:haikage1755:20180210121139p:plain:w250
f:id:haikage1755:20180210121443p:plain:w250

以前にやったリムとだいたい同じですね。
www.tattichan.work

ViewDirectionとNormalで内積をとり、0(垂直)に近いほど色合いを強くし、輪郭を強調します。0に近いほど色合いを強くするため、OneMinusで反転させてやります。
以前は使っていなかったSmoothStep関数を使います。
smoothstep (DirectX HLSL)
これにより、先ほどの値を最小値(1)と最大値(1-Rim)との間で補間してやります。Rimを大きくするほど、リム効果の影響範囲が大きくなります。Multiplyでリムに色付けしてやります。

入力からEmissionを取得し、Addします。Sub-PBRTextureSampleは今回より新しく追加されたノードですね。
f:id:haikage1755:20180210123018p:plain:w250

Scrolling Texture

f:id:haikage1755:20180210123546p:plain:w250
f:id:haikage1755:20180210123446p:plain:w250

ベースはこちらになります。が、このノード見る限り自分の間違っているなぁ…
www.tattichan.work

TimeにScroll Speedで重みづけして、Textureの流れるスピードを変更しています。Positionは頂点位置のことです。
f:id:haikage1755:20180210123807p:plain:w250
動くTexture部分をLerpで重ね合わせてやります。以前書いたこちらが参考になるかと思います。
www.tattichan.work
f:id:haikage1755:20180210124444p:plain:w250

Color Gradient

f:id:haikage1755:20180210124629p:plain:w250
f:id:haikage1755:20180210124720p:plain:w250

Gradientは勾配という意味です。Splitで頂点からG(グリーン)の要素を抜き出してやります。ちなみにRを取り出すと、左右のカラー勾配、Bだと前後のカラー勾配になります。Positionがさすのはモデルのローカル座標(x,y,z)のことだからでしょうか?まだ理解が足りていないです…
Spreadで色の広がり方、Positionで上下の勾配の切れ目位置のバランスを調節することができます。この値は0-で出力されるのでLerpに入れてやればベースカラーに対してどの程度別カラーを重ね合わせるといった処理になります。

Sliced

難しいです。予想になります…
f:id:haikage1755:20180210130640p:plain:w250
f:id:haikage1755:20180210130758p:plain:w250

PositionのG(上下)でSliceする方向を決めています。GとGを足し合わせ2倍にし、Multiplyによってさらに整数値を掛け合わせています。Fractuionは小数点部を返します。Step関数はある閾値に対して、それ以下は0を、それ以上では1を返すノードです。

例えばGが0.1-0.9であれば、整数倍したときは次の表と同じ対応になるかと思います。
f:id:haikage1755:20180210150500p:plain:w250

ここから小数点部だけ抜き出してみると、
f:id:haikage1755:20180210151003p:plain:w250

サンプル通り閾値を0.4としてみると、Stepによって返ってくるアルファ値は、
f:id:haikage1755:20180210151224p:plain:w250

ですね。つまり、整数倍していくほど01の切り替わり回数が多くなるためスライスの数は増えます。

Snow

f:id:haikage1755:20180210152754p:plain:w250
f:id:haikage1755:20180210152840p:plain:w250

まずパーツ1リム部分です。だいたい大丈夫でしょう。Powerでリムの減衰率を強調していますね。
f:id:haikage1755:20180210152948p:plain:w250

パーツ2です。Snow DirectionでSnowのかかる向きを調整します。さらに2値処理をかけることで、色合いをくっきりさせています。
f:id:haikage1755:20180210153303p:plain:w250

Snowの透明度をリムで決めてやります。SnowDepthが小さいほど雪の範囲が大きくなり、RimPowerが大きいほど雪はぼやけていきます。
f:id:haikage1755:20180210153655p:plain:w250

ToonRamp

f:id:haikage1755:20180212132753p:plain:w250
f:id:haikage1755:20180212132853p:plain:w250

所謂トゥーンシェーダと呼ばれるものです。中身も基本的な実装でした。
nn-hokuson.hatenablog.com

トゥーンシェーダでは、
1. 光の当たり度合い(影のでき方)を計算する
ライトの向きとオブジェクトのノーマルで内積をとる
1に近いほど強く光が当たっており、-1では完全に影。

f:id:haikage1755:20180212133541p:plain:w250

2. 影の色をテクスチャベースにする
内積値を1~-1から0~1になるように0.5をかけて0.5を足す
個の値をuv座標として扱う。
f:id:haikage1755:20180212133601p:plain:w250

3. もとのTextureと影テクスチャを掛け合わせる

加えてこのサンプルでは、発光用のテクスチャもAddで追加されています。

Texture Dissolve

f:id:haikage1755:20180212133956p:plain:w250
f:id:haikage1755:20180212134036p:plain:w250

Dissolveは「分解」という意味です。
qiita.com

分解表現用のTextureとTilingの設定です。
f:id:haikage1755:20180212134558p:plain:w250

Clipping用と穴の輪郭部分になります。上のClipping用のノードに対して下のノードは、Edgeが上乗せされているので、やや大きめになります。そこから穴部分を引いているので輪郭部分だけが抽出されるという仕組みです。
f:id:haikage1755:20180212134930p:plain:w250

輪郭は色付けしてEmissionに格納、Clipping部分はAlphaClippingThresholdに入れて最終的な穴あき部分を作っています。
f:id:haikage1755:20180212135804p:plain:w250

Hologram

f:id:haikage1755:20180212140022p:plain:w250
f:id:haikage1755:20180212140124p:plain:w250

Sci-Fiな表現をするHologram Shaderです。Asset Storeでもよく見かけますね。

uvを時間変化で動かしています。
f:id:haikage1755:20180212140344p:plain:w250

濃淡のバランスをとるためにone minusで色付けする部分のalpha値を反転させています。
f:id:haikage1755:20180212141047p:plain:w250

そのまま色を設定するとこうなります。
f:id:haikage1755:20180212141353p:plain:h150

ColoredGhostNoise

f:id:haikage1755:20180212141534p:plain:w250
f:id:haikage1755:20180212141854p:plain:w250

Shader名はColoredGhostNoiseですが、Sceneオブジェクト名はLiquidNoiseです。

uvスクロールにノイズを加えています。
f:id:haikage1755:20180212141945p:plain:w250

ノイズを元にベースカラーへのノイズのかけ具合、透明度の調整、法線を決めています。Normal Unpackは[Unity] Vertex/Fragment shaderで通常のライティングとシャドウを適用するサンプル - Qiitaを参照してください。まだ自分もよくわかっていないです…
f:id:haikage1755:20180212142118p:plain:w250

PhaseInAndOut

f:id:haikage1755:20180212142837p:plain:w250
f:id:haikage1755:20180212143222p:plain:w250

まずは分かりやすいClippingから。Positionからsplit Gで上下方向を取得し、
f:id:haikage1755:20180212145019p:plain:w250
StepでSplit Value閾値として上からどこまで0をみなすかを計算し、
f:id:haikage1755:20180212145132p:plain:w250
InverseColorで上下を反転させてやります。これでClippingは完成です。
f:id:haikage1755:20180212145351p:plain:w250
(こんなめんどくさい処理しなくても、Stepの入力値逆にすればいいんじゃないかという気もするけど…)

次に切り目を光らせる処理です。EdgeSpreadの入力は切り目の光らせる幅を決める部分です。
f:id:haikage1755:20180212145722p:plain:w250

Remapは、指定した範囲中における入力値の割合から別の範囲での割合から求められる値に変換する処理です。
【Shader Forge】Remapについて - Qiita
例えば、範囲を[a.b]、変換したい範囲を[A,B]、入力値をxとすると、指定区間内の現在の値の位置は、
ratio=(x-a)/(b-a)
新しい範囲に変換すると
X=ratio * (B-A) + A

範囲はSmoothStepを使って決めてやります。
f:id:haikage1755:20180212150749p:plain:w250

SmoothStepはある範囲内における割合いを0~1で返す関数です。
例えばGradientを下限、SplitValueが上限の時、Gradiednがより小さい場合(x)はEdgeは1ですし、yの時であればおよそ0.5になるでしょう。
これを全てのGradientについて行った結果このような細い線になるという訳です。ただ、線の部分が透明(黒)では意味がないのでone minusで反転します。
f:id:haikage1755:20180212151535p:plain:w250

あとは色をつけてEmissionに入れるだけです。
f:id:haikage1755:20180212152111p:plain:w250

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」