diff --git a/filament/src/details/Scene.h b/filament/src/details/Scene.h index 02eef44ad7..f7fceb8252 100644 --- a/filament/src/details/Scene.h +++ b/filament/src/details/Scene.h @@ -155,7 +155,6 @@ public: bool castsShadows = false; // whether this light casts shadows bool contactShadows = false; // whether this light casts contact shadows uint8_t index = 0; // an index into the arrays in the Shadows uniform buffer - uint8_t layer = 0; // which layer of the shadow texture array to sample from }; enum { @@ -179,7 +178,8 @@ public: LightSoa const& getLightData() const noexcept { return mLightData; } LightSoa& getLightData() noexcept { return mLightData; } - void updateUBOs(utils::Range visibleRenderables, backend::Handle renderableUbh) noexcept; + void updateUBOs(utils::Range visibleRenderables, + backend::Handle renderableUbh) noexcept; bool hasContactShadows() const noexcept; diff --git a/shaders/src/common_lighting.fs b/shaders/src/common_lighting.fs index 500d65a878..6aa419be26 100644 --- a/shaders/src/common_lighting.fs +++ b/shaders/src/common_lighting.fs @@ -9,7 +9,6 @@ struct Light { bool contactShadows; uint type; uint shadowIndex; - uint shadowLayer; uint channels; }; diff --git a/shaders/src/light_punctual.fs b/shaders/src/light_punctual.fs index 761ec7b692..95d8bd72a0 100644 --- a/shaders/src/light_punctual.fs +++ b/shaders/src/light_punctual.fs @@ -158,7 +158,6 @@ Light getLight(const uint lightIndex) { light.type = (typeShadow & 0x1u); #if defined(VARIANT_HAS_SHADOWING) light.shadowIndex = (typeShadow >> 8u) & 0xFFu; - light.shadowLayer = (typeShadow >> 16u) & 0xFFu; light.castsShadows = bool(channels & 0x10000u); if (light.type == LIGHT_TYPE_SPOT) { light.zLight = dot(shadowUniforms.shadows[light.shadowIndex].lightFromWorldZ, vec4(worldPosition, 1.0)); @@ -211,20 +210,22 @@ void evaluatePunctualLights(const MaterialInputs material, #if defined(VARIANT_HAS_SHADOWING) if (light.NoL > 0.0) { if (light.castsShadows) { - uint layer = light.shadowLayer; + uint shadowIndex = light.shadowIndex; highp vec4 shadowPosition; if (light.type == LIGHT_TYPE_POINT) { // point-light shadows are sampled from a direction highp vec3 r = getWorldPosition() - light.worldPosition; + highp uint face = 0u; highp vec4 nf = shadowUniforms.shadows[light.shadowIndex].lightFromWorldZ; // getShadowPosition returns zLight which is needed for PCSS/DPCF - uint face = 0u; + shadowPosition = getShadowPosition(r, shadowIndex, light.zLight, face); + shadowIndex += face; shadowPosition = getShadowPosition(r, light.shadowIndex, light.zLight, face); } else { // getShadowPosition needs zLight for applying the normal bias - shadowPosition = getShadowPosition(false, light.shadowIndex, 0u, light.zLight); + shadowPosition = getShadowPosition(false, shadowIndex, 0u, light.zLight); } - visibility = shadow(false, light_shadowMap, light.shadowIndex, + visibility = shadow(false, light_shadowMap, shadowIndex, shadowPosition, light.zLight); } if (light.contactShadows && visibility > 0.0) {