Без опису
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

XROcclusionMeshPass.cs 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #if ENABLE_VR && ENABLE_XR_MODULE
  2. using System;
  3. using UnityEngine.Rendering.RenderGraphModule;
  4. using UnityEngine.Experimental.Rendering;
  5. namespace UnityEngine.Rendering.Universal
  6. {
  7. /// <summary>
  8. /// Draw the XR occlusion mesh into the current depth buffer when XR is enabled.
  9. /// </summary>
  10. public class XROcclusionMeshPass : ScriptableRenderPass
  11. {
  12. PassData m_PassData;
  13. /// <summary>
  14. /// Used to indicate if the active target of the pass is the back buffer
  15. /// </summary>
  16. public bool m_IsActiveTargetBackBuffer; // TODO: Remove this when we remove non-RG path
  17. public XROcclusionMeshPass(RenderPassEvent evt)
  18. {
  19. base.profilingSampler = new ProfilingSampler(nameof(XROcclusionMeshPass));
  20. renderPassEvent = evt;
  21. m_PassData = new PassData();
  22. m_IsActiveTargetBackBuffer = false;
  23. }
  24. private static void ExecutePass(RasterCommandBuffer cmd, PassData data)
  25. {
  26. if (data.xr.hasValidOcclusionMesh)
  27. {
  28. if (data.isActiveTargetBackBuffer)
  29. cmd.SetViewport(data.xr.GetViewport());
  30. data.xr.RenderOcclusionMesh(cmd, renderIntoTexture: !data.isActiveTargetBackBuffer);
  31. }
  32. }
  33. /// <inheritdoc/>
  34. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  35. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  36. {
  37. m_PassData.xr = renderingData.cameraData.xr;
  38. m_PassData.isActiveTargetBackBuffer = m_IsActiveTargetBackBuffer;
  39. ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData);
  40. }
  41. private class PassData
  42. {
  43. internal XRPass xr;
  44. internal TextureHandle cameraColorAttachment;
  45. internal TextureHandle cameraDepthAttachment;
  46. internal bool isActiveTargetBackBuffer;
  47. }
  48. internal void Render(RenderGraph renderGraph, ContextContainer frameData, in TextureHandle cameraColorAttachment, in TextureHandle cameraDepthAttachment)
  49. {
  50. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  51. UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
  52. using (var builder = renderGraph.AddRasterRenderPass<PassData>("XR Occlusion Pass", out var passData, base.profilingSampler))
  53. {
  54. passData.xr = cameraData.xr;
  55. passData.cameraColorAttachment = cameraColorAttachment;
  56. builder.SetRenderAttachment(cameraColorAttachment, 0);
  57. passData.cameraDepthAttachment = cameraDepthAttachment;
  58. builder.SetRenderAttachmentDepth(cameraDepthAttachment, AccessFlags.Write);
  59. passData.isActiveTargetBackBuffer = resourceData.isActiveTargetBackBuffer;
  60. // TODO RENDERGRAPH: culling? force culling off for testing
  61. builder.AllowPassCulling(false);
  62. builder.AllowGlobalStateModification(true);
  63. if (cameraData.xr.enabled)
  64. {
  65. bool passSupportsFoveation = cameraData.xrUniversal.canFoveateIntermediatePasses || resourceData.isActiveTargetBackBuffer;
  66. builder.EnableFoveatedRasterization(cameraData.xr.supportsFoveatedRendering && passSupportsFoveation);
  67. }
  68. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  69. {
  70. ExecutePass(context.cmd, data);
  71. });
  72. return;
  73. }
  74. }
  75. }
  76. }
  77. #endif