Procházet zdrojové kódy

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 před 13 roky
rodič
revize
5cb7155208

+ 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
 

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 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
 

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů