环境贴图自动纹理坐标生成

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) { float NdotU, m; vec3 u; u = normalize(ecPosition3); return (reflect(u, normal)); }

 

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) { float m; vec3 r, u; u = normalize(ecPosition3); // u 是一个从原点指向顶点的单位向量(眼坐标) r = reflect(u, normal); // r是反射向量(眼坐标) m = 2.0 * sqrt(r.x * r.x + r.y * r.y + (r.z + 1.0) * (r.z + 1.0)); return vec2(r.x / m + 0.5, r.y / m + 0.5); }

 

你可能感兴趣的:(环境贴图自动纹理坐标生成)