diff --git a/Content/Shaders/VolumetricFog.flax b/Content/Shaders/VolumetricFog.flax index fcb80e14a..e654ef4fe 100644 --- a/Content/Shaders/VolumetricFog.flax +++ b/Content/Shaders/VolumetricFog.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30d9f465663343d43e09deb46cc1d74fc9929d2c8b6bd6cd6e099e44fed0b377 -size 14278 +oid sha256:193782fac2a1ee9cbdefa9625cde408d7f4a5ac21eb3aff370e84ce7c0b91c74 +size 14394 diff --git a/Source/Shaders/Lighting.hlsl b/Source/Shaders/Lighting.hlsl index 9a5a1d9cc..77761869b 100644 --- a/Source/Shaders/Lighting.hlsl +++ b/Source/Shaders/Lighting.hlsl @@ -118,11 +118,15 @@ float4 GetLighting(float3 viewPos, LightData lightData, GBufferSample gBuffer, f float distanceAttenuation = 1; float lightRadiusMask = 1; float spotAttenuation = 1; + float3 toLight = lightData.Direction; // Calculate attenuation if (isRadial) { - GetRadialLightAttenuation(lightData, isSpotLight, gBuffer.WorldPos, N, 1, L, NoL, distanceAttenuation, lightRadiusMask, spotAttenuation); + toLight = lightData.Position - gBuffer.WorldPos; + float distanceSqr = dot(toLight, toLight); + L = toLight * rsqrt(distanceSqr); + GetRadialLightAttenuation(lightData, isSpotLight, N, distanceSqr, 1, toLight, L, NoL, distanceAttenuation, lightRadiusMask, spotAttenuation); } float attenuation = distanceAttenuation * lightRadiusMask * spotAttenuation; @@ -136,7 +140,7 @@ float4 GetLighting(float3 viewPos, LightData lightData, GBufferSample gBuffer, f if (shadow.SurfaceShadow + shadow.TransmissionShadow > 0) { gBuffer.Roughness = max(gBuffer.Roughness, lightData.MinRoughness); - float energy = AreaLightSpecular(lightData, gBuffer.Roughness, lightData.Direction, L, V, N); + float energy = AreaLightSpecular(lightData, gBuffer.Roughness, toLight, L, V, N); // Calculate direct lighting LightingData lighting = SurfaceShading(gBuffer, energy, L, V, N); diff --git a/Source/Shaders/LightingCommon.hlsl b/Source/Shaders/LightingCommon.hlsl index be17fa23b..0c8fe13bf 100644 --- a/Source/Shaders/LightingCommon.hlsl +++ b/Source/Shaders/LightingCommon.hlsl @@ -47,19 +47,16 @@ struct LightingData void GetRadialLightAttenuation( LightData lightData, bool isSpotLight, - float3 worldPosition, float3 N, + float distanceSqr, float distanceBiasSqr, - inout float3 L, + float3 toLight, + float3 L, inout float NoL, inout float distanceAttenuation, inout float lightRadiusMask, inout float spotAttenuation) { - float3 toLight = lightData.Position - worldPosition; - float distanceSqr = dot(toLight, toLight); - L = toLight * rsqrt(distanceSqr); - if (lightData.InverseSquared) { BRANCH @@ -78,7 +75,6 @@ void GetRadialLightAttenuation( distanceAttenuation = rcp(distanceSqr + distanceBiasSqr); NoL = saturate(dot(N, L)); } - lightRadiusMask = Square(saturate(1 - Square(distanceSqr * Square(lightData.RadiusInv)))); } else diff --git a/Source/Shaders/VolumetricFog.shader b/Source/Shaders/VolumetricFog.shader index 2ed806e33..9f0f8b6f6 100644 --- a/Source/Shaders/VolumetricFog.shader +++ b/Source/Shaders/VolumetricFog.shader @@ -210,8 +210,6 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0 uint samplesCount = 1; #endif - float3 L = 0; - float3 toLight = 0; float NoL = 0; float distanceAttenuation = 1; float lightRadiusMask = 1; @@ -227,9 +225,12 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0 float3 cameraVector = normalize(positionWS - GBuffer.ViewPos); float cellRadius = length(positionWS - GetCellPositionWS(gridCoordinate + uint3(1, 1, 1), cellOffset)); float distanceBias = max(cellRadius * InverseSquaredLightDistanceBiasScale, 1); + float3 toLight = LocalLight.Position - positionWS; + float distanceSqr = dot(toLight, toLight); + float3 L = toLight * rsqrt(distanceSqr); // Calculate the light attenuation - GetRadialLightAttenuation(LocalLight, isSpotLight, positionWS, float3(0, 0, 1), distanceBias * distanceBias, L, NoL, distanceAttenuation, lightRadiusMask, spotAttenuation); + GetRadialLightAttenuation(LocalLight, isSpotLight, float3(0, 0, 1), distanceSqr, distanceBias * distanceBias, toLight, L, NoL, distanceAttenuation, lightRadiusMask, spotAttenuation); float combinedAttenuation = distanceAttenuation * lightRadiusMask * spotAttenuation; // Peek the shadow