グローバルイルミネーション(29)

バンプマッピングの実装
凸凹した表面をもつ形状をモデリングするのは困難。
なので凸凹具合のテクスチャを用意してマッピングする。
そこで実際に3次元的な凸凹があるかのように陰影も計算してやる。
で、本当に凸凹があるなら

イメージ 1

のばずだ。こうやって変な凸凹の曲面が作れるがこれをまともに交点計算に使うと大変なコストが掛かる。これでは本末転倒だ。しかし数式上は曲面定義されたわけだから法線は容易に求まる。

イメージ 2


これが凸凹曲面の法線。
ここまでは簡単にイメージできるのだがここから先が分からなかった。
まず、簡単な例として平面に凸凹を付けてみる。真横から見た図、矢印が法線。
右がバンプマッピングで得られた凸凹だったとした、という法線(赤)。


イメージ 3


 
で、こっからどうするんだ?。
単純な考えでは今まで左の法線で計算していた所を新たな法線で計算するという事になる。
そうなると大きな問題が起きる。仮に拡散面だとすると反射していくレイは法線を基準とした半球のどこかに反射していく。


イメージ 4

そうなると場合によっては形状の内部へ反射してしまう事になってしまう。


他にも深刻な問題が起きる。やはり、計算はそのまま(元の法線)で計算する事になるがそれでは凹凸は無視されてしまう。じゃ一体新しい法線はどう使うのだろうか?
とりあえず普通に計算して出てくる放射輝度に反射レイと新しい法線の内積を掛けて誤魔化している。まぁそれでもそれっぽい結果にはなっている。
が、たぶん違うな。
これだとバンプが平らなときは本来は凸凹が無いのでバンプマッピングしない時と一致しないといけないが上の方法では明らかに一致しない。