Browse Source

ShaderChunk: Use gl_FrontFacing workaround everywhere.

Mr.doob 4 years ago
parent
commit
c8fc2dd37f

+ 1 - 1
src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js

@@ -35,7 +35,7 @@ export default /* glsl */`
 
 
 		float fDet = dot( vSigmaX, R1 );
 		float fDet = dot( vSigmaX, R1 );
 
 
-		fDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );
+		fDet *= ( float( isFrontFacing ) * 2.0 - 1.0 );
 
 
 		vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );
 		vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );
 		return normalize( abs( fDet ) * surf_norm - vGrad );
 		return normalize( abs( fDet ) * surf_norm - vGrad );

+ 1 - 1
src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js

@@ -10,7 +10,7 @@ export default /* glsl */`
 
 
 	#else
 	#else
 
 
-		clearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );
+		clearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, isFrontFacing );
 
 
 	#endif
 	#endif
 
 

+ 22 - 17
src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js

@@ -1,39 +1,44 @@
 export default /* glsl */`
 export default /* glsl */`
-#ifdef FLAT_SHADED
+// Workaround for Adreno/Nexus5 not able able to do dFdx( vViewPosition ) ...
+
+vec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );
+vec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );
 
 
-	// Workaround for Adreno/Nexus5 not able able to do dFdx( vViewPosition ) ...
+#ifdef FLAT_SHADED
 
 
-	vec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );
-	vec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );
 	vec3 normal = normalize( cross( fdx, fdy ) );
 	vec3 normal = normalize( cross( fdx, fdy ) );
 
 
 #else
 #else
 
 
 	vec3 normal = normalize( vNormal );
 	vec3 normal = normalize( vNormal );
 
 
-	#ifdef DOUBLE_SIDED
+#endif
 
 
-		normal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );
+// Workaround for Adreno GPUs gl_FrontFacing bug. See #10331 and #15850
 
 
-	#endif
+bool isFrontFacing = dot( normal, normalize( cross( fdx, fdy ) ) ) > 0.0;
 
 
-	#ifdef USE_TANGENT
+#ifdef DOUBLE_SIDED
 
 
-		vec3 tangent = normalize( vTangent );
-		vec3 bitangent = normalize( vBitangent );
+	normal = normal * ( float( isFrontFacing ) * 2.0 - 1.0 );
 
 
-		#ifdef DOUBLE_SIDED
+#endif
+
+#ifdef USE_TANGENT
 
 
-			tangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );
-			bitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );
+	vec3 tangent = normalize( vTangent );
+	vec3 bitangent = normalize( vBitangent );
 
 
-		#endif
+	#ifdef DOUBLE_SIDED
 
 
-		#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )
+		tangent = tangent * ( float( isFrontFacing ) * 2.0 - 1.0 );
+		bitangent = bitangent * ( float( isFrontFacing ) * 2.0 - 1.0 );
+
+	#endif
 
 
-			mat3 vTBN = mat3( tangent, bitangent, normal );
+	#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )
 
 
-		#endif
+		mat3 vTBN = mat3( tangent, bitangent, normal );
 
 
 	#endif
 	#endif
 
 

+ 3 - 3
src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js

@@ -12,7 +12,7 @@ export default /* glsl */`
 
 
 	#ifdef DOUBLE_SIDED
 	#ifdef DOUBLE_SIDED
 
 
-		normal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );
+		normal = normal * ( float( isFrontFacing ) * 2.0 - 1.0 );
 
 
 	#endif
 	#endif
 
 
@@ -29,13 +29,13 @@ export default /* glsl */`
 
 
 	#else
 	#else
 
 
-		normal = perturbNormal2Arb( -vViewPosition, normal, mapN );
+		normal = perturbNormal2Arb( -vViewPosition, normal, mapN, isFrontFacing );
 
 
 	#endif
 	#endif
 
 
 #elif defined( USE_BUMPMAP )
 #elif defined( USE_BUMPMAP )
 
 
-	normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );
+	normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd(), isFrontFacing );
 
 
 #endif
 #endif
 `;
 `;

+ 2 - 2
src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js

@@ -17,7 +17,7 @@ export default /* glsl */`
 	// Per-Pixel Tangent Space Normal Mapping
 	// Per-Pixel Tangent Space Normal Mapping
 	// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
 	// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
 
 
-	vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {
+	vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, bool isFrontFacing ) {
 
 
 		// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
 		// Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
 
 
@@ -34,7 +34,7 @@ export default /* glsl */`
 
 
 		mat3 tsn = mat3( S, T, N );
 		mat3 tsn = mat3( S, T, N );
 
 
-		if ( dot( surf_norm, normalize( cross( q0, q1 ) ) ) < 0.0 ) mapN.xy *= - 1.0;
+		mapN.xy *= ( float( isFrontFacing ) * 2.0 - 1.0 );
 
 
 		return normalize( tsn * mapN );
 		return normalize( tsn * mapN );