Pārlūkot izejas kodu

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 13 gadi atpakaļ
vecāks
revīzija
5cb7155208
4 mainītis faili ar 6 papildinājumiem un 6 dzēšanām
  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
 

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 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
 

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels