You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.2 KiB
68 lines
2.2 KiB
#ifndef AMBIENT_OCCLUSION_INCLUDED |
|
#define AMBIENT_OCCLUSION_INCLUDED |
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" |
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl" |
|
|
|
// Ambient occlusion |
|
TEXTURE2D_X(_ScreenSpaceOcclusionTexture); |
|
SAMPLER(sampler_ScreenSpaceOcclusionTexture); |
|
|
|
struct AmbientOcclusionFactor |
|
{ |
|
half indirectAmbientOcclusion; |
|
half directAmbientOcclusion; |
|
}; |
|
|
|
half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV) |
|
{ |
|
float2 uv = UnityStereoTransformScreenSpaceTex(normalizedScreenSpaceUV); |
|
return half(SAMPLE_TEXTURE2D_X(_ScreenSpaceOcclusionTexture, sampler_ScreenSpaceOcclusionTexture, uv).x); |
|
} |
|
|
|
AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV) |
|
{ |
|
AmbientOcclusionFactor aoFactor; |
|
|
|
#if defined(_SCREEN_SPACE_OCCLUSION) && !defined(_SURFACE_TYPE_TRANSPARENT) |
|
float ssao = SampleAmbientOcclusion(normalizedScreenSpaceUV); |
|
|
|
aoFactor.indirectAmbientOcclusion = ssao; |
|
aoFactor.directAmbientOcclusion = lerp(half(1.0), ssao, _AmbientOcclusionParam.w); |
|
#else |
|
aoFactor.directAmbientOcclusion = 1; |
|
aoFactor.indirectAmbientOcclusion = 1; |
|
#endif |
|
|
|
#if defined(DEBUG_DISPLAY) |
|
switch(_DebugLightingMode) |
|
{ |
|
case DEBUGLIGHTINGMODE_LIGHTING_WITHOUT_NORMAL_MAPS: |
|
aoFactor.directAmbientOcclusion = 0.5; |
|
aoFactor.indirectAmbientOcclusion = 0.5; |
|
break; |
|
|
|
case DEBUGLIGHTINGMODE_LIGHTING_WITH_NORMAL_MAPS: |
|
aoFactor.directAmbientOcclusion *= 0.5; |
|
aoFactor.indirectAmbientOcclusion *= 0.5; |
|
break; |
|
} |
|
#endif |
|
|
|
return aoFactor; |
|
} |
|
|
|
AmbientOcclusionFactor CreateAmbientOcclusionFactor(float2 normalizedScreenSpaceUV, half occlusion) |
|
{ |
|
AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(normalizedScreenSpaceUV); |
|
|
|
aoFactor.indirectAmbientOcclusion = min(aoFactor.indirectAmbientOcclusion, occlusion); |
|
return aoFactor; |
|
} |
|
|
|
AmbientOcclusionFactor CreateAmbientOcclusionFactor(InputData inputData, SurfaceData surfaceData) |
|
{ |
|
return CreateAmbientOcclusionFactor(inputData.normalizedScreenSpaceUV, surfaceData.occlusion); |
|
} |
|
|
|
#endif
|
|
|