暫無描述
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.

DepthNormalOnlyPass.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.Experimental.Rendering;
  4. using UnityEngine.Rendering.RenderGraphModule;
  5. namespace UnityEngine.Rendering.Universal.Internal
  6. {
  7. /// <summary>
  8. /// Render all objects that have a 'DepthNormals' and/or 'DepthNormalsOnly' pass into the given depth and normal buffers.
  9. /// </summary>
  10. public class DepthNormalOnlyPass : ScriptableRenderPass
  11. {
  12. internal List<ShaderTagId> shaderTagIds { get; set; }
  13. private RTHandle depthHandle { get; set; }
  14. private RTHandle normalHandle { get; set; }
  15. private RTHandle renderingLayersHandle { get; set; }
  16. internal bool enableRenderingLayers { get; set; } = false;
  17. internal RenderingLayerUtils.MaskSize renderingLayersMaskSize { get; set; }
  18. private FilteringSettings m_FilteringSettings;
  19. private PassData m_PassData;
  20. // Constants
  21. private static readonly List<ShaderTagId> k_DepthNormals = new List<ShaderTagId> { new ShaderTagId("DepthNormals"), new ShaderTagId("DepthNormalsOnly") };
  22. private static readonly RTHandle[] k_ColorAttachment1 = new RTHandle[1];
  23. private static readonly RTHandle[] k_ColorAttachment2 = new RTHandle[2];
  24. /// <summary>
  25. /// Creates a new <c>DepthNormalOnlyPass</c> instance.
  26. /// </summary>
  27. /// <param name="evt">The <c>RenderPassEvent</c> to use.</param>
  28. /// <param name="renderQueueRange">The <c>RenderQueueRange</c> to use for creating filtering settings that control what objects get rendered.</param>
  29. /// <param name="layerMask">The layer mask to use for creating filtering settings that control what objects get rendered.</param>
  30. /// <seealso cref="RenderPassEvent"/>
  31. /// <seealso cref="RenderQueueRange"/>
  32. /// <seealso cref="LayerMask"/>
  33. public DepthNormalOnlyPass(RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask)
  34. {
  35. base.profilingSampler = new ProfilingSampler(nameof(DepthNormalOnlyPass));
  36. m_PassData = new PassData();
  37. m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
  38. renderPassEvent = evt;
  39. useNativeRenderPass = false;
  40. this.shaderTagIds = k_DepthNormals;
  41. }
  42. /// <summary>
  43. /// Finds the format to use for the normals texture.
  44. /// </summary>
  45. /// <returns>The GraphicsFormat to use with the Normals texture.</returns>
  46. public static GraphicsFormat GetGraphicsFormat()
  47. {
  48. if (SystemInfo.IsFormatSupported(GraphicsFormat.R8G8B8A8_SNorm, GraphicsFormatUsage.Render))
  49. return GraphicsFormat.R8G8B8A8_SNorm; // Preferred format
  50. else if (SystemInfo.IsFormatSupported(GraphicsFormat.R16G16B16A16_SFloat, GraphicsFormatUsage.Render))
  51. return GraphicsFormat.R16G16B16A16_SFloat; // fallback
  52. else
  53. return GraphicsFormat.R32G32B32A32_SFloat; // fallback
  54. }
  55. /// <summary>
  56. /// Configures the pass.
  57. /// </summary>
  58. /// <param name="depthHandle">The <c>RTHandle</c> used to render depth to.</param>
  59. /// <param name="normalHandle">The <c>RTHandle</c> used to render normals.</param>
  60. /// <seealso cref="RTHandle"/>
  61. public void Setup(RTHandle depthHandle, RTHandle normalHandle)
  62. {
  63. this.depthHandle = depthHandle;
  64. this.normalHandle = normalHandle;
  65. enableRenderingLayers = false;
  66. }
  67. /// <summary>
  68. /// Configure the pass
  69. /// </summary>
  70. /// <param name="depthHandle">The <c>RTHandle</c> used to render depth to.</param>
  71. /// <param name="normalHandle">The <c>RTHandle</c> used to render normals.</param>
  72. /// <param name="decalLayerHandle">The <c>RTHandle</c> used to render decals.</param>
  73. public void Setup(RTHandle depthHandle, RTHandle normalHandle, RTHandle decalLayerHandle)
  74. {
  75. Setup(depthHandle, normalHandle);
  76. renderingLayersHandle = decalLayerHandle;
  77. enableRenderingLayers = true;
  78. }
  79. /// <inheritdoc/>
  80. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  81. public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
  82. {
  83. RTHandle[] colorHandles;
  84. if (enableRenderingLayers)
  85. {
  86. k_ColorAttachment2[0] = normalHandle;
  87. k_ColorAttachment2[1] = renderingLayersHandle;
  88. colorHandles = k_ColorAttachment2;
  89. }
  90. else
  91. {
  92. k_ColorAttachment1[0] = normalHandle;
  93. colorHandles = k_ColorAttachment1;
  94. }
  95. // Disable obsolete warning for internal usage
  96. #pragma warning disable CS0618
  97. if (renderingData.cameraData.renderer.useDepthPriming && (renderingData.cameraData.renderType == CameraRenderType.Base || renderingData.cameraData.clearDepth))
  98. ConfigureTarget(colorHandles, renderingData.cameraData.renderer.cameraDepthTargetHandle);
  99. else
  100. ConfigureTarget(colorHandles, depthHandle);
  101. ConfigureClear(ClearFlag.All, Color.black);
  102. #pragma warning restore CS0618
  103. }
  104. private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList)
  105. {
  106. using (new ProfilingScope(cmd, ProfilingSampler.Get(URPProfileId.DepthNormalPrepass)))
  107. {
  108. // Enable Rendering Layers
  109. if (passData.enableRenderingLayers)
  110. cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, true);
  111. // Draw
  112. cmd.DrawRendererList(rendererList);
  113. // Clean up
  114. if (passData.enableRenderingLayers)
  115. cmd.SetKeyword(ShaderGlobalKeywords.WriteRenderingLayers, false);
  116. }
  117. }
  118. /// <inheritdoc/>
  119. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  120. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  121. {
  122. ContextContainer frameData = renderingData.frameData;
  123. UniversalRenderingData universalRenderingData = frameData.Get<UniversalRenderingData>();
  124. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  125. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  126. m_PassData.enableRenderingLayers = enableRenderingLayers;
  127. var param = InitRendererListParams(universalRenderingData, cameraData,lightData);
  128. var rendererList = context.CreateRendererList(ref param);
  129. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList);
  130. }
  131. /// <inheritdoc/>
  132. public override void OnCameraCleanup(CommandBuffer cmd)
  133. {
  134. if (cmd == null)
  135. {
  136. throw new ArgumentNullException("cmd");
  137. }
  138. normalHandle = null;
  139. depthHandle = null;
  140. renderingLayersHandle = null;
  141. // This needs to be reset as the renderer might change this in runtime (UUM-36069)
  142. shaderTagIds = k_DepthNormals;
  143. }
  144. /// <summary>
  145. /// Shared pass data
  146. /// </summary>
  147. private class PassData
  148. {
  149. internal TextureHandle cameraDepthTexture;
  150. internal TextureHandle cameraNormalsTexture;
  151. internal bool enableRenderingLayers;
  152. internal RenderingLayerUtils.MaskSize maskSize;
  153. internal RendererListHandle rendererList;
  154. }
  155. private RendererListParams InitRendererListParams(UniversalRenderingData renderingData, UniversalCameraData cameraData, UniversalLightData lightData)
  156. {
  157. var sortFlags = cameraData.defaultOpaqueSortFlags;
  158. var drawSettings = RenderingUtils.CreateDrawingSettings(this.shaderTagIds, renderingData, cameraData, lightData, sortFlags);
  159. drawSettings.perObjectData = PerObjectData.None;
  160. return new RendererListParams(renderingData.cullResults, drawSettings, m_FilteringSettings);
  161. }
  162. internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle cameraNormalsTexture, TextureHandle cameraDepthTexture, TextureHandle renderingLayersTexture, uint batchLayerMask = uint.MaxValue, bool postSetGlobalTextures = true)
  163. {
  164. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  165. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  166. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  167. using (var builder = renderGraph.AddRasterRenderPass<PassData>("Draw DepthNormals Prepass", out var passData, base.profilingSampler))
  168. {
  169. passData.cameraNormalsTexture = cameraNormalsTexture;
  170. builder.SetRenderAttachment(cameraNormalsTexture, 0, AccessFlags.Write);
  171. passData.cameraDepthTexture = cameraDepthTexture;
  172. builder.SetRenderAttachmentDepth(cameraDepthTexture, AccessFlags.Write);
  173. passData.enableRenderingLayers = enableRenderingLayers;
  174. if (passData.enableRenderingLayers)
  175. {
  176. builder.SetRenderAttachment(renderingLayersTexture, 1, AccessFlags.Write);
  177. passData.maskSize = renderingLayersMaskSize;
  178. }
  179. var param = InitRendererListParams(renderingData, cameraData, lightData);
  180. param.filteringSettings.batchLayerMask = batchLayerMask;
  181. passData.rendererList = renderGraph.CreateRendererList(param);
  182. builder.UseRendererList(passData.rendererList);
  183. if (cameraData.xr.enabled)
  184. builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && cameraData.xrUniversal.canFoveateIntermediatePasses);
  185. UniversalRenderer universalRenderer = cameraData.renderer as UniversalRenderer;
  186. if (postSetGlobalTextures && universalRenderer != null)
  187. {
  188. var renderingMode = universalRenderer.renderingModeActual;
  189. if (cameraNormalsTexture.IsValid() && renderingMode != RenderingMode.Deferred)
  190. builder.SetGlobalTextureAfterPass(cameraNormalsTexture, Shader.PropertyToID("_CameraNormalsTexture"));
  191. if (cameraDepthTexture.IsValid() && renderingMode != RenderingMode.Deferred)
  192. builder.SetGlobalTextureAfterPass(cameraDepthTexture, Shader.PropertyToID("_CameraDepthTexture"));
  193. }
  194. // TODO RENDERGRAPH: culling? force culling off for testing
  195. builder.AllowPassCulling(false);
  196. // Required here because of RenderingLayerUtils.SetupProperties
  197. builder.AllowGlobalStateModification(true);
  198. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  199. {
  200. RenderingLayerUtils.SetupProperties(context.cmd, data.maskSize);
  201. ExecutePass(context.cmd, data, data.rendererList);
  202. });
  203. }
  204. }
  205. }
  206. }