0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実装編:フレネル反射について

0
Posted at

はじめに

今回の記事は、本物のような海面の動きをUnityで表現するためにShaderGraphを組んでるときに思った疑問や気づきをつづったものです。かなり初歩的な内容を取り扱っていますが、あらかじめご了承ください。

へえ、Fresnel Effectノードってのがあるらしいじゃん

以前書いた記事を元にShader Graphを作成しようとしたところ、何となくNode検索欄でFresnelと打ってみたところUnity公式が用意してくれてたFresnel Effectノードが存在していました。(知らなかった)

image.png

乗数らしき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で作ってみた

image.png

一旦できました~。
ゲルストナー波やら組み合わせた記事を追々書いていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?