Skip to content

Commit 1b46211

Browse files
authored
fix: disable SSAO for transparent surfaces (#18)
1 parent 5577bd1 commit 1b46211

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

Runtime/Shaders/SRPBatchingHelper.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static void OptimizeMaterial(Material material)
3535
if (zWrite == 0)
3636
{
3737
material.SetInt("_Surface", 1);
38-
material.DisableKeyword("_SCREEN_SPACE_OCCLUSION");
38+
material.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
3939
material.SetShaderPassEnabled("DepthNormals", false);
4040
material.renderQueue = (int) UnityEngine.Rendering.RenderQueue.Transparent;
4141
OnMaterialProcess?.Invoke(material);
@@ -55,7 +55,10 @@ public static void OptimizeMaterial(Material material)
5555
int baseQueue;
5656

5757
if (material.renderQueue == (int) UnityEngine.Rendering.RenderQueue.AlphaTest)
58+
{
59+
material.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
5860
baseQueue = (int) UnityEngine.Rendering.RenderQueue.Geometry + 600;
61+
}
5962
else
6063
baseQueue = (int) UnityEngine.Rendering.RenderQueue.Geometry;
6164

Runtime/Shaders/URP/Lighting.hlsl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,11 @@ struct AmbientOcclusionFactor
476476

477477
half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV)
478478
{
479-
if (_Surface == SURFACE_TRANSPARENT)
479+
#if defined(_SURFACE_TYPE_TRANSPARENT)
480+
return 1;
481+
#endif
482+
483+
if (_Surface == SURFACE_TRANSPARENT )
480484
return 1;
481485

482486
float2 uv = UnityStereoTransformScreenSpaceTex(normalizedScreenSpaceUV);
@@ -834,10 +838,12 @@ half4 UniversalFragmentPBR(InputData inputData, SurfaceData surfaceData)
834838
Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, shadowMask);
835839

836840
#if defined(_SCREEN_SPACE_OCCLUSION)
841+
#if !defined(_SURFACE_TYPE_TRANSPARENT)
837842
AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(inputData.normalizedScreenSpaceUV);
838843
mainLight.color *= aoFactor.directAmbientOcclusion;
839844
surfaceData.occlusion = min(surfaceData.occlusion, aoFactor.indirectAmbientOcclusion);
840845
#endif
846+
#endif
841847

842848
MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI);
843849
half3 color = GlobalIllumination(brdfData, brdfDataClearCoat, surfaceData.clearCoatMask,
@@ -854,8 +860,10 @@ half4 UniversalFragmentPBR(InputData inputData, SurfaceData surfaceData)
854860
{
855861
Light light = GetAdditionalLight(lightIndex, inputData.positionWS, shadowMask);
856862
#if defined(_SCREEN_SPACE_OCCLUSION)
863+
#if !defined(_SURFACE_TYPE_TRANSPARENT)
857864
light.color *= aoFactor.directAmbientOcclusion;
858865
#endif
866+
#endif
859867
color += LightingPhysicallyBased(brdfData, brdfDataClearCoat,
860868
light,
861869
inputData.normalWS, inputData.viewDirectionWS,
@@ -902,10 +910,12 @@ half4 UniversalFragmentBlinnPhong(InputData inputData, half3 diffuse, half4 spec
902910
Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, shadowMask);
903911

904912
#if defined(_SCREEN_SPACE_OCCLUSION)
913+
#if !defined(_SURFACE_TYPE_TRANSPARENT)
905914
AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(inputData.normalizedScreenSpaceUV);
906915
mainLight.color *= aoFactor.directAmbientOcclusion;
907916
inputData.bakedGI *= aoFactor.indirectAmbientOcclusion;
908917
#endif
918+
#endif
909919

910920
MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI);
911921

@@ -919,8 +929,10 @@ half4 UniversalFragmentBlinnPhong(InputData inputData, half3 diffuse, half4 spec
919929
{
920930
Light light = GetAdditionalLight(lightIndex, inputData.positionWS, shadowMask);
921931
#if defined(_SCREEN_SPACE_OCCLUSION)
932+
#if !defined(_SURFACE_TYPE_TRANSPARENT)
922933
light.color *= aoFactor.directAmbientOcclusion;
923934
#endif
935+
#endif
924936
half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);
925937
diffuseColor += LightingLambert(attenuatedLightColor, light.direction, inputData.normalWS);
926938
specularColor += LightingSpecular(attenuatedLightColor, light.direction, inputData.normalWS, inputData.viewDirectionWS, specularGloss, smoothness);

Runtime/Shaders/URP/LitInput.hlsl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha)
131131

132132
half SampleOcclusion(float2 uv)
133133
{
134+
#if defined(_SURFACE_TYPE_TRANSPARENT)
135+
return 1.0;
136+
#endif
137+
134138
// No occlusion for transparent surfaces. They don't render normals.
135139
if (_Surface == SURFACE_TRANSPARENT)
136140
return 1.0;

0 commit comments

Comments
 (0)