diff --git a/src/renderers/shaders/ShaderChunk.js b/src/renderers/shaders/ShaderChunk.js index 59f0fc996b7c955b3ea79de09aacc682496593fb..e5b528d5a104e2b172205e396d63160bda96ffea 100644 --- a/src/renderers/shaders/ShaderChunk.js +++ b/src/renderers/shaders/ShaderChunk.js @@ -1,6 +1,6 @@ /** * Shader chunks for WebLG Shader library - * + * * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author mikael emtinger / http://gomo.se/ @@ -625,7 +625,7 @@ THREE.ShaderChunk = { " 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;", " if ( spotLightDistance[ i ] > 0.0 )", @@ -880,7 +880,7 @@ THREE.ShaderChunk = { " if ( spotEffect > spotLightAngleCos[ i ] ) {", - " spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );", + " spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );", // diffuse @@ -1007,7 +1007,7 @@ THREE.ShaderChunk = { " vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );", " 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) @@ -1015,7 +1015,7 @@ THREE.ShaderChunk = { " vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );", " 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 );", @@ -1541,7 +1541,7 @@ THREE.ShaderChunk = { " vec3 shadowZ = vec3( shadowCoord.z );", " shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));", " shadowKernel[0] *= vec3(0.25);", - + " shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));", " shadowKernel[1] *= vec3(0.25);", @@ -1664,7 +1664,7 @@ THREE.ShaderChunk = { // 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 - // 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 // the camera is near the surface. diff --git a/src/renderers/shaders/ShaderLib.js b/src/renderers/shaders/ShaderLib.js index 34bc5223a4e41214855b9ff3f93cf8534e2e650a..864b29436af51c2fd583beeab2de764d5c46e99d 100644 --- a/src/renderers/shaders/ShaderLib.js +++ b/src/renderers/shaders/ShaderLib.js @@ -507,7 +507,7 @@ THREE.ShaderLib = { "uniform float mNear;", "uniform float mFar;", "uniform float opacity;", - + THREE.ShaderChunk[ "logdepthbuf_pars_fragment" ], "void main() {", @@ -816,7 +816,7 @@ THREE.ShaderLib = { " 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;", " }", @@ -845,7 +845,7 @@ THREE.ShaderLib = { " if ( spotEffect > spotLightAngleCos[ i ] ) {", - " spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );", + " spotEffect = max( pow( max( spotEffect, 0.0 ), spotLightExponent[ i ] ), 0.0 );", // diffuse @@ -872,7 +872,7 @@ THREE.ShaderLib = { " 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;", " }", @@ -918,7 +918,7 @@ THREE.ShaderLib = { " 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;", " }", @@ -951,7 +951,7 @@ THREE.ShaderLib = { " vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );", " 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) @@ -959,14 +959,14 @@ THREE.ShaderLib = { " vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );", " 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 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 ) );", " }",