Nenhuma descrição
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

ScreenSpaceAmbientOcclusion.cs 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using System;
  2. #if UNITY_EDITOR
  3. using ShaderKeywordFilter = UnityEditor.ShaderKeywordFilter;
  4. #endif
  5. namespace UnityEngine.Rendering.Universal
  6. {
  7. [Serializable]
  8. internal class ScreenSpaceAmbientOcclusionSettings
  9. {
  10. // Parameters
  11. [SerializeField] internal AOMethodOptions AOMethod = AOMethodOptions.BlueNoise;
  12. [SerializeField] internal bool Downsample = false;
  13. [SerializeField] internal bool AfterOpaque = false;
  14. [SerializeField] internal DepthSource Source = DepthSource.DepthNormals;
  15. [SerializeField] internal NormalQuality NormalSamples = NormalQuality.Medium;
  16. [SerializeField] internal float Intensity = 3.0f;
  17. [SerializeField] internal float DirectLightingStrength = 0.25f;
  18. [SerializeField] internal float Radius = 0.035f;
  19. [SerializeField] internal AOSampleOption Samples = AOSampleOption.Medium;
  20. [SerializeField] internal BlurQualityOptions BlurQuality = BlurQualityOptions.High;
  21. [SerializeField] internal float Falloff = 100f;
  22. // Legacy. Kept to migrate users over to use Samples instead.
  23. [SerializeField] internal int SampleCount = -1;
  24. // Enums
  25. internal enum DepthSource
  26. {
  27. Depth = 0,
  28. DepthNormals = 1
  29. }
  30. internal enum NormalQuality
  31. {
  32. Low,
  33. Medium,
  34. High
  35. }
  36. internal enum AOSampleOption
  37. {
  38. High, // 12 Samples
  39. Medium, // 8 Samples
  40. Low, // 4 Samples
  41. }
  42. internal enum AOMethodOptions
  43. {
  44. BlueNoise,
  45. InterleavedGradient,
  46. }
  47. internal enum BlurQualityOptions
  48. {
  49. High, // Bilateral
  50. Medium, // Gaussian
  51. Low, // Kawase
  52. }
  53. }
  54. /// <summary>
  55. /// The class for the SSAO renderer feature.
  56. /// </summary>
  57. [SupportedOnRenderer(typeof(UniversalRendererData))]
  58. [DisallowMultipleRendererFeature("Screen Space Ambient Occlusion")]
  59. [Tooltip("The Ambient Occlusion effect darkens creases, holes, intersections and surfaces that are close to each other.")]
  60. [URPHelpURL("post-processing-ssao")]
  61. public class ScreenSpaceAmbientOcclusion : ScriptableRendererFeature
  62. {
  63. // Serialized Fields
  64. [SerializeField] private ScreenSpaceAmbientOcclusionSettings m_Settings = new ScreenSpaceAmbientOcclusionSettings();
  65. [SerializeField]
  66. [HideInInspector]
  67. [Reload("Textures/BlueNoise256/LDR_LLL1_{0}.png", 0, 7)]
  68. internal Texture2D[] m_BlueNoise256Textures;
  69. [SerializeField]
  70. [HideInInspector]
  71. [Reload("Shaders/Utils/ScreenSpaceAmbientOcclusion.shader")]
  72. private Shader m_Shader;
  73. // Private Fields
  74. private Material m_Material;
  75. private ScreenSpaceAmbientOcclusionPass m_SSAOPass = null;
  76. // Internal / Constants
  77. internal ref ScreenSpaceAmbientOcclusionSettings settings => ref m_Settings;
  78. internal const string k_AOInterleavedGradientKeyword = "_INTERLEAVED_GRADIENT";
  79. internal const string k_AOBlueNoiseKeyword = "_BLUE_NOISE";
  80. internal const string k_OrthographicCameraKeyword = "_ORTHOGRAPHIC";
  81. internal const string k_SourceDepthLowKeyword = "_SOURCE_DEPTH_LOW";
  82. internal const string k_SourceDepthMediumKeyword = "_SOURCE_DEPTH_MEDIUM";
  83. internal const string k_SourceDepthHighKeyword = "_SOURCE_DEPTH_HIGH";
  84. internal const string k_SourceDepthNormalsKeyword = "_SOURCE_DEPTH_NORMALS";
  85. internal const string k_SampleCountLowKeyword = "_SAMPLE_COUNT_LOW";
  86. internal const string k_SampleCountMediumKeyword = "_SAMPLE_COUNT_MEDIUM";
  87. internal const string k_SampleCountHighKeyword = "_SAMPLE_COUNT_HIGH";
  88. /// <inheritdoc/>
  89. public override void Create()
  90. {
  91. #if UNITY_EDITOR
  92. ResourceReloader.TryReloadAllNullIn(this, UniversalRenderPipelineAsset.packagePath);
  93. #endif
  94. // Create the pass...
  95. if (m_SSAOPass == null)
  96. m_SSAOPass = new ScreenSpaceAmbientOcclusionPass();
  97. // Check for previous version of SSAO
  98. if (m_Settings.SampleCount > 0)
  99. {
  100. m_Settings.AOMethod = ScreenSpaceAmbientOcclusionSettings.AOMethodOptions.InterleavedGradient;
  101. if (m_Settings.SampleCount > 11)
  102. m_Settings.Samples = ScreenSpaceAmbientOcclusionSettings.AOSampleOption.High;
  103. else if (m_Settings.SampleCount > 8)
  104. m_Settings.Samples = ScreenSpaceAmbientOcclusionSettings.AOSampleOption.Medium;
  105. else
  106. m_Settings.Samples = ScreenSpaceAmbientOcclusionSettings.AOSampleOption.Low;
  107. m_Settings.SampleCount = -1;
  108. }
  109. }
  110. /// <inheritdoc/>
  111. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
  112. {
  113. if (UniversalRenderer.IsOffscreenDepthTexture(ref renderingData.cameraData))
  114. return;
  115. if (!GetMaterials())
  116. {
  117. Debug.LogErrorFormat("{0}.AddRenderPasses(): Missing material. {1} render pass will not be added.", GetType().Name, name);
  118. return;
  119. }
  120. bool shouldAdd = m_SSAOPass.Setup(ref m_Settings, ref renderer, ref m_Material, ref m_BlueNoise256Textures);
  121. if (shouldAdd)
  122. {
  123. renderer.EnqueuePass(m_SSAOPass);
  124. }
  125. }
  126. /// <inheritdoc/>
  127. protected override void Dispose(bool disposing)
  128. {
  129. m_SSAOPass?.Dispose();
  130. m_SSAOPass = null;
  131. CoreUtils.Destroy(m_Material);
  132. }
  133. private bool GetMaterials()
  134. {
  135. if (m_Material == null && m_Shader != null)
  136. m_Material = CoreUtils.CreateEngineMaterial(m_Shader);
  137. return m_Material != null;
  138. }
  139. }
  140. }