From 67338a2ac2d3b42e217f844117caea681a753c80 Mon Sep 17 00:00:00 2001 From: WestLangley Date: Sun, 14 Feb 2016 12:16:44 -0500 Subject: [PATCH] Improved penumbra model for spotlight --- src/renderers/WebGLRenderer.js | 4 ++-- src/renderers/shaders/ShaderChunk/lights_pars.glsl | 11 +++++------ src/renderers/shaders/UniformsLib.js | 4 ++-- src/renderers/webgl/WebGLLights.js | 4 ++-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 2da2de0a39..597dd796c7 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -2701,8 +2701,8 @@ THREE.WebGLRenderer = function ( parameters ) { uniforms.direction.sub( _vector3 ); uniforms.direction.transformDirection( viewMatrix ); - uniforms.angleCos = Math.cos( light.angle ); - uniforms.penumbra = Math.cos( light.angle ) * light.penumbra; + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; uniforms.shadow = light.castShadow; diff --git a/src/renderers/shaders/ShaderChunk/lights_pars.glsl b/src/renderers/shaders/ShaderChunk/lights_pars.glsl index 6c0fadde9b..4fb115af55 100644 --- a/src/renderers/shaders/ShaderChunk/lights_pars.glsl +++ b/src/renderers/shaders/ShaderChunk/lights_pars.glsl @@ -80,8 +80,8 @@ vec3 color; float distance; float decay; - float angleCos; - float penumbra; + float coneCos; + float penumbraCos; int shadow; float shadowBias; @@ -99,12 +99,11 @@ directLight.direction = normalize( lVector ); float lightDistance = length( lVector ); - float spotEffect = dot( directLight.direction, spotLight.direction ); + float angleCos = dot( directLight.direction, spotLight.direction ); - if ( all( bvec2( spotEffect > spotLight.angleCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) { + if ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) { - float spotEffect = dot( spotLight.direction, directLight.direction ); - spotEffect *= clamp( ( spotEffect - spotLight.angleCos ) / spotLight.penumbra, 0.0, 1.0 ); + float spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos ); directLight.color = spotLight.color; directLight.color *= ( spotEffect * calcLightAttenuation( lightDistance, spotLight.distance, spotLight.decay ) ); diff --git a/src/renderers/shaders/UniformsLib.js b/src/renderers/shaders/UniformsLib.js index e7ab4baeb5..d50f89fad5 100644 --- a/src/renderers/shaders/UniformsLib.js +++ b/src/renderers/shaders/UniformsLib.js @@ -111,8 +111,8 @@ THREE.UniformsLib = { "position": { type: "v3" }, "direction": { type: "v3" }, "distance": { type: "f" }, - "angleCos": { type: "f" }, - "penumbra": { type: "f" }, + "coneCos": { type: "f" }, + "penumbraCos": { type: "f" }, "decay": { type: "f" }, "shadow": { type: "i" }, diff --git a/src/renderers/webgl/WebGLLights.js b/src/renderers/webgl/WebGLLights.js index c382d11bf2..924ab55a1b 100644 --- a/src/renderers/webgl/WebGLLights.js +++ b/src/renderers/webgl/WebGLLights.js @@ -36,8 +36,8 @@ THREE.WebGLLights = function () { direction: new THREE.Vector3(), color: new THREE.Color(), distance: 0, - angleCos: 0, - penumbra: 0, + coneCos: 0, + penumbraCos: 0, decay: 0, shadow: false, -- GitLab