Browse Source

Merge pull request #19987 from WestLangley/dev_cube_uv_cleanup

Shaders: clean up
Mr.doob 5 years ago
parent
commit
1e2e75e2db
1 changed files with 204 additions and 122 deletions
  1. 204 122
      src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js

+ 204 - 122
src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js

@@ -1,132 +1,214 @@
 export default /* glsl */`
 #ifdef ENVMAP_TYPE_CUBE_UV
 
-#define cubeUV_maxMipLevel 8.0
-#define cubeUV_minMipLevel 4.0
-#define cubeUV_maxTileSize 256.0
-#define cubeUV_minTileSize 16.0
-
-// These shader functions convert between the UV coordinates of a single face of
-// a cubemap, the 0-5 integer index of a cube face, and the direction vector for
-// sampling a textureCube (not generally normalized).
-
-float getFace(vec3 direction) {
-	vec3 absDirection = abs(direction);
-	float face = -1.0;
-	if (absDirection.x > absDirection.z) {
-		if (absDirection.x > absDirection.y)
-			face = direction.x > 0.0 ? 0.0 : 3.0;
-		else
-			face = direction.y > 0.0 ? 1.0 : 4.0;
-	} else {
-		if (absDirection.z > absDirection.y)
-			face = direction.z > 0.0 ? 2.0 : 5.0;
-		else
-			face = direction.y > 0.0 ? 1.0 : 4.0;
-	}
-	return face;
-}
-
-// RH coordinate system; PMREM face-indexing convention
-vec2 getUV(vec3 direction, float face) {
-	vec2 uv;
-	if (face == 0.0) {
-		uv = vec2(direction.z, direction.y) / abs(direction.x); // pos x
-	} else if (face == 1.0) {
-		uv = vec2(-direction.x, -direction.z) / abs(direction.y); // pos y
-	} else if (face == 2.0) {
-		uv = vec2(-direction.x, direction.y) / abs(direction.z); // pos z
-	} else if (face == 3.0) {
-		uv = vec2(-direction.z, direction.y) / abs(direction.x); // neg x
-	} else if (face == 4.0) {
-		uv = vec2(-direction.x, direction.z) / abs(direction.y); // neg y
-	} else {
-		uv = vec2(direction.x, direction.y) / abs(direction.z); // neg z
+	#define cubeUV_maxMipLevel 8.0
+	#define cubeUV_minMipLevel 4.0
+	#define cubeUV_maxTileSize 256.0
+	#define cubeUV_minTileSize 16.0
+
+	// These shader functions convert between the UV coordinates of a single face of
+	// a cubemap, the 0-5 integer index of a cube face, and the direction vector for
+	// sampling a textureCube (not generally normalized ).
+
+	float getFace( vec3 direction ) {
+
+		vec3 absDirection = abs( direction );
+
+		float face = - 1.0;
+
+		if ( absDirection.x > absDirection.z ) {
+
+			if ( absDirection.x > absDirection.y )
+
+				face = direction.x > 0.0 ? 0.0 : 3.0;
+
+			else
+
+				face = direction.y > 0.0 ? 1.0 : 4.0;
+
+		} else {
+
+			if ( absDirection.z > absDirection.y )
+
+				face = direction.z > 0.0 ? 2.0 : 5.0;
+
+			else
+
+				face = direction.y > 0.0 ? 1.0 : 4.0;
+
+		}
+
+		return face;
+
 	}
-	return 0.5 * (uv + 1.0);
-}
-
-vec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {
-	float face = getFace(direction);
-	float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);
-	mipInt = max(mipInt, cubeUV_minMipLevel);
-	float faceSize = exp2(mipInt);
-
-	float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);
-
-	vec2 uv = getUV(direction, face) * (faceSize - 1.0);
-	vec2 f = fract(uv);
-	uv += 0.5 - f;
-	if (face > 2.0) {
-		uv.y += faceSize;
-		face -= 3.0;
+
+	// RH coordinate system; PMREM face-indexing convention
+	vec2 getUV( vec3 direction, float face ) {
+
+		vec2 uv;
+
+		if ( face == 0.0 ) {
+
+			uv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x
+
+		} else if ( face == 1.0 ) {
+
+			uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y
+
+		} else if ( face == 2.0 ) {
+
+			uv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z
+
+		} else if ( face == 3.0 ) {
+
+			uv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x
+
+		} else if ( face == 4.0 ) {
+
+			uv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y
+
+		} else {
+
+			uv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z
+
+		}
+
+		return 0.5 * ( uv + 1.0 );
+
 	}
-	uv.x += face * faceSize;
-	if(mipInt < cubeUV_maxMipLevel){
-		uv.y += 2.0 * cubeUV_maxTileSize;
+
+	vec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {
+
+		float face = getFace( direction );
+
+		float filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );
+
+		mipInt = max( mipInt, cubeUV_minMipLevel );
+
+		float faceSize = exp2( mipInt );
+
+		float texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );
+
+		vec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );
+
+		vec2 f = fract( uv );
+
+		uv += 0.5 - f;
+
+		if ( face > 2.0 ) {
+
+			uv.y += faceSize;
+
+			face -= 3.0;
+
+		}
+
+		uv.x += face * faceSize;
+
+		if ( mipInt < cubeUV_maxMipLevel ) {
+
+			uv.y += 2.0 * cubeUV_maxTileSize;
+
+		}
+
+		uv.y += filterInt * 2.0 * cubeUV_minTileSize;
+
+		uv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );
+
+		uv *= texelSize;
+
+		vec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;
+
+		uv.x += texelSize;
+
+		vec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;
+
+		uv.y += texelSize;
+
+		vec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;
+
+		uv.x -= texelSize;
+
+		vec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;
+
+		vec3 tm = mix( tl, tr, f.x );
+
+		vec3 bm = mix( bl, br, f.x );
+
+		return mix( tm, bm, f.y );
+
 	}
-	uv.y += filterInt * 2.0 * cubeUV_minTileSize;
-	uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);
-	uv *= texelSize;
-
-	vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
-	uv.x += texelSize;
-	vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
-	uv.y += texelSize;
-	vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
-	uv.x -= texelSize;
-	vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;
-	vec3 tm = mix(tl, tr, f.x);
-	vec3 bm = mix(bl, br, f.x);
-	return mix(tm, bm, f.y);
-}
-
-// These defines must match with PMREMGenerator
-
-#define r0 1.0
-#define v0 0.339
-#define m0 -2.0
-#define r1 0.8
-#define v1 0.276
-#define m1 -1.0
-#define r4 0.4
-#define v4 0.046
-#define m4 2.0
-#define r5 0.305
-#define v5 0.016
-#define m5 3.0
-#define r6 0.21
-#define v6 0.0038
-#define m6 4.0
-
-float roughnessToMip(float roughness) {
-	float mip = 0.0;
-	if (roughness >= r1) {
-		mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;
-	} else if (roughness >= r4) {
-		mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;
-	} else if (roughness >= r5) {
-		mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;
-	} else if (roughness >= r6) {
-		mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;
-	} else {
-		mip = -2.0 * log2(1.16 * roughness);// 1.16 = 1.79^0.25
+
+	// These defines must match with PMREMGenerator
+
+	#define r0 1.0
+	#define v0 0.339
+	#define m0 - 2.0
+	#define r1 0.8
+	#define v1 0.276
+	#define m1 - 1.0
+	#define r4 0.4
+	#define v4 0.046
+	#define m4 2.0
+	#define r5 0.305
+	#define v5 0.016
+	#define m5 3.0
+	#define r6 0.21
+	#define v6 0.0038
+	#define m6 4.0
+
+	float roughnessToMip( float roughness ) {
+
+		float mip = 0.0;
+
+		if ( roughness >= r1 ) {
+
+			mip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;
+
+		} else if ( roughness >= r4 ) {
+
+			mip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;
+
+		} else if ( roughness >= r5 ) {
+
+			mip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;
+
+		} else if ( roughness >= r6 ) {
+
+			mip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;
+
+		} else {
+
+			mip = - 2.0 * log2( 1.16 * roughness ); // 1.16 = 1.79^0.25
+		}
+
+		return mip;
+
 	}
-	return mip;
-}
-
-vec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {
-	float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);
-	float mipF = fract(mip);
-	float mipInt = floor(mip);
-
-	vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);
-	if (mipF == 0.0) {
-		return vec4(color0, 1.0);
-	} else {
-		vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);
-		return vec4(mix(color0, color1, mipF), 1.0);
+
+	vec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {
+
+		float mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );
+
+		float mipF = fract( mip );
+
+		float mipInt = floor( mip );
+
+		vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );
+
+		if ( mipF == 0.0 ) {
+
+			return vec4( color0, 1.0 );
+
+		} else {
+
+			vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );
+
+			return vec4( mix( color0, color1, mipF ), 1.0 );
+
+		}
+
 	}
-}
+
 #endif
 `;