From 8cd4b3dc42ecf5f64697e82e6424e61b2d0dd563 Mon Sep 17 00:00:00 2001 From: sunag Date: Thu, 28 Nov 2024 18:01:55 -0300 Subject: [PATCH 1/2] SpotLight: Add `.map` support --- examples/files.json | 1 + .../screenshots/webgpu_lights_spotlight.jpg | Bin 0 -> 58549 bytes examples/webgpu_lights_spotlight.html | 252 ++++++++++++++++++ src/nodes/accessors/Lights.js | 32 +++ src/nodes/lighting/AnalyticLightNode.js | 6 +- src/nodes/lighting/ShadowNode.js | 8 +- src/nodes/lighting/SpotLightNode.js | 16 +- 7 files changed, 305 insertions(+), 10 deletions(-) create mode 100644 examples/screenshots/webgpu_lights_spotlight.jpg create mode 100644 examples/webgpu_lights_spotlight.html diff --git a/examples/files.json b/examples/files.json index bd549c1a22bf01..88e0c86557ca64 100644 --- a/examples/files.json +++ b/examples/files.json @@ -338,6 +338,7 @@ "webgpu_lights_physical", "webgpu_lights_rectarealight", "webgpu_lights_selective", + "webgpu_lights_spotlight", "webgpu_lights_tiled", "webgpu_lines_fat_wireframe", "webgpu_lines_fat", diff --git a/examples/screenshots/webgpu_lights_spotlight.jpg b/examples/screenshots/webgpu_lights_spotlight.jpg new file mode 100644 index 0000000000000000000000000000000000000000..332529fef1fe7c1510ecbf9a1d371c375c1e3171 GIT binary patch literal 58549 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 literal 0 HcmV?d00001 diff --git a/examples/webgpu_lights_spotlight.html b/examples/webgpu_lights_spotlight.html new file mode 100644 index 00000000000000..d46efbda09a5b9 --- /dev/null +++ b/examples/webgpu_lights_spotlight.html @@ -0,0 +1,252 @@ + + + + three.js webgpu - spotlight + + + + + + +

+ three.js webgpu - spotlight
+
+ + + + + + + + diff --git a/src/nodes/accessors/Lights.js b/src/nodes/accessors/Lights.js index e45fe654f74253..974521773649e0 100644 --- a/src/nodes/accessors/Lights.js +++ b/src/nodes/accessors/Lights.js @@ -2,6 +2,7 @@ import { uniform } from '../core/UniformNode.js'; import { renderGroup } from '../core/UniformGroupNode.js'; import { Vector3 } from '../../math/Vector3.js'; import { cameraViewMatrix } from './Camera.js'; +import { positionWorld } from './Position.js'; let uniformsLib; @@ -17,6 +18,37 @@ function getLightData( light ) { } +export function lightShadowMatrix( light ) { + + const data = getLightData( light ); + + return data.shadowMatrix || ( data.shadowMatrix = uniform( 'mat4' ).setGroup( renderGroup ).onRenderUpdate( () => { + + light.shadow.updateMatrices( light ); + + return light.shadow.matrix; + + } ) ); + +} + +export function lightProjectionUV( light ) { + + const data = getLightData( light ); + + if ( data.projectionUV === undefined ) { + + const spotLightCoord = lightShadowMatrix( light ).mul( positionWorld ); + + data.projectionUV = spotLightCoord.xyz.div( spotLightCoord.w ); + + + } + + return data.projectionUV; + +} + export function lightPosition( light ) { const data = getLightData( light ); diff --git a/src/nodes/lighting/AnalyticLightNode.js b/src/nodes/lighting/AnalyticLightNode.js index 3fe67041380f6f..52f564e969e5bd 100644 --- a/src/nodes/lighting/AnalyticLightNode.js +++ b/src/nodes/lighting/AnalyticLightNode.js @@ -19,12 +19,10 @@ class AnalyticLightNode extends LightingNode { super(); - this.updateType = NodeUpdateType.FRAME; - this.light = light; this.color = new Color(); - this.colorNode = uniform( this.color ).setGroup( renderGroup ); + this.colorNode = light.colorNode || uniform( this.color ).setGroup( renderGroup ); this.baseColorNode = null; @@ -33,6 +31,8 @@ class AnalyticLightNode extends LightingNode { this.isAnalyticLightNode = true; + this.updateType = NodeUpdateType.FRAME; + } getCacheKey() { diff --git a/src/nodes/lighting/ShadowNode.js b/src/nodes/lighting/ShadowNode.js index e088b24cc4766e..98030455d8ddf3 100644 --- a/src/nodes/lighting/ShadowNode.js +++ b/src/nodes/lighting/ShadowNode.js @@ -1,6 +1,5 @@ import Node from '../core/Node.js'; import { NodeUpdateType } from '../core/constants.js'; -import { uniform } from '../core/UniformNode.js'; import { float, vec2, vec3, vec4, If, int, Fn, nodeObject } from '../tsl/TSLBase.js'; import { reference } from '../accessors/ReferenceNode.js'; import { texture } from '../accessors/TextureNode.js'; @@ -17,6 +16,7 @@ import { HalfFloatType, LessCompare, RGFormat, VSMShadowMap, WebGPUCoordinateSys import { renderGroup } from '../core/UniformGroupNode.js'; import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js'; import { objectPosition } from '../accessors/Object3DNode.js'; +import { lightShadowMatrix } from '../accessors/Lights.js'; const shadowWorldPosition = /*@__PURE__*/ vec3().toVar( 'shadowWorldPosition' ); @@ -383,7 +383,7 @@ class ShadowNode extends Node { const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup ); const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup ); - const shadowPosition = uniform( shadow.matrix ).setGroup( renderGroup ).mul( shadowWorldPosition.add( transformedNormalWorld.mul( normalBias ) ) ); + const shadowPosition = lightShadowMatrix( light ).mul( shadowWorldPosition.add( transformedNormalWorld.mul( normalBias ) ) ); const shadowCoord = this.setupShadowCoord( builder, shadowPosition ); // @@ -446,11 +446,9 @@ class ShadowNode extends Node { renderShadow( frame ) { - const { shadow, shadowMap, light } = this; + const { shadow, shadowMap } = this; const { renderer, scene } = frame; - shadow.updateMatrices( light ); - shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height ); renderer.render( scene, shadow.camera ); diff --git a/src/nodes/lighting/SpotLightNode.js b/src/nodes/lighting/SpotLightNode.js index cb7e214051aa11..13a749c1eacc9a 100644 --- a/src/nodes/lighting/SpotLightNode.js +++ b/src/nodes/lighting/SpotLightNode.js @@ -4,7 +4,8 @@ import { uniform } from '../core/UniformNode.js'; import { smoothstep } from '../math/MathNode.js'; import { positionView } from '../accessors/Position.js'; import { renderGroup } from '../core/UniformGroupNode.js'; -import { lightViewPosition, lightTargetDirection } from '../accessors/Lights.js'; +import { lightViewPosition, lightTargetDirection, lightProjectionUV } from '../accessors/Lights.js'; +import { texture } from '../accessors/TextureNode.js'; class SpotLightNode extends AnalyticLightNode { @@ -70,7 +71,18 @@ class SpotLightNode extends AnalyticLightNode { decayExponent: decayExponentNode } ); - const lightColor = colorNode.mul( spotAttenuation ).mul( lightAttenuation ); + let lightColor = colorNode.mul( spotAttenuation ).mul( lightAttenuation ); + + if ( light.map ) { + + const spotLightCoord = lightProjectionUV( light ); + const projectedTexture = texture( light.map, spotLightCoord.xy ).onRenderUpdate( () => light.map ); + + const inSpotLightMap = spotLightCoord.mul( 2. ).sub( 1. ).abs().lessThan( 1. ).all(); + + lightColor = inSpotLightMap.select( lightColor.mul( projectedTexture ), lightColor ); + + } const reflectedLight = builder.context.reflectedLight; From 3e1764b633e6e5e04dad028fd7c48285fd257951 Mon Sep 17 00:00:00 2001 From: sunag Date: Thu, 28 Nov 2024 18:17:11 -0300 Subject: [PATCH 2/2] cleanup --- src/nodes/lighting/AnalyticLightNode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nodes/lighting/AnalyticLightNode.js b/src/nodes/lighting/AnalyticLightNode.js index 52f564e969e5bd..ed7baf501a4396 100644 --- a/src/nodes/lighting/AnalyticLightNode.js +++ b/src/nodes/lighting/AnalyticLightNode.js @@ -22,7 +22,7 @@ class AnalyticLightNode extends LightingNode { this.light = light; this.color = new Color(); - this.colorNode = light.colorNode || uniform( this.color ).setGroup( renderGroup ); + this.colorNode = ( light && light.colorNode ) || uniform( this.color ).setGroup( renderGroup ); this.baseColorNode = null;