パソコン・メモメモ備忘録

気の向くままパソコン関係等で気になることを書き記す。時々更新!

ノーマルマッピングの問題

ノーマルマッピングとは、凹凸のない面に、細かい凹凸が付いたような陰影を付けるために、面の法線を面に垂直な方向から少々ずらす手法…とか書いたが Wikipedia とか、もっと正確な説明を読むべきか。コンクリートや木肌とかの表面凹凸の表現に使える手法。

それはさておき、ノーマルマッピングは、近似手法(擬似手法?)なので、色々想定と違う結果になる点がある。その中で割と見た目的にクリティカルだと思うのだが、余り話題にされない問題がある。小生が知らないだけかもしれないが。

問題とは、所々、ノーマルマッピングの影響で、本来あり得ない、法線ベクトルが視線ベクトルと同じ方向を向いたピクセルが現れてしまう場合があること。うまく対処しないと、その素材の色とは関係なく黒い点々としてレンダリングされてしまったりする。通常、法線ベクトルと視線ベクトルが反対方向(内積が負)を向いている場合は、表(おもて)面が見えているとして光源からの光を受けた場合の色を計算したりする。一方、同じ方向(内積が正)の場合は、裏面と解釈、全く光が当たっていないとして黒くレンダリングするシステムも多い。

普通に閉じた表面を持つ立体をレンダリングしているだけなら、裏側の面の前には、表側を視点に向けた面が必ずあるので、裏側を黒くしようがどうしようが隠されて関係ない。しかし、ノーマルマッピングで法線ベクトルの方向を変化させると、元々の凹凸なしの面の法線ベクトルが視線ベクトルとかなり垂直に近い状態の際に、変化させた法線ベクトルが、視線ベクトルと同じ向きになってしまう事があり得る。

設定によっては、表と裏、両方光源からの光を当てる計算をさせることもできるのだが、凹凸なしの面の法線ベクトルでしか表裏を判断しなくて、結局該当のピクセルを黒くレンダリングしてしまうシステムもある。

プログラマブルなシェーダーが使える場合には、そういう視線ベクトルと同じ向きの法線ベクトルが発生したのを検出して、むりやり法線ベクトルを修正してしまう処理を加えて黒い点々を回避することはできる。が、わざわざそういう処理を明示的に書かなくても、それくらいシステムに予め用意してくれていても良さそうなものだが。

そもそも、凹凸なしの面の法線ベクトルが視線ベクトルと垂直に近いような場合は、ノーマルマップの近似がかなり悪くなっているので、そういう所はノーマルマップを使うべきでないのかもしれない。異方性フィルタリングとかかかってしまうと、更にわけのわからないことになってしまうし…

当たり前すぎて、この問題は話題にのぼりさえしないのだろうか。ちょうどこの問題を回避できないシステムにぶつかってちょっと困っているのだが… 自由にシェーダが書けないのが歯がゆい。