No Description
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.

AmbientOcclusion.hlsl 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #ifndef AMBIENT_OCCLUSION_INCLUDED
  2. #define AMBIENT_OCCLUSION_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
  4. #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceData.hlsl"
  5. // Ambient occlusion
  6. TEXTURE2D_X(_ScreenSpaceOcclusionTexture);
  7. // 2023.3 Deprecated. This is for backwards compatibility. Remove in the future.
  8. #define sampler_ScreenSpaceOcclusionTexture sampler_LinearClamp
  9. struct AmbientOcclusionFactor
  10. {
  11. half indirectAmbientOcclusion;
  12. half directAmbientOcclusion;
  13. };
  14. half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV)
  15. {
  16. float2 uv = UnityStereoTransformScreenSpaceTex(normalizedScreenSpaceUV);
  17. return half(SAMPLE_TEXTURE2D_X(_ScreenSpaceOcclusionTexture, sampler_LinearClamp, uv).x);
  18. }
  19. AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV)
  20. {
  21. AmbientOcclusionFactor aoFactor;
  22. #if defined(_SCREEN_SPACE_OCCLUSION) && !defined(_SURFACE_TYPE_TRANSPARENT)
  23. float ssao = saturate(SampleAmbientOcclusion(normalizedScreenSpaceUV) + (1.0 - _AmbientOcclusionParam.x));
  24. aoFactor.indirectAmbientOcclusion = ssao;
  25. aoFactor.directAmbientOcclusion = lerp(half(1.0), ssao, _AmbientOcclusionParam.w);
  26. #else
  27. aoFactor.directAmbientOcclusion = half(1.0);
  28. aoFactor.indirectAmbientOcclusion = half(1.0);
  29. #endif
  30. #if defined(DEBUG_DISPLAY)
  31. switch(_DebugLightingMode)
  32. {
  33. case DEBUGLIGHTINGMODE_LIGHTING_WITHOUT_NORMAL_MAPS:
  34. aoFactor.directAmbientOcclusion = 0.5;
  35. aoFactor.indirectAmbientOcclusion = 0.5;
  36. break;
  37. case DEBUGLIGHTINGMODE_LIGHTING_WITH_NORMAL_MAPS:
  38. aoFactor.directAmbientOcclusion *= 0.5;
  39. aoFactor.indirectAmbientOcclusion *= 0.5;
  40. break;
  41. }
  42. #endif
  43. return aoFactor;
  44. }
  45. AmbientOcclusionFactor CreateAmbientOcclusionFactor(float2 normalizedScreenSpaceUV, half occlusion)
  46. {
  47. AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(normalizedScreenSpaceUV);
  48. aoFactor.indirectAmbientOcclusion = min(aoFactor.indirectAmbientOcclusion, occlusion);
  49. return aoFactor;
  50. }
  51. AmbientOcclusionFactor CreateAmbientOcclusionFactor(InputData inputData, SurfaceData surfaceData)
  52. {
  53. return CreateAmbientOcclusionFactor(inputData.normalizedScreenSpaceUV, surfaceData.occlusion);
  54. }
  55. #endif