はじめに
今回の記事は、本物のような海面の動きをUnityで表現するためにShaderGraphを組んでるときに思った疑問や気づきをつづったものです。かなり初歩的な内容を取り扱っていますが、あらかじめご了承ください。
へえ、Fresnel Effectノードってのがあるらしいじゃん
以前書いた記事を元にShader Graphを作成しようとしたところ、何となくNode検索欄でFresnelと打ってみたところUnity公式が用意してくれてたFresnel Effectノードが存在していました。(知らなかった)
乗数らしきX[1]の値を[5]にしたら、ちゃんとフレネル反射してくれてます!!すごい!!めちゃくちゃ便利じゃないですか...!!
中の計算がどうなっているのか気になって、Unity公式サイトを見たところ以下のコードが出てきました。
void Unity_FresnelEffect_float(float3 Normal, float3 ViewDir, float Power, out float Out)
{
Out = pow((1.0 - saturate(dot(normalize(Normal), normalize(ViewDir)))), Power);
}
フレネルの近似式っぽいですが、フレネルの近似式にはある物質の反射率(F0) の情報は組み込まれていないみたいですね。あとは、計算の中で計算された内積をSaturate(Clamp)
してくれているので、自作で最初からフレネルのグラフを作るよりかはノードを組む手間が省かれていますね。(Unity側からも内積をSaturateすることを推奨されているみたい)
$F_r(\theta) \approx F_0 + (1 - F_0)(1 - \cos\theta)^5$
の反射率の情報以外は組み込まれているみたいなので、物質ごとにリアルな反射を表現したいなら自分でノードを組む必要があるってことっぽいですね。了解。
【おまけ】 フレネルの近似式と比較
$F_r(\theta) \approx F_0 + (1 - F_0)(1 - \cos\theta)^5$
$\text{Out} = (1.0 - \text{Saturate}(\text{Normal} \cdot \text{View}))^{\text{Power}}$
フレネルの近似式をShaderGraphで作ってみた
一旦できました~。
ゲルストナー波やら組み合わせた記事を追々書いていきます。

