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

View File

@@ -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);

View File

@@ -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

View File

@@ -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