Няма описание
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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using UnityEngine.Experimental.GlobalIllumination;
  3. using UnityEngine.Profiling;
  4. using Unity.Collections;
  5. using UnityEngine.Rendering.RenderGraphModule;
  6. using UnityEngine.Experimental.Rendering;
  7. // cleanup code
  8. // listMinDepth and maxDepth should be stored in a different uniform block?
  9. // Point lights stored as vec4
  10. // RelLightIndices should be stored in ushort instead of uint.
  11. // TODO use Unity.Mathematics
  12. // TODO Check if there is a bitarray structure (with dynamic size) available in Unity
  13. namespace UnityEngine.Rendering.Universal.Internal
  14. {
  15. // Render all tiled-based deferred lights.
  16. internal class DeferredPass : ScriptableRenderPass
  17. {
  18. DeferredLights m_DeferredLights;
  19. public DeferredPass(RenderPassEvent evt, DeferredLights deferredLights)
  20. {
  21. base.profilingSampler = new ProfilingSampler("Render Deferred Lighting");
  22. base.renderPassEvent = evt;
  23. m_DeferredLights = deferredLights;
  24. }
  25. // ScriptableRenderPass
  26. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  27. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescripor)
  28. {
  29. var lightingAttachment = m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferLightingIndex];
  30. var depthAttachment = m_DeferredLights.DepthAttachmentHandle;
  31. if (m_DeferredLights.UseFramebufferFetch)
  32. {
  33. // Disable obsolete warning for internal usage
  34. #pragma warning disable CS0618
  35. ConfigureInputAttachments(m_DeferredLights.DeferredInputAttachments, m_DeferredLights.DeferredInputIsTransient);
  36. #pragma warning restore CS0618
  37. }
  38. // Disable obsolete warning for internal usage
  39. #pragma warning disable CS0618
  40. // TODO: Cannot currently bind depth texture as read-only!
  41. ConfigureTarget(lightingAttachment, depthAttachment);
  42. #pragma warning restore CS0618
  43. }
  44. // ScriptableRenderPass
  45. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  46. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  47. {
  48. ContextContainer frameData = renderingData.frameData;
  49. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  50. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  51. UniversalShadowData shadowData = frameData.Get<UniversalShadowData>();
  52. m_DeferredLights.ExecuteDeferredPass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), cameraData, lightData, shadowData);
  53. }
  54. private class PassData
  55. {
  56. internal UniversalCameraData cameraData;
  57. internal UniversalLightData lightData;
  58. internal UniversalShadowData shadowData;
  59. internal TextureHandle color;
  60. internal TextureHandle depth;
  61. internal TextureHandle[] gbuffer;
  62. internal DeferredLights deferredLights;
  63. }
  64. internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle color, TextureHandle depth, TextureHandle[] gbuffer)
  65. {
  66. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  67. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  68. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  69. UniversalShadowData shadowData = frameData.Get<UniversalShadowData>();
  70. using (var builder = renderGraph.AddRasterRenderPass<PassData>(base.profilingSampler.name, out var passData, base.profilingSampler))
  71. {
  72. passData.cameraData = cameraData;
  73. passData.lightData = lightData;
  74. passData.shadowData = shadowData;
  75. passData.color = color;
  76. builder.SetRenderAttachment(color, 0, AccessFlags.Write);
  77. passData.depth = depth;
  78. builder.SetRenderAttachmentDepth(depth, AccessFlags.Write);
  79. passData.deferredLights = m_DeferredLights;
  80. if (!m_DeferredLights.UseFramebufferFetch)
  81. {
  82. for (int i = 0; i < gbuffer.Length; ++i)
  83. {
  84. if (i != m_DeferredLights.GBufferLightingIndex)
  85. builder.UseTexture(gbuffer[i], AccessFlags.Read);
  86. }
  87. }
  88. else
  89. {
  90. var idx = 0;
  91. for (int i = 0; i < gbuffer.Length; ++i)
  92. {
  93. if (i != m_DeferredLights.GBufferLightingIndex)
  94. {
  95. builder.SetInputAttachment(gbuffer[i], idx, AccessFlags.Read);
  96. idx++;
  97. }
  98. }
  99. }
  100. builder.AllowPassCulling(false);
  101. builder.AllowGlobalStateModification(true);
  102. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  103. {
  104. data.deferredLights.ExecuteDeferredPass(context.cmd, data.cameraData, data.lightData, data.shadowData);
  105. });
  106. }
  107. }
  108. // ScriptableRenderPass
  109. public override void OnCameraCleanup(CommandBuffer cmd)
  110. {
  111. m_DeferredLights.OnCameraCleanup(cmd);
  112. }
  113. }
  114. }