はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】ShaderGraphでフレネル効果を両面描画に対応する

はじめに

前回ShaderGraphのFresnel Effectノードについて紹介をさせていただきました。

www.hanachiru-blog.com

ただこのノードでは、両面描画の場合には以下の画像のようにうまく動作しないことがありました。

f:id:hanaaaaaachiru:20200106012416p:plain

早速見ていきましょう。

自前実装する

Fresnel Effectノードは以下のようなコードで実装されています。

void Unity_FresnelEffect_float(float3 Normal, float3 ViewDir, float Power, out float Out)
{
    Out = pow((1.0 - saturate(dot(normalize(Normal), normalize(ViewDir)))), Power);
}

これをノードで実装してみるとこんな感じ。

f:id:hanaaaaaachiru:20200106013045p:plain


ここの内積をとっている部分で、1~-1の値の0以下を0にしてしまっているところが原因で両面描画ができなくなってしまっています。

これを絶対値をとることで解決することができます。

f:id:hanaaaaaachiru:20200106013526p:plain

さいごに

これに関してUnityの公式の動画(12分あたりから16分あたりまだ)で詳しく紹介をされているので、良かったらみてみてください。

www.youtube.com