Browse Source

WebGPURenderer: Fix shadow's `alphaTest` if used `material.map` (#31803)

* fix alphaTest using map

* improve names
sunag 5 months ago
parent
commit
61f467b53d
1 changed files with 40 additions and 6 deletions
  1. 40 6
      src/renderers/common/Renderer.js

+ 40 - 6
src/renderers/common/Renderer.js

@@ -30,6 +30,8 @@ import { Vector4 } from '../../math/Vector4.js';
 import { RenderTarget } from '../../core/RenderTarget.js';
 import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
 
+import { float, vec3, vec4 } from '../../nodes/tsl/TSLCore.js';
+import { reference } from '../../nodes/accessors/ReferenceNode.js';
 import { highpModelNormalViewMatrix, highpModelViewMatrix } from '../../nodes/accessors/ModelNode.js';
 import { error, warn } from '../../utils.js';
 
@@ -2902,17 +2904,49 @@ class Renderer {
 
 				overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
 
-				if ( material.depthNode && material.depthNode.isNode ) {
+				const hasMap = material.map !== null;
+				const hasColorNode = material.colorNode && material.colorNode.isNode;
+				const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
 
-					overrideDepthNode = overrideMaterial.depthNode;
-					overrideMaterial.depthNode = material.depthNode;
+				if ( hasMap || hasColorNode || hasCastShadowNode ) {
+
+					overrideColorNode = overrideMaterial.colorNode;
+
+					let shadowRGB;
+					let shadowAlpha;
+
+					if ( hasCastShadowNode ) {
+
+						shadowRGB = material.castShadowNode.rgb;
+						shadowAlpha = material.castShadowNode.a;
+
+					} else {
+
+						shadowRGB = vec3( 0 );
+						shadowAlpha = float( 1 );
+
+					}
+
+					if ( hasMap ) {
+
+						shadowAlpha = shadowAlpha.mul( reference( 'map', 'texture', material ).a );
+
+					}
+
+					if ( hasColorNode ) {
+
+						shadowAlpha = shadowAlpha.mul( material.colorNode.a );
+
+					}
+
+					overrideMaterial.colorNode = vec4( shadowRGB, shadowAlpha );
 
 				}
 
-				if ( material.castShadowNode && material.castShadowNode.isNode ) {
+				if ( material.depthNode && material.depthNode.isNode ) {
 
-					overrideColorNode = overrideMaterial.colorNode;
-					overrideMaterial.colorNode = material.castShadowNode;
+					overrideDepthNode = overrideMaterial.depthNode;
+					overrideMaterial.depthNode = material.depthNode;
 
 				}
 

粤ICP备19079148号