Fix radial lights

This commit is contained in:
Wojciech Figat
2021-12-13 17:30:51 +01:00
parent 5f4bfa36d8
commit 25c7909e30
4 changed files with 15 additions and 14 deletions

BIN
Content/Shaders/VolumetricFog.flax (Stored with Git LFS)

Binary file not shown.

View File

@@ -118,11 +118,15 @@ float4 GetLighting(float3 viewPos, LightData lightData, GBufferSample gBuffer, f
float distanceAttenuation = 1; float distanceAttenuation = 1;
float lightRadiusMask = 1; float lightRadiusMask = 1;
float spotAttenuation = 1; float spotAttenuation = 1;
float3 toLight = lightData.Direction;
// Calculate attenuation // Calculate attenuation
if (isRadial) 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; float attenuation = distanceAttenuation * lightRadiusMask * spotAttenuation;
@@ -136,7 +140,7 @@ float4 GetLighting(float3 viewPos, LightData lightData, GBufferSample gBuffer, f
if (shadow.SurfaceShadow + shadow.TransmissionShadow > 0) if (shadow.SurfaceShadow + shadow.TransmissionShadow > 0)
{ {
gBuffer.Roughness = max(gBuffer.Roughness, lightData.MinRoughness); 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 // Calculate direct lighting
LightingData lighting = SurfaceShading(gBuffer, energy, L, V, N); LightingData lighting = SurfaceShading(gBuffer, energy, L, V, N);

View File

@@ -47,19 +47,16 @@ struct LightingData
void GetRadialLightAttenuation( void GetRadialLightAttenuation(
LightData lightData, LightData lightData,
bool isSpotLight, bool isSpotLight,
float3 worldPosition,
float3 N, float3 N,
float distanceSqr,
float distanceBiasSqr, float distanceBiasSqr,
inout float3 L, float3 toLight,
float3 L,
inout float NoL, inout float NoL,
inout float distanceAttenuation, inout float distanceAttenuation,
inout float lightRadiusMask, inout float lightRadiusMask,
inout float spotAttenuation) inout float spotAttenuation)
{ {
float3 toLight = lightData.Position - worldPosition;
float distanceSqr = dot(toLight, toLight);
L = toLight * rsqrt(distanceSqr);
if (lightData.InverseSquared) if (lightData.InverseSquared)
{ {
BRANCH BRANCH
@@ -78,7 +75,6 @@ void GetRadialLightAttenuation(
distanceAttenuation = rcp(distanceSqr + distanceBiasSqr); distanceAttenuation = rcp(distanceSqr + distanceBiasSqr);
NoL = saturate(dot(N, L)); NoL = saturate(dot(N, L));
} }
lightRadiusMask = Square(saturate(1 - Square(distanceSqr * Square(lightData.RadiusInv)))); lightRadiusMask = Square(saturate(1 - Square(distanceSqr * Square(lightData.RadiusInv))));
} }
else else

View File

@@ -210,8 +210,6 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0
uint samplesCount = 1; uint samplesCount = 1;
#endif #endif
float3 L = 0;
float3 toLight = 0;
float NoL = 0; float NoL = 0;
float distanceAttenuation = 1; float distanceAttenuation = 1;
float lightRadiusMask = 1; float lightRadiusMask = 1;
@@ -227,9 +225,12 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0
float3 cameraVector = normalize(positionWS - GBuffer.ViewPos); float3 cameraVector = normalize(positionWS - GBuffer.ViewPos);
float cellRadius = length(positionWS - GetCellPositionWS(gridCoordinate + uint3(1, 1, 1), cellOffset)); float cellRadius = length(positionWS - GetCellPositionWS(gridCoordinate + uint3(1, 1, 1), cellOffset));
float distanceBias = max(cellRadius * InverseSquaredLightDistanceBiasScale, 1); 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 // 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; float combinedAttenuation = distanceAttenuation * lightRadiusMask * spotAttenuation;
// Peek the shadow // Peek the shadow