1 #ifdef SPHERE_MAP 2 #define ENVMAP sampler2D 3 #define TEXENV texture2D 4 #else 5 #define ENVMAP samplerCube 6 #define TEXENV textureCube 7 #endif 8 9 // converts a normalized direction vector 10 // into a texture coordinate for fetching 11 // texel from a sphere map 12 vec2 Optics_SphereCoord(in vec3 dir){ 13 float dzplus1 = dir.z + 1.0; 14 15 // compute 1/2p 16 // NOTE: this simplification only works if dir is normalized. 17 float inv_two_p = 1.414 * sqrt(dzplus1); 18 //float inv_two_p = sqrt(dir.x * dir.x + dir.y * dir.y + dzplus1 * dzplus1); 19 inv_two_p *= 2.0; 20 inv_two_p = 1.0 / inv_two_p; 21 22 // compute texcoord 23 return (dir.xy * vec2(inv_two_p)) + vec2(0.5); 24 } 25 26 vec4 Optics_GetEnvColor(in ENVMAP envMap, in vec3 dir){ 27 #ifdef SPHERE_MAP 28 return texture2D(envMap, Optics_SphereCoord(dir)); 29 #else 30 return textureCube(envMap, dir); 31 #endif 32 }