#ifdef SPHERE_MAP | |
#define ENVMAP sampler2D | |
#define TEXENV texture2D | |
#else | |
#define ENVMAP samplerCube | |
#define TEXENV textureCube | |
#endif | |
// converts a normalized direction vector | |
// into a texture coordinate for fetching | |
// texel from a sphere map | |
vec2 Optics_SphereCoord(in vec3 dir){ | |
float dzplus1 = dir.z + 1.0; | |
// compute 1/2p | |
// NOTE: this simplification only works if dir is normalized. | |
float inv_two_p = 1.414 * sqrt(dzplus1); | |
//float inv_two_p = sqrt(dir.x * dir.x + dir.y * dir.y + dzplus1 * dzplus1); | |
inv_two_p *= 2.0; | |
inv_two_p = 1.0 / inv_two_p; | |
// compute texcoord | |
return (dir.xy * vec2(inv_two_p)) + vec2(0.5); | |
} | |
vec4 Optics_GetEnvColor(in ENVMAP envMap, in vec3 dir){ | |
#ifdef SPHERE_MAP | |
return texture2D(envMap, Optics_SphereCoord(dir)); | |
#else | |
return textureCube(envMap, dir); | |
#endif | |
} |