嘘フレネル項

水面に対してフレネル項ってちゃんと計算するとやたら透明になってしまったりするのでその辺を考慮して適当に処理してみようみたいな。


計算もなるたけ減らしたいしね。




普通のフレネル項

 (1-cosθ)^4

cosθは視点へのベクトルと法線の内積値でいいよね。
これでほぼ水平な状態の水面に対してフレネル項かけて1人称ぐらいの視点から水平に水面を見ると、思ったよりかなり遠くまで透明になる。水ってこんな透明じゃねぇだろと。
おめぇら湖行ったことあるのかと。


原因は4乗してるからで内積値がほぼ1になる遠い値以外は4乗するとほぼ0になってしまう。
0.8くらいの値を取っても4乗したら0.4とかなりの半透明具合。
普通はスケーリングしたりするもんだけど、スケール値は結局「経験則による適当な値」になってしまうから無視してみよう。そんでもってn乗するのも辞めよう。

かなり省略

 1-cosθ

そうそう、大体こんなもんだよね。まだちょっと透明かなと思ったらバイアス加えたりそれこそスケール掛ければよし。


展開してみよう

 フレネル項 f = 1-(E・N)
 スケール s
 バイアス b
 a = f*s+b
 a = (1-E・N)*s+b


ちゃんとした反射なんかやんねっすよ!それっぽければそれでいい!
見たいな場合はさらに省略できる予感。
まずs=1でいいでしょ。biasも無し。

 a = (1-E・N)

さらに視線ベクトルもそれっぽければ良いんじゃないみたいな。
そもそも平面の向きも固定されてるし2次元でよくね?
E = (0.7,0.7)としよう。長さは大体1だし。

 a = (1-(Nx*0.7)+(Nz*0.7))

お?

 a = (1-(Nx+Nz)*0.7)


そもそもそれっぽければいいのだから、1-ってのもイラネーんジャン?つうか0.7も1で良いでしょ。

 a = Nx+Nz


つーことで適当な環境マップでフレネルっぽさを出すにはこんなんで十分。
視線なんか見てないので正確なフレネル項が必要な人には向かないけど、フェイク水面としては十分過ぎるほどの効果が得られるよ。みたいな。


まとめ。

  • 視線を考慮したそれっぽいフレネル項もどき
 (1-N・E)
  • 視線など考慮しないかなり適当なフレネルっぽい感じの効果
 (Nx+Nz)
  • 頂点単位のUV環境マップに適用する
 (offsetU+offsetV)

意外とそれっぽい。UVさせながらの水面でもかなりそれっぽくなる。