【Unity】シェーダー学習ログ#3
前回はこちら。
衝突判定をつける
何から覚えていくかという道筋が定まっていないというか、手探り感が半端なくてひたすら獣道を走ってるような感覚に陥っているが、とにかく進まにゃなるめえ…。というわけで、前回見てたこの動画を見ながら進めてみる。
前回まで、「輪郭から遠い部分のアルファを薄く、輪郭から近い部分のアルファを濃くする」事で半透明感を表現した。今回は、「オブジェクトが衝突している部分のアルファを濃く、そうじゃない部分のアルファを薄くする」という妙技を使って、他オブジェクトに衝突してる部分を濃くする。どうやら、川とか海とかの水際を表現する時に重宝するテクらしい。
じゃあ、そのオブジェクト衝突とやらをどう判定するのだろうか?
動画内で紹介されてたシェーダーのグラフを一部抜粋したところ。今回は内積を使うのではなく、ほぼほぼ単純な引き算を使った話になる。
SceneDepth-Eyeは不透明オブジェクトのZバッファ深度。ScreenPosition-RawのW(4次元ベクトルの4つめの要素)は対象からカメラまでの距離が入っているらしい。(そのあたりの原理を追ってくと大変なので、今は「そういうもんだ」と覚えるしか無い)
その差分を取ると不透明オブジェクトに完全に接触している部分は0になるし、そこから離れるにしたがって1以上になる。その値をそのままAlphaに入れちゃうと、接触部分が透明で、そこから離れるに従って不透明になっていくので都合が悪い。
という事は、輪郭を作るときにそうしていたように、OneMinus的な行為を働けば接触部分のAlphaが濃くなる。接触部分の幅をいい感じに調整するために「EdgeOffset」変数を作って、そいつから値を引いてやれるといい感じになりそう。←フワッとした理解
そうすっと、キワの部分のアルファ具合を調整できるって寸法よ。
あと、SmoothStepノードを入れて引数のEdge1&2を弄ると、入力値に対してイージングが掛かるので、こんな感じで調整が効くようになる。
そいで、いま作った衝突奴と、前回作った輪郭表示奴をAddで重ねると、
輪郭&衝突してる部分のアルファを濃くできる。やったぜ。
力尽きた!
動画の内容的にはもっと先まであるのだけれど、チラッと見ただけで内容がドチャクソ濃そうな雰囲気を感じたので、今回はここまでにしておこう。次回の俺が、きっと血反吐を垂れ流しながら頑張ってくれるだろう・・・
この記事が気に入ったらサポートをしてみませんか?