- Color Rim
- Scrolling Texture
- Color Gradient
- Sliced
- Snow
- ToonRamp
- Texture Dissolve
- Hologram
- ColoredGhostNoise
- PhaseInAndOut
Color Rim
以前にやったリムとだいたい同じですね。
www.tattichan.work
ViewDirectionとNormalで内積をとり、0(垂直)に近いほど色合いを強くし、輪郭を強調します。0に近いほど色合いを強くするため、OneMinusで反転させてやります。
以前は使っていなかったSmoothStep関数を使います。
smoothstep (DirectX HLSL)
これにより、先ほどの値を最小値(1)と最大値(1-Rim)との間で補間してやります。Rimを大きくするほど、リム効果の影響範囲が大きくなります。Multiplyでリムに色付けしてやります。
入力からEmissionを取得し、Addします。Sub-PBRTextureSampleは今回より新しく追加されたノードですね。
Scrolling Texture
ベースはこちらになります。が、このノード見る限り自分の間違っているなぁ…
www.tattichan.work
TimeにScroll Speedで重みづけして、Textureの流れるスピードを変更しています。Positionは頂点位置のことです。
動くTexture部分をLerpで重ね合わせてやります。以前書いたこちらが参考になるかと思います。
www.tattichan.work
Color Gradient
Gradientは勾配という意味です。Splitで頂点からG(グリーン)の要素を抜き出してやります。ちなみにRを取り出すと、左右のカラー勾配、Bだと前後のカラー勾配になります。Positionがさすのはモデルのローカル座標(x,y,z)のことだからでしょうか?まだ理解が足りていないです…
Spreadで色の広がり方、Positionで上下の勾配の切れ目位置のバランスを調節することができます。この値は0-で出力されるのでLerpに入れてやればベースカラーに対してどの程度別カラーを重ね合わせるといった処理になります。
Sliced
難しいです。予想になります…
PositionのG(上下)でSliceする方向を決めています。GとGを足し合わせ2倍にし、Multiplyによってさらに整数値を掛け合わせています。Fractuionは小数点部を返します。Step関数はある閾値に対して、それ以下は0を、それ以上では1を返すノードです。
例えばGが0.1-0.9であれば、整数倍したときは次の表と同じ対応になるかと思います。
ここから小数点部だけ抜き出してみると、
サンプル通り閾値を0.4としてみると、Stepによって返ってくるアルファ値は、
ですね。つまり、整数倍していくほど01の切り替わり回数が多くなるためスライスの数は増えます。
Snow
まずパーツ1リム部分です。だいたい大丈夫でしょう。Powerでリムの減衰率を強調していますね。
パーツ2です。Snow DirectionでSnowのかかる向きを調整します。さらに2値処理をかけることで、色合いをくっきりさせています。
Snowの透明度をリムで決めてやります。SnowDepthが小さいほど雪の範囲が大きくなり、RimPowerが大きいほど雪はぼやけていきます。
ToonRamp
所謂トゥーンシェーダと呼ばれるものです。中身も基本的な実装でした。
nn-hokuson.hatenablog.com
トゥーンシェーダでは、
1. 光の当たり度合い(影のでき方)を計算する
ライトの向きとオブジェクトのノーマルで内積をとる
1に近いほど強く光が当たっており、-1では完全に影。
2. 影の色をテクスチャベースにする
内積値を1~-1から0~1になるように0.5をかけて0.5を足す
個の値をuv座標として扱う。
3. もとのTextureと影テクスチャを掛け合わせる
加えてこのサンプルでは、発光用のテクスチャもAddで追加されています。
Texture Dissolve
Dissolveは「分解」という意味です。
qiita.com
分解表現用のTextureとTilingの設定です。
Clipping用と穴の輪郭部分になります。上のClipping用のノードに対して下のノードは、Edgeが上乗せされているので、やや大きめになります。そこから穴部分を引いているので輪郭部分だけが抽出されるという仕組みです。
輪郭は色付けしてEmissionに格納、Clipping部分はAlphaClippingThresholdに入れて最終的な穴あき部分を作っています。
Hologram
Sci-Fiな表現をするHologram Shaderです。Asset Storeでもよく見かけますね。
uvを時間変化で動かしています。
濃淡のバランスをとるためにone minusで色付けする部分のalpha値を反転させています。
そのまま色を設定するとこうなります。
ColoredGhostNoise
Shader名はColoredGhostNoiseですが、Sceneオブジェクト名はLiquidNoiseです。
uvスクロールにノイズを加えています。
ノイズを元にベースカラーへのノイズのかけ具合、透明度の調整、法線を決めています。Normal Unpackは[Unity] Vertex/Fragment shaderで通常のライティングとシャドウを適用するサンプル - Qiitaを参照してください。まだ自分もよくわかっていないです…
PhaseInAndOut
まずは分かりやすいClippingから。Positionからsplit Gで上下方向を取得し、
StepでSplit Valueを閾値として上からどこまで0をみなすかを計算し、
InverseColorで上下を反転させてやります。これでClippingは完成です。
(こんなめんどくさい処理しなくても、Stepの入力値逆にすればいいんじゃないかという気もするけど…)
次に切り目を光らせる処理です。EdgeSpreadの入力は切り目の光らせる幅を決める部分です。
Remapは、指定した範囲中における入力値の割合から別の範囲での割合から求められる値に変換する処理です。
【Shader Forge】Remapについて - Qiita
例えば、範囲を[a.b]、変換したい範囲を[A,B]、入力値をxとすると、指定区間内の現在の値の位置は、
ratio=(x-a)/(b-a)
新しい範囲に変換すると
X=ratio * (B-A) + A
範囲はSmoothStepを使って決めてやります。
SmoothStepはある範囲内における割合いを0~1で返す関数です。
例えばGradientを下限、SplitValueが上限の時、Gradiednがより小さい場合(x)はEdgeは1ですし、yの時であればおよそ0.5になるでしょう。
これを全てのGradientについて行った結果このような細い線になるという訳です。ただ、線の部分が透明(黒)では意味がないのでone minusで反転します。
あとは色をつけてEmissionに入れるだけです。