diff --git a/examples/webgl_materials_envmaps_parallax.html b/examples/webgl_materials_envmaps_parallax.html index a58a351b765871e3d07c67039f4efe98313ae1d7..ae382d367fd75b3b68803f6ce31e7bf8b6519602 100644 --- a/examples/webgl_materials_envmaps_parallax.html +++ b/examples/webgl_materials_envmaps_parallax.html @@ -175,9 +175,7 @@ #elif defined( ENVMAP_TYPE_EQUIREC ) - vec2 sampleUV; - sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; - sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + vec2 sampleUV = equirectUv( reflectVec ); #ifdef TEXTURE_LOD_EXT diff --git a/src/extras/PMREMGenerator.js b/src/extras/PMREMGenerator.js index fe47c7b8292ee4dea2fa5de2f8e7a46fb3376181..5dcf3c475ac30c05bc0d9c6f1d5b456feffbcc4c 100644 --- a/src/extras/PMREMGenerator.js +++ b/src/extras/PMREMGenerator.js @@ -707,15 +707,12 @@ uniform vec2 texelSize; ${_getEncodings()} -#define RECIPROCAL_PI 0.31830988618 -#define RECIPROCAL_PI2 0.15915494 +#include void main() { gl_FragColor = vec4(0.0); vec3 outputDirection = normalize(vOutputDirection); - vec2 uv; - uv.y = asin(clamp(outputDirection.y, -1.0, 1.0)) * RECIPROCAL_PI + 0.5; - uv.x = atan(outputDirection.z, outputDirection.x) * RECIPROCAL_PI2 + 0.5; + vec2 uv = equirectUv( outputDirection ); vec2 f = fract(uv / texelSize - 0.5); uv -= f * texelSize; vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb; diff --git a/src/renderers/WebGLCubeRenderTarget.js b/src/renderers/WebGLCubeRenderTarget.js index b4bdec6544728f41182a09072a2d6f2148fb158e..03277c2170a4794a04b19fbe2af6f4d7779f18ce 100644 --- a/src/renderers/WebGLCubeRenderTarget.js +++ b/src/renderers/WebGLCubeRenderTarget.js @@ -72,18 +72,13 @@ WebGLCubeRenderTarget.prototype.fromEquirectangularTexture = function ( renderer "varying vec3 vWorldDirection;", - "#define RECIPROCAL_PI 0.31830988618", - "#define RECIPROCAL_PI2 0.15915494", + "#include ", "void main() {", " vec3 direction = normalize( vWorldDirection );", - " vec2 sampleUV;", - - " sampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;", - - " sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;", + " vec2 sampleUV = equirectUv( direction );", " gl_FragColor = texture2D( tEquirect, sampleUV );", diff --git a/src/renderers/shaders/ShaderChunk/common.glsl.js b/src/renderers/shaders/ShaderChunk/common.glsl.js index fccf02d464f9bd7070d258543dd3ee798d8b93e3..947fd3c05ad2971dc6caba432749bb5cb3ab44b4 100644 --- a/src/renderers/shaders/ShaderChunk/common.glsl.js +++ b/src/renderers/shaders/ShaderChunk/common.glsl.js @@ -117,5 +117,17 @@ bool isPerspectiveMatrix( mat4 m ) { return m[ 2 ][ 3 ] == - 1.0; +} + +vec2 equirectUv( in vec3 dir ) { + + // dir is assumed to be unit length + + float u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5; + + float v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; + + return vec2( u, v ); + } `; diff --git a/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js index 93b5d50686e133b5eb9cd5d7486c5cd7d8e92827..3b9d285f622e0308698e6875caf76779fb00a7e4 100644 --- a/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js @@ -44,13 +44,9 @@ export default /* glsl */` #elif defined( ENVMAP_TYPE_EQUIREC ) - vec2 sampleUV; - reflectVec = normalize( reflectVec ); - sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; - - sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + vec2 sampleUV = equirectUv( reflectVec ); vec4 envColor = texture2D( envMap, sampleUV ); diff --git a/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js index 3fa872ae75dfc47040687617836d798122e5f4f3..53dfe149f0d995c1fdaf27c0465d38ae2b6d8458 100644 --- a/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js @@ -97,9 +97,7 @@ export default /* glsl */` #elif defined( ENVMAP_TYPE_EQUIREC ) - vec2 sampleUV; - sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; - sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5; + vec2 sampleUV = equirectUv( reflectVec ); #ifdef TEXTURE_LOD_EXT diff --git a/src/renderers/shaders/ShaderLib/equirect_frag.glsl.js b/src/renderers/shaders/ShaderLib/equirect_frag.glsl.js index 52269daba1b8daca6d1af3deb8b8cfbf96b36590..0bb0e0611186ce89452c2c121913d8f7b774f92c 100644 --- a/src/renderers/shaders/ShaderLib/equirect_frag.glsl.js +++ b/src/renderers/shaders/ShaderLib/equirect_frag.glsl.js @@ -9,11 +9,7 @@ void main() { vec3 direction = normalize( vWorldDirection ); - vec2 sampleUV; - - sampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5; - - sampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5; + vec2 sampleUV = equirectUv( direction ); vec4 texColor = texture2D( tEquirect, sampleUV );