فهرست منبع

Merge pull request #4862 from Nimanf/pow_shaders_max2

Negative f for pow() in shaders
Mr.doob 11 سال پیش
والد
کامیت
a93701ac4a

+ 1 - 1
examples/webgl_lights_hemisphere.html

@@ -84,7 +84,7 @@
 			void main() {
 			void main() {
 
 
 				float h = normalize( vWorldPosition + offset ).y;
 				float h = normalize( vWorldPosition + offset ).y;
-				gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( h, exponent ), 0.0 ) ), 1.0 );
+				gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );
 
 
 			}
 			}
 
 

+ 1 - 1
examples/webgl_materials_lightmap.html

@@ -58,7 +58,7 @@
 			void main() {
 			void main() {
 
 
 				float h = normalize( vWorldPosition + offset ).y;
 				float h = normalize( vWorldPosition + offset ).y;
-				gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( h, exponent ), 0.0 ) ), 1.0 );
+				gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h, 0.0 ), exponent ), 0.0 ) ), 1.0 );
 
 
 			}
 			}
 
 

+ 7 - 7
src/renderers/shaders/ShaderChunk.js

@@ -1,6 +1,6 @@
 /**
 /**
  * Shader chunks for WebLG Shader library
  * Shader chunks for WebLG Shader library
- * 
+ *
  * @author alteredq / http://alteredqualia.com/
  * @author alteredq / http://alteredqualia.com/
  * @author mrdoob / http://mrdoob.com/
  * @author mrdoob / http://mrdoob.com/
  * @author mikael emtinger / http://gomo.se/
  * @author mikael emtinger / http://gomo.se/
@@ -625,7 +625,7 @@ THREE.ShaderChunk = {
 
 
 		"		if ( spotEffect > spotLightAngleCos[ i ] ) {",
 		"		if ( spotEffect > spotLightAngleCos[ i ] ) {",
 
 
-		"			spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
+		"			spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );",
 
 
 		"			float lDistance = 1.0;",
 		"			float lDistance = 1.0;",
 		"			if ( spotLightDistance[ i ] > 0.0 )",
 		"			if ( spotLightDistance[ i ] > 0.0 )",
@@ -880,7 +880,7 @@ THREE.ShaderChunk = {
 
 
 		"		if ( spotEffect > spotLightAngleCos[ i ] ) {",
 		"		if ( spotEffect > spotLightAngleCos[ i ] ) {",
 
 
-		"			spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
+		"			spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );",
 
 
 					// diffuse
 					// diffuse
 
 
@@ -1007,7 +1007,7 @@ THREE.ShaderChunk = {
 
 
 		"		vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
 		"		vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
 		"		float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
 		"		float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
-		"		float hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );",
+		"		float hemiSpecularWeightSky = specularStrength * max( pow( max( hemiDotNormalHalfSky, 0.0 ), shininess ), 0.0 );",
 
 
 		// specular (ground light)
 		// specular (ground light)
 
 
@@ -1015,7 +1015,7 @@ THREE.ShaderChunk = {
 
 
 		"		vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
 		"		vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
 		"		float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
 		"		float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
-		"		float hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );",
+		"		float hemiSpecularWeightGround = specularStrength * max( pow( max( hemiDotNormalHalfGround, 0.0 ), shininess ), 0.0 );",
 
 
 		"		float dotProductGround = dot( normal, lVectorGround );",
 		"		float dotProductGround = dot( normal, lVectorGround );",
 
 
@@ -1541,7 +1541,7 @@ THREE.ShaderChunk = {
 		"				vec3 shadowZ = vec3( shadowCoord.z );",
 		"				vec3 shadowZ = vec3( shadowCoord.z );",
 		"				shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));",
 		"				shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));",
 		"				shadowKernel[0] *= vec3(0.25);",
 		"				shadowKernel[0] *= vec3(0.25);",
-													
+
 		"				shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));",
 		"				shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));",
 		"				shadowKernel[1] *= vec3(0.25);",
 		"				shadowKernel[1] *= vec3(0.25);",
 
 
@@ -1664,7 +1664,7 @@ THREE.ShaderChunk = {
 	// http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
 	// http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
 
 
 	// WebGL doesn't support gl_FragDepth out of the box, unless the EXT_frag_depth extension is available.  On platforms
 	// WebGL doesn't support gl_FragDepth out of the box, unless the EXT_frag_depth extension is available.  On platforms
-	// without EXT_frag_depth, we have to fall back on linear z-buffer in the fragment shader, which means that some long 
+	// without EXT_frag_depth, we have to fall back on linear z-buffer in the fragment shader, which means that some long
 	// faces close to the camera may have issues.	This can be worked around by tesselating the model more finely when
 	// faces close to the camera may have issues.	This can be worked around by tesselating the model more finely when
 	// the camera is near the surface.
 	// the camera is near the surface.
 
 

+ 9 - 9
src/renderers/shaders/ShaderLib.js

@@ -507,7 +507,7 @@ THREE.ShaderLib = {
 			"uniform float mNear;",
 			"uniform float mNear;",
 			"uniform float mFar;",
 			"uniform float mFar;",
 			"uniform float opacity;",
 			"uniform float opacity;",
-			
+
 			THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
 			THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ],
 
 
 			"void main() {",
 			"void main() {",
@@ -816,7 +816,7 @@ THREE.ShaderLib = {
 
 
 			"			float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 			"			float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 
 
-			"			vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );",
+			"			vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( pointVector, pointHalfVector ), 0.0 ), 5.0 );",
 			"			pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;",
 			"			pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;",
 
 
 			"		}",
 			"		}",
@@ -845,7 +845,7 @@ THREE.ShaderLib = {
 
 
 			"			if ( spotEffect > spotLightAngleCos[ i ] ) {",
 			"			if ( spotEffect > spotLightAngleCos[ i ] ) {",
 
 
-			"				spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
+			"				spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );",
 
 
 							// diffuse
 							// diffuse
 
 
@@ -872,7 +872,7 @@ THREE.ShaderLib = {
 
 
 			"				float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 			"				float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 
 
-			"				vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );",
+			"				vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( spotVector, spotHalfVector ), 0.0 ), 5.0 );",
 			"				spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;",
 			"				spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;",
 
 
 			"			}",
 			"			}",
@@ -918,7 +918,7 @@ THREE.ShaderLib = {
 
 
 			"			float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 			"			float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 
 
-			"			vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );",
+			"			vec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );",
 			"			dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;",
 			"			dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;",
 
 
 			"		}",
 			"		}",
@@ -951,7 +951,7 @@ THREE.ShaderLib = {
 
 
 			"			vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
 			"			vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
 			"			float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
 			"			float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
-			"			float hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );",
+			"			float hemiSpecularWeightSky = specularTex.r * max( pow( max( hemiDotNormalHalfSky, 0.0 ), shininess ), 0.0 );",
 
 
 						// specular (ground light)
 						// specular (ground light)
 
 
@@ -959,14 +959,14 @@ THREE.ShaderLib = {
 
 
 			"			vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
 			"			vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
 			"			float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
 			"			float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
-			"			float hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );",
+			"			float hemiSpecularWeightGround = specularTex.r * max( pow( max( hemiDotNormalHalfGround, 0.0 ), shininess ), 0.0 );",
 
 
 			"			float dotProductGround = dot( normal, lVectorGround );",
 			"			float dotProductGround = dot( normal, lVectorGround );",
 
 
 			"			float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 			"			float specularNormalization = ( shininess + 2.0 ) / 8.0;",
 
 
-			"			vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );",
-			"			vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );",
+			"			vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, hemiHalfVectorSky ), 0.0 ), 5.0 );",
+			"			vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 0.0 ), 5.0 );",
 			"			hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );",
 			"			hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );",
 
 
 			"		}",
 			"		}",