Aucune description
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

DrawSkyboxPass.cs 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using System;
  2. using UnityEngine.Rendering.RenderGraphModule;
  3. using UnityEngine.Experimental.Rendering;
  4. using UnityEngine.Rendering.Universal.Internal;
  5. namespace UnityEngine.Rendering.Universal
  6. {
  7. /// <summary>
  8. /// Draw the skybox into the given color buffer using the given depth buffer for depth testing.
  9. ///
  10. /// This pass renders the standard Unity skybox.
  11. /// </summary>
  12. public class DrawSkyboxPass : ScriptableRenderPass
  13. {
  14. static readonly int s_CameraDepthTextureID = Shader.PropertyToID("_CameraDepthTexture");
  15. /// <summary>
  16. /// Creates a new <c>DrawSkyboxPass</c> instance.
  17. /// </summary>
  18. /// <param name="evt">The <c>RenderPassEvent</c> to use.</param>
  19. /// <seealso cref="RenderPassEvent"/>
  20. public DrawSkyboxPass(RenderPassEvent evt)
  21. {
  22. base.profilingSampler = new ProfilingSampler("Draw Skybox");
  23. renderPassEvent = evt;
  24. }
  25. /// <inheritdoc/>
  26. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  27. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  28. {
  29. UniversalCameraData cameraData = renderingData.frameData.Get<UniversalCameraData>();
  30. var activeDebugHandler = GetActiveDebugHandler(cameraData);
  31. if (activeDebugHandler != null)
  32. {
  33. // TODO: The skybox needs to work the same as the other shaders, but until it does we'll not render it
  34. // when certain debug modes are active (e.g. wireframe/overdraw modes)
  35. if (activeDebugHandler.IsScreenClearNeeded)
  36. {
  37. return;
  38. }
  39. }
  40. var skyRendererList = CreateSkyboxRendererList(context, cameraData);
  41. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), cameraData.xr, skyRendererList);
  42. }
  43. // For non-RG path
  44. private RendererList CreateSkyboxRendererList(ScriptableRenderContext context, UniversalCameraData cameraData)
  45. {
  46. var skyRendererList = new RendererList();
  47. #if ENABLE_VR && ENABLE_XR_MODULE
  48. if (cameraData.xr.enabled)
  49. {
  50. // Setup Legacy XR buffer states
  51. if (cameraData.xr.singlePassEnabled)
  52. {
  53. skyRendererList = context.CreateSkyboxRendererList(cameraData.camera,
  54. cameraData.GetProjectionMatrix(0), cameraData.GetViewMatrix(0),
  55. cameraData.GetProjectionMatrix(1), cameraData.GetViewMatrix(1));
  56. }
  57. else
  58. {
  59. skyRendererList = context.CreateSkyboxRendererList(cameraData.camera, cameraData.GetProjectionMatrix(0), cameraData.GetViewMatrix(0));
  60. }
  61. }
  62. else
  63. #endif
  64. {
  65. skyRendererList = context.CreateSkyboxRendererList(cameraData.camera);
  66. }
  67. return skyRendererList;
  68. }
  69. // For RG path
  70. private RendererListHandle CreateSkyBoxRendererList(RenderGraph renderGraph, UniversalCameraData cameraData)
  71. {
  72. var skyRendererListHandle = new RendererListHandle();
  73. #if ENABLE_VR && ENABLE_XR_MODULE
  74. if (cameraData.xr.enabled)
  75. {
  76. // Setup Legacy XR buffer states
  77. if (cameraData.xr.singlePassEnabled)
  78. {
  79. skyRendererListHandle = renderGraph.CreateSkyboxRendererList(cameraData.camera,
  80. cameraData.GetProjectionMatrix(0), cameraData.GetViewMatrix(0),
  81. cameraData.GetProjectionMatrix(1), cameraData.GetViewMatrix(1));
  82. }
  83. else
  84. {
  85. skyRendererListHandle = renderGraph.CreateSkyboxRendererList(cameraData.camera, cameraData.GetProjectionMatrix(0), cameraData.GetViewMatrix(0));
  86. }
  87. }
  88. else
  89. #endif
  90. {
  91. skyRendererListHandle = renderGraph.CreateSkyboxRendererList(cameraData.camera);
  92. }
  93. return skyRendererListHandle;
  94. }
  95. private static void ExecutePass(RasterCommandBuffer cmd, XRPass xr, RendererList rendererList)
  96. {
  97. #if ENABLE_VR && ENABLE_XR_MODULE
  98. if (xr.enabled && xr.singlePassEnabled)
  99. cmd.SetSinglePassStereo(SystemInfo.supportsMultiview ? SinglePassStereoMode.Multiview : SinglePassStereoMode.Instancing);
  100. #endif
  101. cmd.DrawRendererList(rendererList);
  102. #if ENABLE_VR && ENABLE_XR_MODULE
  103. if (xr.enabled && xr.singlePassEnabled)
  104. cmd.SetSinglePassStereo(SinglePassStereoMode.None);
  105. #endif
  106. }
  107. // All the rest below is Render Graph specific
  108. private class PassData
  109. {
  110. internal XRPass xr;
  111. internal RendererListHandle skyRendererListHandle;
  112. internal TextureHandle cameraDepthTexture;
  113. internal Material material;
  114. }
  115. private void InitPassData(ref PassData passData, in XRPass xr, in RendererListHandle handle)
  116. {
  117. passData.xr = xr;
  118. passData.skyRendererListHandle = handle;
  119. }
  120. internal void Render(RenderGraph renderGraph, ContextContainer frameData, ScriptableRenderContext context, TextureHandle colorTarget, TextureHandle depthTarget, Material skyboxMaterial, bool hasDepthCopy = false)
  121. {
  122. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  123. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  124. var activeDebugHandler = GetActiveDebugHandler(cameraData);
  125. if (activeDebugHandler != null)
  126. {
  127. // TODO: The skybox needs to work the same as the other shaders, but until it does we'll not render it
  128. // when certain debug modes are active (e.g. wireframe/overdraw modes)
  129. if (activeDebugHandler.IsScreenClearNeeded)
  130. {
  131. return;
  132. }
  133. }
  134. using (var builder = renderGraph.AddRasterRenderPass<PassData>(profilingSampler.name, out var passData, profilingSampler))
  135. {
  136. var skyRendererListHandle = CreateSkyBoxRendererList(renderGraph, cameraData);
  137. InitPassData(ref passData, cameraData.xr, skyRendererListHandle);
  138. passData.material = skyboxMaterial;
  139. builder.UseRendererList(skyRendererListHandle);
  140. builder.SetRenderAttachment(colorTarget, 0, AccessFlags.Write);
  141. builder.SetRenderAttachmentDepth(depthTarget, AccessFlags.Write);
  142. UniversalRenderer renderer = cameraData.renderer as UniversalRenderer;
  143. if (hasDepthCopy && resourceData.cameraDepthTexture.IsValid())
  144. {
  145. if (renderer.renderingModeActual != RenderingMode.Deferred)
  146. {
  147. builder.UseGlobalTexture(s_CameraDepthTextureID);
  148. passData.cameraDepthTexture = resourceData.cameraDepthTexture;
  149. }
  150. else if (renderer.deferredLights.GbufferDepthIndex != -1)
  151. {
  152. builder.UseTexture(resourceData.gBuffer[renderer.deferredLights.GbufferDepthIndex]);
  153. passData.cameraDepthTexture = resourceData.gBuffer[renderer.deferredLights.GbufferDepthIndex];
  154. }
  155. }
  156. builder.AllowPassCulling(false);
  157. if (cameraData.xr.enabled)
  158. {
  159. bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
  160. builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
  161. }
  162. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  163. {
  164. if(data.cameraDepthTexture.IsValid())
  165. data.material.SetTexture(s_CameraDepthTextureID, data.cameraDepthTexture);
  166. ExecutePass(context.cmd, data.xr, data.skyRendererListHandle);
  167. });
  168. }
  169. }
  170. }
  171. }