Fix radial lights
This commit is contained in:
BIN
Content/Shaders/VolumetricFog.flax
(Stored with Git LFS)
BIN
Content/Shaders/VolumetricFog.flax
(Stored with Git LFS)
Binary file not shown.
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user