機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

高さマップから法線マップ(バンプマップ)を求める

テクスチャマップから高さマップを求める

高さマップとは、テクスチャマップをグレースケール化して作ります。
黒い部分を 0 (最も低い)、白い部分は 1 (最も高い)として、rgb値に同じ値を格納jし、a値には1を格納するのが普通だと思います。
高さマップが固定なら、事前に画像ファイルとして作成しておきます。
高さマップとしては、オフスクリーンのフレームバッファに描画しておき、それを高さマップのテクスチャとして利用するのが一般的かなと思います。

高さマップから法線マップ(バンプマップ)を求める

法線マップ内の各ベクトルは、三角形内部の点における補間後の法線ベクトルに対する、法線のベクトルの向くべき相対的な方向を示します。
例えば、法線マップ内のベクトル (0,0,1) は、三角形内部の点における補間後の法線ベクトルが変化しないことを表します。

w\times h ピクセルの高さマップ内の座標 (i,j) に格納されている値を H(i,j) で表すと、
s 方向と t 方向に沿ったベクトル {\bf S}(i,j) および {\bf T}(i,j) は以下のように表せます。

\begin{eqnarray}
&&{\bf S}(i,j)=(1,0,aH(i+1,j)-aH(i-1,j))\tag{1}\\
&&{\bf T}(i,j)=(0,1,aH(i,j+1)-aH(i,j-1))\tag{2}\\
\end{eqnarray}

定数 a は高さの値の範囲を変えるためのスカラー係数で、法線の変化をどの程度目立たせるかを制御します。
{\bf S}(i,j){\bf T}(i,j) の Z 成分を S_z,T_z とすると、法線ベクトル {\bf N}(i,j) は、次のように表せます。

\begin{eqnarray}
{\bf N}(i,j)=\dfrac{{\bf S}(i,j)\times{\bf T}(i,j)}{||{\bf S}(i,j)\times{\bf T}(i,j)||}=\dfrac{(-S_z,-T_z,1)}{\sqrt{S_z^2+T_z^2+1}}\tag{3}
\end{eqnarray}

(3) で求まった法線ベクトルを RGB カラーにエンコードすれば法線マップが出来上がります。

参考文献

ゲームプログラミングのための3Dグラフィックス数学 p150-p152

目次へ戻る