Ver Fonte

Added clamping to spotLight term in shaders.

This is necessary for OpenGL where pow(0,0) is undefined and can be negative (in DirectX you just get zero), leading to negative light creating black areas artefacts.

Fixes #1805 and #2615 (related already fixed #998).
alteredq há 13 anos atrás
pai
commit
5cb7155208
4 ficheiros alterados com 6 adições e 6 exclusões
  1. 3 3
      build/three.js
  2. 0 0
      build/three.min.js
  3. 1 1
      src/extras/ShaderUtils.js
  4. 2 2
      src/renderers/WebGLShaders.js

+ 3 - 3
build/three.js

@@ -14281,7 +14281,7 @@ THREE.ShaderChunk = {
 
 				"if ( spotEffect > spotLightAngle[ i ] ) {",
 
-					"spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
+					"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
 
 					"float lDistance = 1.0;",
 					"if ( spotLightDistance[ i ] > 0.0 )",
@@ -14640,7 +14640,7 @@ THREE.ShaderChunk = {
 
 				"if ( spotEffect > spotLightAngle[ i ] ) {",
 
-					"spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
+					"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
 
 					// diffuse
 
@@ -25447,7 +25447,7 @@ THREE.ShaderUtils = {
 
 							"if ( spotEffect > spotLightAngle[ i ] ) {",
 
-								"spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
+								"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
 
 								// diffuse
 

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
build/three.min.js


+ 1 - 1
src/extras/ShaderUtils.js

@@ -365,7 +365,7 @@ THREE.ShaderUtils = {
 
 							"if ( spotEffect > spotLightAngle[ i ] ) {",
 
-								"spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
+								"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
 
 								// diffuse
 

+ 2 - 2
src/renderers/WebGLShaders.js

@@ -610,7 +610,7 @@ THREE.ShaderChunk = {
 
 				"if ( spotEffect > spotLightAngle[ i ] ) {",
 
-					"spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
+					"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
 
 					"float lDistance = 1.0;",
 					"if ( spotLightDistance[ i ] > 0.0 )",
@@ -969,7 +969,7 @@ THREE.ShaderChunk = {
 
 				"if ( spotEffect > spotLightAngle[ i ] ) {",
 
-					"spotEffect = pow( spotEffect, spotLightExponent[ i ] );",
+					"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
 
 					// diffuse
 

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff