[Unity] 屈折(もどき)を作る[ShaderForge]

屈折っぽいものをShaderForgeで作るメモをば

内容は こちらのブログ を参考に作りつつどこでなにをやってるのかを調べてみました。

基本的な考え方としては、現在のカメラからみた映像を弄っている形になります。

LightingはCustomにして、CustomLightingにSceneColorを刺します。
SceneColorが、現在のディスプレイにうつる画像を出力するノードなので、このままだと

オブジェクトに今の絵がはりつけられるので透明になります。

スクリーンポジションをScreenPosで取得して、それに対してオフセットをかけてみると

こんな感じに中にうつる絵が、ScreenPosで足した分だけずらすことが出来ます。
ScreenPosは、デフォルトはNormalizedになってますがScene UVにすると、上のようになります。

スフィアのエッジ部分のほうがゆがむようにするため、ScreenPosにフレネルを足します。
こうすることで、エッジに近づくにつれてUVがオフセットされて

こんな感じでゆがんだような感じがでてきます。
これだけでもだいぶガラスっぽい質感がでますね。

最後に、より屈折した感じを出すために、スフィアの上側にも色が映り込むようにします。

完成図がこんな感じ。
Normalを反転して、Local座標からView座標に座標変換。
コレ何でだろうと思ったら、ScreenPosがView座標なので
それに併せてNormalを変換してるってことなんですね。
Negateはなんだろうとおもったら、画面を反転させる効果があって
コレがない場合

こうですが

反転された色が左上あたりに若干入るので、より屈折してる感じが出ます。
なるほどなぁ

(クリックで再生)

最終的な結果はこんな感じ。
面白いなぁ

おまけ。
テストしていた当初の完成がTwitterにアップした

(クリックで再生)

こんな感じだったのですが、これはScreenPosをNormalizedにしていたせいで
まぁそれっぽいけどなんか違うなぁという感じになっていました。
ScreenPosがSceneUVsの場合は、UV上の数値に置き換えてくれるので
今回のように画面に対してゆがませたい場合は、SceneUVsにする必要があるんですね。

イマイチ分からないのが、NormalのPertubedオプション。
翻訳すると「摂動」になるんですけど…せつどう・・・?

もうしばらく研究がんばろう。
シェーダー周りもやり始めると底が深すぎて大変ですなぁ…しかし楽しい。

コメントを残す

メールアドレスが公開されることはありません。

*