diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR_ForwardPass.azsl index 30a8666183..be0fcd7250 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/BasePBR_ForwardPass.azsl @@ -21,7 +21,7 @@ #include // Custom Surface & Lighting -#include +#include // Decals #include @@ -102,7 +102,6 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace) } Surface surface; - surface.clearCoat.InitializeToZero(); surface.position = IN.m_worldPosition.xyz; // ------- Normal ------- diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl index 8f58c6dd33..bef07f0a00 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/StandardMultilayerPBR_ForwardPass.azsl @@ -428,7 +428,6 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float Surface surface; surface.position = IN.m_worldPosition; - surface.transmission.InitializeToZero(); // ------- Combine Normals --------- @@ -523,7 +522,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float ApplyIBL(surface, lightingData); // Finalize Lighting - lightingData.FinalizeLighting(0); + lightingData.FinalizeLighting(); const float alpha = 1.0; 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 dfd5522f5c..d33780641d 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 @@ -36,6 +36,9 @@ float ThinObjectFalloff(const float3 surfaceNormal, const float3 dirToLight) float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight, float shadowRatio) { float3 result = float3(0.0, 0.0, 0.0); + +#if ENABLE_TRANSMISSION + float thickness = 0.0; float4 transmissionParams = surface.transmission.transmissionParams; @@ -71,7 +74,9 @@ float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightI break; } - + +#endif + return result; } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/BaseLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/BaseLighting.azsli new file mode 100644 index 0000000000..8bd645498c --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/BaseLighting.azsli @@ -0,0 +1,83 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#define ENABLE_CLEAR_COAT 0 +#define ENABLE_TRANSMISSION 0 +#define ENABLE_AREA_LIGHT_VALIDATION 0 + +// Include options first +#include + +// Then include custom surface and lighting data types +#include +#include + +#include +#include + +// Then define the Diffuse and Specular lighting functions +float3 GetDiffuseLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight) +{ + float3 diffuse = DiffuseLambertian(surface.albedo, surface.normal, dirToLight, lightingData.diffuseResponse); + diffuse *= lightIntensity; + return diffuse; +} + +float3 GetSpecularLighting(Surface surface, LightingData lightingData, const float3 lightIntensity, const float3 dirToLight) +{ + float3 specular = SpecularGGX(lightingData.dirToCamera, dirToLight, surface.normal, surface.specularF0, lightingData.NdotV, surface.roughnessA2, lightingData.multiScatterCompensation); + specular *= lightIntensity; + return specular; +} + + +// Then include everything else +#include +#include + + +struct PbrLightingOutput +{ + float4 m_diffuseColor; + float4 m_specularColor; + float4 m_albedo; + float4 m_specularF0; + float4 m_normal; +}; + + +PbrLightingOutput GetPbrLightingOutput(Surface surface, LightingData lightingData, float alpha) +{ + PbrLightingOutput lightingOutput; + + lightingOutput.m_diffuseColor = float4(lightingData.diffuseLighting, alpha); + lightingOutput.m_specularColor = float4(lightingData.specularLighting, 1.0); + + // albedo, specularF0, roughness, and normals for later passes (specular IBL, Diffuse GI, SSR, AO, etc) + lightingOutput.m_specularF0 = float4(surface.specularF0, surface.roughnessLinear); + lightingOutput.m_albedo.rgb = surface.albedo * lightingData.diffuseResponse * lightingData.diffuseAmbientOcclusion; + lightingOutput.m_albedo.a = lightingData.specularOcclusion; + lightingOutput.m_normal.rgb = EncodeNormalSignedOctahedron(surface.normal); + lightingOutput.m_normal.a = o_specularF0_enableMultiScatterCompensation ? 1.0f : 0.0f; + + return lightingOutput; +} + +PbrLightingOutput DebugOutput(float3 color) +{ + PbrLightingOutput output = (PbrLightingOutput)0; + + float3 defaultNormal = float3(0.0f, 0.0f, 1.0f); + + output.m_diffuseColor = float4(color.rgb, 1.0f); + output.m_normal.rgb = EncodeNormalSignedOctahedron(defaultNormal); + + return output; +} 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 dbc348e54a..721c9e13cc 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 @@ -88,8 +88,10 @@ void LightingData::FinalizeLighting(float3 transmissionTint) FinalizeLighting(); // Transmitted light +#if ENABLE_TRANSMISSION if(o_transmission_mode != TransmissionMode::None) { diffuseLighting += translucentBackLighting * transmissionTint; } +#endif } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli index 773c86ff0f..ad3c9715d4 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/StandardLighting.azsli @@ -8,6 +8,8 @@ #pragma once +#define ENABLE_TRANSMISSION 0 + // Include options first #include diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingOptions.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingOptions.azsli index f807acc374..35d9bced0d 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingOptions.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/LightingOptions.azsli @@ -8,6 +8,50 @@ #pragma once +// --- Light Defines --- + +#ifndef ENABLE_AREA_LIGHT_VALIDATION +#define ENABLE_AREA_LIGHT_VALIDATION 1 +#endif + +#ifndef ENABLE_AREA_LIGHTS +#define ENABLE_AREA_LIGHTS 1 +#endif + +#ifndef ENABLE_SPHERE_LIGHTS +#define ENABLE_SPHERE_LIGHTS ENABLE_AREA_LIGHTS +#endif + +#ifndef ENABLE_DISK_LIGHTS +#define ENABLE_DISK_LIGHTS ENABLE_AREA_LIGHTS +#endif + +#ifndef ENABLE_CAPSULE_LIGHTS +#define ENABLE_CAPSULE_LIGHTS ENABLE_AREA_LIGHTS +#endif + +#ifndef ENABLE_QUAD_LIGHTS +#define ENABLE_QUAD_LIGHTS ENABLE_AREA_LIGHTS +#endif + +#ifndef ENABLE_POLYGON_LTC_LIGHTS +#define ENABLE_POLYGON_LTC_LIGHTS ENABLE_AREA_LIGHTS +#endif + + +// --- Material defines --- + +#ifndef ENABLE_CLEAR_COAT +#define ENABLE_CLEAR_COAT 1 +#endif + +#ifndef ENABLE_TRANSMISSION +#define ENABLE_TRANSMISSION 1 +#endif + + +// --- Shader Options --- + option bool o_specularF0_enableMultiScatterCompensation = true; option bool o_enableShadows = true; option bool o_enableDirectionalLights = true; @@ -15,8 +59,14 @@ option bool o_enablePunctualLights = true; option bool o_enableAreaLights = true; option bool o_enableIBL = true; option bool o_enableSubsurfaceScattering = false; -option bool o_clearCoat_feature_enabled = false; -option enum class TransmissionMode {None, ThickObject, ThinObject} o_transmission_mode; option bool o_meshUseForwardPassIBLSpecular = false; option bool o_materialUseForwardPassIBLSpecular = false; +option bool o_area_light_validation = false; +#if ENABLE_CLEAR_COAT +option bool o_clearCoat_feature_enabled = false; +#endif + +#if ENABLE_TRANSMISSION +option enum class TransmissionMode {None, ThickObject, ThinObject} o_transmission_mode; +#endif diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli index e6b18df9b5..733ea2dbea 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli @@ -224,14 +224,21 @@ void ApplyCapsuleLights(Surface surface, inout LightingData lightingData) uint currLightIndex = lightingData.tileIterator.GetValue(); lightingData.tileIterator.LoadAdvance(); +#if ENABLE_CAPSULE_LIGHTS + ViewSrg::CapsuleLight light = ViewSrg::m_capsuleLights[currLightIndex]; + + #if ENABLE_AREA_LIGHT_VALIDATION if (o_area_light_validation) { ValidateCapsuleLight(light, surface, lightingData); } else + #endif { ApplyCapsuleLight(light, surface, lightingData); } + +#endif } } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli index 1eee53a24f..7cf10f13a3 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli @@ -27,10 +27,12 @@ void ApplyDirectionalLights(Surface surface, inout LightingData lightingData) surface.vertexNormal, debugInfo); +#if ENABLE_TRANSMISSION if (o_transmission_mode == TransmissionMode::ThickObject) { backShadowRatio = DirectionalLightShadow::GetThickness(shadowIndex, lightingData.shadowCoords); } +#endif } // Add the lighting contribution for each directional light @@ -56,10 +58,12 @@ void ApplyDirectionalLights(Surface surface, inout LightingData lightingData) currentLitRatio = (index == shadowIndex) ? litRatio : 1.; currentBackShadowRatio = 1.0 - currentLitRatio; +#if ENABLE_TRANSMISSION if (o_transmission_mode == TransmissionMode::ThickObject) { currentBackShadowRatio = (index == shadowIndex) ? backShadowRatio : 0.; } +#endif } lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight) * currentLitRatio; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli index 63f671f021..79b377c568 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli @@ -90,12 +90,14 @@ void ApplyDiskLight(ViewSrg::DiskLight light, Surface surface, inout LightingDat // Use backShadowRatio to carry thickness from shadow map for thick mode backShadowRatio = 1.0 - litRatio; +#if ENABLE_TRANSMISSION if (o_transmission_mode == TransmissionMode::ThickObject) { backShadowRatio = ProjectedShadow::GetThickness( light.m_shadowIndex, surface.position); } +#endif } if (useConeAngle && dotWithDirection < light.m_cosInnerConeAngle) // in penumbra @@ -209,15 +211,21 @@ void ApplyDiskLights(Surface surface, inout LightingData lightingData) uint currLightIndex = lightingData.tileIterator.GetValue(); lightingData.tileIterator.LoadAdvance(); +#if ENABLE_DISK_LIGHTS + ViewSrg::DiskLight light = ViewSrg::m_diskLights[currLightIndex]; + #if ENABLE_AREA_LIGHT_VALIDATION if (o_area_light_validation) { ValidateDiskLight(light, surface, lightingData); } else + #endif { ApplyDiskLight(light, surface, lightingData); } + +#endif } } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli index abc2d3d3bd..e813993794 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ibl.azsli @@ -98,6 +98,7 @@ void ApplyIBL(Surface surface, inout LightingData lightingData) float3 iblSpecular = GetIblSpecular(surface.position, surface.normal, surface.specularF0, surface.roughnessLinear, lightingData.dirToCamera, lightingData.brdf); iblSpecular *= lightingData.multiScatterCompensation; +#if ENABLE_CLEAR_COAT if (o_clearCoat_feature_enabled && surface.clearCoat.factor > 0.0f) { float clearCoatNdotV = saturate(dot(surface.clearCoat.normal, lightingData.dirToCamera)); @@ -115,6 +116,7 @@ void ApplyIBL(Surface surface, inout LightingData lightingData) float3 clearCoatResponse = FresnelSchlickWithRoughness(clearCoatNdotV, clearCoatSpecularF0, surface.clearCoat.roughness) * surface.clearCoat.factor; iblSpecular = iblSpecular * (1.0 - clearCoatResponse) * (1.0 - clearCoatResponse) + clearCoatIblSpecular; } +#endif float exposure = ObjectSrg::m_reflectionProbeData.m_useReflectionProbe ? pow(2.0, ObjectSrg::m_reflectionProbeData.m_exposure) : globalIblExposure; lightingData.specularLighting += (iblSpecular * exposure); diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli index f0169e29b8..16adbba280 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli @@ -13,9 +13,6 @@ #include #include -option bool o_area_light_validation = false; - - //! Adjust the intensity of specular light based on the radius of the light source and roughness of the surface to approximate energy conservation. float GetIntensityAdjustedByRadiusAndRoughness(float roughnessA, float radius, float distance2) { diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ltc.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ltc.azsli index 531eb6e885..0f542870a8 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ltc.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/Ltc.azsli @@ -403,6 +403,7 @@ void LtcQuadEvaluate( float2 schlick = ltcAmpMatrix.Sample(PassSrg::LinearSampler, ltcCoords).xy; float3 specularRgb = specular * (schlick.x * surface.specularF0 + (1.0 - surface.specularF0) * schlick.y); +#if ENABLE_CLEAR_COAT if(o_clearCoat_feature_enabled) { int vertexCountCc = LtcQuadTransformAndClip(surface.clearCoat.normal, lightingData.dirToCamera, p, polygon); @@ -422,6 +423,7 @@ void LtcQuadEvaluate( specularRgb = (specularRgb * (1.0 - F)) + (clearCoatSpecular * F); } } +#endif diffuseOut = diffuse; specularOut = specularRgb; @@ -620,6 +622,7 @@ void LtcPolygonEvaluate( float2 schlick = ltcAmpMatrix.Sample(PassSrg::LinearSampler, ltcCoords).xy; float3 specularRgb = specular * ((schlick.x * surface.specularF0) + (1.0 - surface.specularF0) * schlick.y); +#if ENABLE_CLEAR_COAT if(o_clearCoat_feature_enabled) { // Rotate ltc matrix @@ -660,6 +663,7 @@ void LtcPolygonEvaluate( specularRgb = (specularRgb * (1.0 - F)) + (specularCc * F); } } +#endif diffuseOut = diffuse; specularRgbOut = specularRgb; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli index 92f4065931..883d86af48 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli @@ -99,12 +99,14 @@ void ApplyPointLight(ViewSrg::PointLight light, Surface surface, inout LightingD // Use backShadowRatio to carry thickness from shadow map for thick mode backShadowRatio = 1.0 - litRatio; +#if ENABLE_TRANSMISSION if (o_transmission_mode == TransmissionMode::ThickObject) { backShadowRatio = ProjectedShadow::GetThickness( shadowIndex, surface.position); } +#endif } // Diffuse contribution @@ -177,15 +179,21 @@ void ApplyPointLights(Surface surface, inout LightingData lightingData) uint currLightIndex = lightingData.tileIterator.GetValue(); lightingData.tileIterator.LoadAdvance(); +#if ENABLE_SPHERE_LIGHTS + ViewSrg::PointLight light = ViewSrg::m_pointLights[currLightIndex]; + #if ENABLE_AREA_LIGHT_VALIDATION if (o_area_light_validation) { ValidatePointLight(light, surface, lightingData); } else + #endif { ApplyPointLight(light, surface, lightingData); } + +#endif } } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli index 07fe6d4f00..e4e25e351b 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PolygonLight.azsli @@ -68,10 +68,12 @@ void ApplyPoylgonLight(ViewSrg::PolygonLight light, Surface surface, inout Light void ApplyPolygonLights(Surface surface, inout LightingData lightingData) { +#if ENABLE_POLYGON_LTC_LIGHTS for (uint currLightIndex = 0; currLightIndex < ViewSrg::m_polygonLightCount; ++currLightIndex) { ViewSrg::PolygonLight light = ViewSrg::m_polygonLights[currLightIndex]; ApplyPoylgonLight(light, surface, lightingData); } +#endif } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli index 63515339d8..a705e663c2 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli @@ -245,16 +245,22 @@ void ApplyQuadLights(Surface surface, inout LightingData lightingData) { uint currLightIndex = lightingData.tileIterator.GetValue(); lightingData.tileIterator.LoadAdvance(); - + +#if ENABLE_QUAD_LIGHTS + ViewSrg::QuadLight light = ViewSrg::m_quadLights[currLightIndex]; + #if ENABLE_AREA_LIGHT_VALIDATION if (o_area_light_validation) { ValidateQuadLight(light, surface, lightingData); } else + #endif { ApplyQuadLight(light, surface, lightingData); } + +#endif } } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli index ff8d4c0a25..6e30f55af4 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/ClearCoatSurfaceData.azsli @@ -8,6 +8,8 @@ #pragma once +#if ENABLE_CLEAR_COAT + class ClearCoatSurfaceData { float factor; //!< clear coat strength factor @@ -23,3 +25,5 @@ void ClearCoatSurfaceData::InitializeToZero() roughness = 0.0f; normal = float3(0.0f, 0.0f, 0.0f); } + +#endif diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli index 084943bf38..ab43717919 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/StandardSurface.azsli @@ -15,8 +15,14 @@ class Surface { + +#if ENABLE_CLEAR_COAT ClearCoatSurfaceData clearCoat; +#endif + +#if ENABLE_TRANSMISSION TransmissionSurfaceData transmission; // This is not actually used for Standard PBR, but must be present for common lighting code to compile +#endif // ------- BasePbrSurfaceData ------- @@ -37,7 +43,6 @@ class Surface //! Sets albedo and specularF0 using metallic workflow void SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic); - }; // Specular Anti-Aliasing technique from this paper: diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli index 9b575de3ec..dda62d85e5 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli @@ -8,6 +8,8 @@ #pragma once +#if ENABLE_TRANSMISSION + class TransmissionSurfaceData { float3 tint; @@ -23,3 +25,5 @@ void TransmissionSurfaceData::InitializeToZero() thickness = 0.0f; transmissionParams = float4(0.0f, 0.0f, 0.0f, 0.0f); } + +#endif diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli index 32cd30b97e..430e095bf4 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ShaderQualityOptions.azsli @@ -13,10 +13,23 @@ #ifdef QUALITY_LOW_END // Unifies the forward output into a single lighting buffer instead of splitting it into a GBuffer + #ifndef UNIFIED_FORWARD_OUTPUT #define UNIFIED_FORWARD_OUTPUT 1 - + #endif + // Forces IBL lighting to be executed in the forward pass instead of subsequent refleciton passes + #ifndef FORCE_IBL_IN_FORWARD_PASS #define FORCE_IBL_IN_FORWARD_PASS 1 + #endif + + // Forces removal of area light validation code + #ifndef ENABLE_AREA_LIGHT_VALIDATION + #define ENABLE_AREA_LIGHT_VALIDATION 0 + #endif + + // Uncomment to disable all area light calcuation + // #ifndef ENABLE_AREA_LIGHTS + // #define ENABLE_AREA_LIGHTS 0 + // #endif #endif - diff --git a/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl b/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl index 2dbba46d8b..585c6283c2 100644 --- a/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl +++ b/Gems/Atom/TestData/TestData/Materials/Types/AutoBrick_ForwardPass.azsl @@ -179,9 +179,8 @@ ForwardPassOutput AutoBrick_ForwardPassPS(VSOutput IN) const float specularF0Factor = 0.5f; surface.SetAlbedoAndSpecularF0(baseColor, specularF0Factor, metallic); - // Clear Coat, Transmission + // Clear Coat surface.clearCoat.InitializeToZero(); - surface.transmission.InitializeToZero(); // ------- LightingData ------- @@ -213,7 +212,7 @@ ForwardPassOutput AutoBrick_ForwardPassPS(VSOutput IN) ApplyIBL(surface, lightingData); // Finalize Lighting - lightingData.FinalizeLighting(surface.transmission.tint); + lightingData.FinalizeLighting(); PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha); diff --git a/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl b/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl index 2f6f038e4b..b544a26366 100644 --- a/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl +++ b/Gems/Atom/TestData/TestData/Materials/Types/MinimalPBR_ForwardPass.azsl @@ -71,9 +71,8 @@ ForwardPassOutput MinimalPBR_MainPassPS(VSOutput IN) const float specularF0Factor = 0.5f; surface.SetAlbedoAndSpecularF0(MinimalPBRSrg::m_baseColor, specularF0Factor, MinimalPBRSrg::m_metallic); - // Clear Coat, Transmission + // Clear Coat surface.clearCoat.InitializeToZero(); - surface.transmission.InitializeToZero(); // ------- LightingData ------- @@ -104,7 +103,7 @@ ForwardPassOutput MinimalPBR_MainPassPS(VSOutput IN) ApplyIBL(surface, lightingData); // Finalize Lighting - lightingData.FinalizeLighting(surface.transmission.tint); + lightingData.FinalizeLighting(); PbrLightingOutput lightingOutput = GetPbrLightingOutput(surface, lightingData, alpha);