From 348c3cc0f62268e74114e27f4cad913b64b2ddfd Mon Sep 17 00:00:00 2001 From: Santi Paprika Date: Thu, 2 Dec 2021 13:04:16 +0100 Subject: [PATCH] Expose angle offset below (N.L) Signed-off-by: Santi Paprika --- .../Common/Assets/Materials/Types/Skin.azsl | 3 +++ .../Assets/Materials/Types/Skin.materialtype | 15 ++++++++++++++- .../Assets/Materials/Types/Skin_Common.azsli | 1 + .../Atom/Features/PBR/BackLighting.azsli | 4 ++-- .../Atom/Features/PBR/Lighting/LightingData.azsli | 5 ++++- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl index b672016c00..2e861a61bb 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl @@ -351,6 +351,9 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); lightingData.diffuseResponse = 1.0 - lightingData.specularResponse; + // Angle offset for subsurface scattering through thin objects + lightingData.angleOffset = MaterialSrg::m_angleOffset; + // ------- Occlusion ------- lightingData.diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_diffuseOcclusionMap, MaterialSrg::m_sampler, IN.m_uv[MaterialSrg::m_diffuseOcclusionMapUvIndex], MaterialSrg::m_diffuseOcclusionFactor, o_diffuseOcclusion_useTexture); diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype index 496d6286cc..39cbe21a18 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype @@ -650,6 +650,19 @@ "name": "m_shrinkFactor" } }, + { + "name": "angleOffset", + "displayName": " Angle Offset", + "description": "Angle to accept below (N . L = 0) in scattering through thin objects", + "type": "float", + "defaultValue": 0.1, + "min": -1.0, + "softMax": 1.0, + "connection": { + "type": "ShaderInput", + "name": "m_angleOffset" + } + }, { "name": "transmissionScale", "displayName": " Scale", @@ -657,7 +670,7 @@ "type": "float", "defaultValue": 3.0, "min": 0.0, - "softMax": 20.0 + "softMax": 100.0 } ], "wrinkleLayers": [ diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli index 406da8b70c..1fa2039c72 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli @@ -72,6 +72,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial Texture2D m_transmissionThicknessMap; uint m_transmissionThicknessMapUvIndex; float m_shrinkFactor; + float m_angleOffset; Texture2D m_wrinkle_baseColor_texture1; Texture2D m_wrinkle_baseColor_texture2; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli index 559b8cac2e..0e39739fcb 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli @@ -65,10 +65,10 @@ float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightI { // Irradiance arround surface point. // Begin the transmittance dot product slightly before it would with the regular dot(N,L) - float E = max(0.30 + dot(-surface.normal, dirToLight), 0.0); + float E = saturate(lightingData.angleOffset + dot(-surface.normal, dirToLight)); // Transmission distance computed from shadowmaps modulated by editor-exposed parameters - float s = transmissionDistance * surface.transmission.thickness * (50 - transmissionParams.w) * 10; + float s = transmissionDistance * surface.transmission.thickness * (100 - transmissionParams.w) * 10; // Albedo at front (surface point) is used to approximate irradiance at the back of the object // See observation 4 in [Jimenez J. et al, 2010] diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli index 51bd421418..7ca8a797a8 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli @@ -28,9 +28,12 @@ class LightingData // Direction light shadow coordinates float3 shadowCoords[ViewSrg::MaxCascadeCount]; - // Direction light shadow coordinates for shrinked positions + // Direction light shadow coordinates for shrinked positions (used in scattering through thin objects) float3 shrinkedShadowCoords[ViewSrg::MaxCascadeCount]; + // Angle to accept below (N . L = 0) in scattering through thin objects + float angleOffset; + // Normalized direction from surface to camera float3 dirToCamera;