Prechádzať 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 13 rokov pred
rodič
commit
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
 

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 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
 

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov