Move attenuation computation into GetBackLighting (https://github.com/o3de/o3de/pull/6428#discussion_r774259148)

Signed-off-by: Santi Paprika <santi.gonzalez.cs@gmail.com>
This commit is contained in:
Santi Paprika
2021-12-23 19:49:47 +01:00
parent 6e3ada487e
commit eda405f5f1
7 changed files with 17 additions and 20 deletions
@@ -36,7 +36,7 @@ float3 T(float s)
float3(0.078, 0.0, 0.0) * exp(-s*s/7.41);
}
float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight, float transmissionDistance)
float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight, float transmissionDistance, float attenuationDistance)
{
float3 result = float3(0.0, 0.0, 0.0);
float thickness = 0.0;
@@ -86,6 +86,9 @@ float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightI
// Alternative specific to skin translucency
// result = T(s) * lightIntensity * surface.albedo * E * transmissionParams.w;
// Distance attenuation applied to hide artifacts due to low-res projected areas onto shadowmaps (might need some work in the future)
result *= 1.0 / pow(max(1.0, sqrt(attenuationDistance)), lightingData.distanceAttenuation + 1.0);
}
break;
}
@@ -136,7 +136,7 @@ void ApplyCapsuleLight(ViewSrg::CapsuleLight light, Surface surface, inout Light
float3 posToLight = closestIntersectionPoint - surface.position;
// Tranmission contribution
lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), 0.0);
lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), -1.0f, 0.0f);
// Calculate the offset from the nearest point on the reflection vector to the nearest point on the capsule light
float3 posToClosestPointAlongReflection = dot(posToLight, reflectionDir) * reflectionDir;
@@ -77,10 +77,8 @@ void ApplyDirectionalLights(Surface surface, inout LightingData lightingData)
currentTransmissionDistance = transmissionDistance;
}
// Transmission contribution with attenuation applied to hide artifacts due to low-res shadow maps (might need some work in the future)
float3 backLighting = GetBackLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight, currentTransmissionDistance);
float attenuation = 1.0 / pow(max(1.0, camToSurfDist/2.0), lightingData.distanceAttenuation + 1.0);
lightingData.translucentBackLighting += backLighting * attenuation;
// Transmission contribution
lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight, currentTransmissionDistance, camToSurfDist/2.0);
lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight) * currentLitRatio;
lightingData.specularLighting += GetSpecularLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight) * currentLitRatio;
@@ -116,10 +116,8 @@ void ApplyDiskLight(ViewSrg::DiskLight light, Surface surface, inout LightingDat
// Diffuse contribution
lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, lightIntensity, posToLightDir) * litRatio;
// Transmission contribution with attenuation applied to hide artifacts due to low-res shadow maps (might need some work in the future)
float3 backLighting = GetBackLighting(surface, lightingData, lightIntensity, posToLightDir, transmissionDistance);
float attenuation = 1.0 / pow(max(1.0, sqrt(distanceToLight2)), lightingData.distanceAttenuation + 1.0);
lightingData.translucentBackLighting += backLighting * attenuation;
// Transmission contribution
lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, posToLightDir, transmissionDistance, distanceToLight2);
// Adjust the light direction for specular based on disk size
@@ -49,6 +49,6 @@ void AddSampleContribution(
float3 intensityRgb = float3(intensity, intensity, intensity);
diffuseAcc += GetDiffuseLighting(surface, lightingData, intensityRgb, posToLightSampleDir);
translucentAcc += GetBackLighting(surface, lightingData, intensityRgb, posToLightSampleDir, 0.0);
translucentAcc += GetBackLighting(surface, lightingData, intensityRgb, posToLightSampleDir, -1.0f, 0.0f);
specularAcc += GetSpecularLighting(surface, lightingData, intensityRgb, posToLightSampleDir);
}
@@ -113,10 +113,8 @@ void ApplyPointLight(ViewSrg::PointLight light, Surface surface, inout LightingD
// Diffuse contribution
lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, lightIntensity, normalize(posToLight)) * litRatio;
// Transmission contribution with attenuation applied to hide artifacts due to low-res shadow maps (might need some work in the future)
float3 backLighting = GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), transmissionDistance);
float attenuation = 1.0 / pow(max(1.0, posToLightDist), lightingData.distanceAttenuation + 1.0);
lightingData.translucentBackLighting += backLighting * attenuation;
// Transmission contribution
lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), transmissionDistance, posToLightDist);
// Adjust the light direcion for specular based on bulb size
@@ -150,11 +150,11 @@ void ApplyQuadLight(ViewSrg::QuadLight light, Surface surface, inout LightingDat
lightingData.translucentBackLighting +=
(
GetBackLighting(surface, lightingData, intensity, p0, -1.0f) +
GetBackLighting(surface, lightingData, intensity, p1, -1.0f) +
GetBackLighting(surface, lightingData, intensity, p2, -1.0f) +
GetBackLighting(surface, lightingData, intensity, p3, -1.0f) +
GetBackLighting(surface, lightingData, intensity, dirToLightCenter, -1.0f)
GetBackLighting(surface, lightingData, intensity, p0, -1.0f, 0.0f) +
GetBackLighting(surface, lightingData, intensity, p1, -1.0f, 0.0f) +
GetBackLighting(surface, lightingData, intensity, p2, -1.0f, 0.0f) +
GetBackLighting(surface, lightingData, intensity, p3, -1.0f, 0.0f) +
GetBackLighting(surface, lightingData, intensity, dirToLightCenter, -1.0f, 0.0f)
);
// Calculate specular by choosing a single representative point on the light's surface based on the reflection ray