Fake Sphere Mapping

2000/07/02(日)  − Fake Sphere Mapping − フェイク環境マップってインチキ?

 フェイク環境マップとは、スフィアマッピング(球状環境マッピング)の 簡易計算法であり、速度重視の環境マッピングによく利用されている。 厳密にはフェイクスフィアマッピングと呼んだ方が良いかもしれない。 この手法は、視線反射ベクトルを求め反射ベクトルからテクスチャ座標を計算するのではなく、 頂点の法線をそのままテクスチャ座標として利用する。 実際には法線は -1.0 〜 1.0 の範囲に渡るため、当然これを 0.0 〜 1.0 に写像する必要がある。
つまり、
テクスチャ座標を (u, v)
頂点の法線ベクトルを N (nx, ny, nz) とすると、

u = nx * 0.5 + 0.5
v = ny * 0.5 + 0.5
である。

 対して、スフィアマッピングの計算式。ただし右手座標系(左手座標系ではz成分は逆)。

視線ベクトルを E (ex, ey, ez)
視線反射ベクトルを R (rx, ry, rz) とすると、

視線反射ベクトル R = E - 2 (E・N) N
m = 2 * sqrt(rx^2 + ry^2 + (rz + 1)^2)
u = rx / m + 0.5
v = ry / m + 0.5
となる。 ここで、スフィアマッピングの計算時、視線ベクトルが必ず
E (ex, ey, ez ) = (0, 0, -1)
つまり平行投影であると仮定すると、反射ベクトル R は

rx = 2 * nz * nx
ry = 2 * nz * ny
rz = 2 * nz^2 - 1

m = 2 * sqrt(rx^2 + ry^2 + (rz + 1)^2) より、
R は単位ベクトル(つまり rx^2 + ry^2 + rz^2 = 1)であるから、
m = 2 * sqrt(2 * rz + 2)
= 2 * sqrt(2 * (2 * nz^2 - 1) + 2)
= 2 * sqrt(4 * nz^2)
m = 4 * nz
さらに
u = rx / m + 0.5 より
u = (2 * nz * nx) / (4 * nz) + 0.5
= 2 * nx / 4 + 0.5
= nx * 0.5 + 0.5
同じく
v = ny * 0.5 + 0.5
つまり、
u = nx * 0.5 + 0.5
v = ny * 0.5 + 0.5
フェイク環境マッピングの式となる。

 何が言いたかったはほとんど説明の余地も無いことと思うが、 つまり、
フェイク環境マッピング(フェイクスフィアマッピング)とは 平行投影と仮定したスフィアマッピングである
ということ。 さらに、
平行投影という条件下においては、インチキでも何でもなく正確な計算方法
ということである。
ちなみに OpenGL や Direct3D の光源計算モデルのステートである Local Viewer は、視線ベクトルを頂点に対して正確に計算するか、 (0, 0, -1) 固定にするか(Direct3D ではzは 1)の違いである。
これはスフィアマッピングとフェイク環境マッピングの違いと まったく同じであることが理解できるだろう。