Normal Map
Normal Map適合用於渲染有固定光源和漫反射的情境。其眼座標中的單位法向量Nx、Ny和Nz作為其紋理座標s、r、t。
Reflection Map
功能上和Sphere Map類似,非常適合於環境映射。其實現方法是將其單位反射向量作為其紋理座標s、r、t。
其中反射向量可以通過入射向量和法向量求得:R = U - 2 * transpose(N) * (U dot N)。GLSL中可以調用reflect函數。
vec3 ReflectionMap(in vec3 ecPosition3, in vec3 normal)<br />{<br />float NdotU, m;<br />vec3 u;<br />u = normalize(ecPosition3);<br />return (reflect(u, normal));<br />}
Sphere Map
球面環境貼圖只產生s和t。
(1) 將反射向量的x分量和y分量投影到Rz = 0平面的單位圓上。
將反射向量的x分量Rx和y分量Ry按照特定的反射向量長度m縮放,其中m = 2 * sqrt(Rx * Rx + Ry * Ry + (Rz + 1) (Rz + 1))。Rx和Ry除以m,則這兩個分量即會投影到Rz = 0平面上的一個單位圓上。
(2) 得到[0, 1]範圍內的二位紋理座標。
當縮放後位於單位圓內的Rx和Ry乘以0.5並位移0.5,即可得到[0, 1]範圍內的s座標和t座標。
vec2 SphereMap(in vec3 ecPosition3, in vec3 normal)<br />{<br />float m;<br />vec3 r, u;<br />u = normalize(ecPosition3);// u 是一個從原點指向頂點的單位向量(眼座標)<br />r = reflect(u, normal);// r是反射向量(眼座標)<br />m = 2.0 * sqrt(r.x * r.x + r.y * r.y + (r.z + 1.0) * (r.z + 1.0));<br />return vec2(r.x / m + 0.5, r.y / m + 0.5);<br />}