[ATOM-15854] Adjusting alpha on grazing angles so it doesn't affect the diffuse response. (#1708)

Signed-off-by: Ken Pruiksma <pruiksma@amazon.com>
main
Ken Pruiksma 5 years ago committed by GitHub
parent e13b9ca829
commit 6a0b8ae6b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -324,16 +324,21 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// Finalize Lighting
lightingData.FinalizeLighting(surface.transmission.tint);
PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha);
// ------- Opacity -------
if (o_opacity_mode == OpacityMode::Blended || o_opacity_mode == OpacityMode::TintedTransparent)
{
float fresnelAlpha = FresnelSchlickWithRoughness(lightingData.NdotV, alpha, surface.roughnessLinear).x; // Increase opacity at grazing angles.
// Increase opacity at grazing angles for surfaces with a low m_opacityAffectsSpecularFactor.
// For m_opacityAffectsSpecularFactor values close to 0, that indicates a transparent surface
// like glass, so it becomes less transparent at grazing angles. For m_opacityAffectsSpecularFactor
// values close to 1.0, that indicates the absence of a surface entirely, so this effect should
// not apply.
float fresnelAlpha = FresnelSchlickWithRoughness(lightingData.NdotV, alpha, surface.roughnessLinear).x;
alpha = lerp(fresnelAlpha, alpha, MaterialSrg::m_opacityAffectsSpecularFactor);
}
PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha);
// ------- Opacity -------
// Note: lightingOutput rendertargets are not always used as named, particularly m_diffuseColor (target 0) and
// m_specularColor (target 1). Comments below describe the differences when appropriate.
@ -347,11 +352,13 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
// It's done this way because surface transparency doesn't really change specular response (eg, glass).
lightingOutput.m_diffuseColor.rgb *= lightingOutput.m_diffuseColor.w; // pre-multiply diffuse
// Add specular. m_opacityAffectsSpecularFactor controls how much the alpha masks out specular contribution.
float3 specular = lightingOutput.m_specularColor.rgb;
specular = lerp(specular, specular * lightingOutput.m_diffuseColor.w, MaterialSrg::m_opacityAffectsSpecularFactor);
lightingOutput.m_diffuseColor.rgb += specular;
lightingOutput.m_diffuseColor.w = alpha;
}
else if (o_opacity_mode == OpacityMode::TintedTransparent)
{
@ -374,7 +381,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float
specular = lerp(specular, specular * lightingOutput.m_diffuseColor.w, MaterialSrg::m_opacityAffectsSpecularFactor);
lightingOutput.m_diffuseColor.rgb += specular;
lightingOutput.m_specularColor.rgb = baseColor * (1.0 - lightingOutput.m_diffuseColor.w);
lightingOutput.m_specularColor.rgb = baseColor * (1.0 - alpha);
}
else
{

Loading…
Cancel
Save