フレネル効果
Fresnel Effect別名:フレネル反射、フレネル
概要
表面を正面から見ると映り込みは弱く、浅い角度から見るほど強くなる現象。足元の水が透けて見えるのに、遠くの水面が空を鏡のように映すのはこのためである。
デモ
使われる場面
水面とガラス
足元の水は透けて見え、遠くの水面は空を映す。窓ガラスも、斜めから見るほど映り込みが強くなる。
物理ベースのマテリアル
つやのある表面はすべて、縁ほど映り込みが強くなる。物理ベースのシェーダーには組み込まれているので、個別に設定しないことが多い。
輪郭を光らせる演出
縁ほど大きくなる値をそのまま明るさに使い、バリアやホログラム、キャラクターの輪郭の光を作る。
車の塗装や陶器
正面では下地の色が見え、縁では周りの景色が映る。この変化が、つやのある素材らしさを作る。
判断基準
| こういうとき | こうする |
|---|---|
| 物理ベースのマテリアルを使っている | 自動で計算されるので、個別に足さない。反射率や屈折率の設定があれば、素材に合わせる。 |
| 独自のシェーダーで映り込みを足す(水面、ガラス、車の塗装) | 映り込みの強さにフレネル項を掛ける。一定の強さにすると、正面まで鏡のように光って不自然になる。 |
| 非金属の素材で、正面の反射率が分からない | F0 を 0.04(屈折率およそ 1.5)にすると、多くの素材でおおむね合う。水は約 0.02、宝石は 0.05〜0.17 程度。 |
| 金属の素材 | 正面でも反射率が高く(F0 が 0.5〜1)、映り込みに色が付く。角度による変化は非金属より小さい。 |
| 輪郭を光らせる演出だけが目的 | 物理的な正しさは要らないので、指数や色を見た目で調整してよい。 |
こう見えたら
指示の例
水面が足元まで空を強く映していて不自然。フレネル効果を入れて、足元は透けて遠くほど映り込むようにして
ガラス球の映り込みが、正面まで強すぎる。映り込みの強さにフレネル項を掛けて、正面の反射率を 4% くらいにして
キャラクターの輪郭をほんのり光らせたい。フレネルの値を使って、縁だけを明るくして
詳細
反射と透過の割合は角度で変わる
光が空気から水やガラスに当たると、一部は表面で反射し、残りは中へ進む。この割合は、光の当たる角度と、光の進みにくさを表す屈折率で決まる。正面から当たる光はほとんど中へ進み、表面すれすれに当たる光はほとんど反射する。見る角度によって反射の割合が変わるこの現象をフレネル効果と呼ぶ1。
球を見ると、正面の部分は視線と面がほぼ垂直なので反射が弱く、縁に近づくほど視線と面が浅い角度になって反射が強くなる。水面も同じで、足元は真上に近い角度から見るので透け、遠くは浅い角度から見るので空が映る。デモの左側のように反射率を一定にすると、縁の映り込みも遠くの水面の輝きも生まれない。
正面の反射率 F0 と Schlick の近似
正面から見たときの反射率を F0 と呼ぶ。空気と屈折率 の物質の境目では、次の式で求まる。
ガラス()では 、つまり正面では光の 4% しか反射しない。角度による変化は、Schlick の近似式で計算することが多い。 は、面の法線と視線のなす角である。
float cosTheta = max(dot(n, v), 0.0); // v は表面から視点への向き
float F = f0 + (1.0 - f0) * pow(1.0 - cosTheta, 5.0);
vec3 color = mix(surface, reflection, F); // 反射した分だけ、下の色は見えにくくなる
反射した光の分だけ、中へ進む光は減る。そのため映り込みを足すだけでなく、下地の色を の割合に弱める。デモの「反射率を白黒で表示」は、この をそのまま明るさにしたものである。
見分け方と落とし穴
つやのある球や床を、正面と縁、手前と奥で見比べると、フレネル効果があるかどうかが分かる。縁と奥が明るく映り込んでいれば効いている。
反射の強さを一定の値で済ませると、正面まで金属の膜を張ったように見える。逆に、ラフネスの高い表面では、縁の映り込みもぼやけるので、フレネル効果は目立たなくなる。粗い表面の縁だけが強く光っている場合は、フレネル項を足しすぎている可能性がある。
脚注
-
光の反射と透過の割合を波の理論から導いた Fresnel にちなむ。正確な式は偏光の向きごとに分かれていて、Schlick の式はそれを一つの簡単な式で近似したものである。 ↩