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:
@@ -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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+2
-4
@@ -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
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user