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

ProbeVolumeDebugPass.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using UnityEngine.Experimental.Rendering;
  5. using UnityEngine.Rendering.RenderGraphModule;
  6. namespace UnityEngine.Rendering.Universal
  7. {
  8. /// <summary>
  9. /// Uses a compute shader to capture the depth and normal of the pixel under the cursor.
  10. /// </summary>
  11. internal partial class ProbeVolumeDebugPass : ScriptableRenderPass
  12. {
  13. ComputeShader m_ComputeShader;
  14. RTHandle m_DepthTexture;
  15. RTHandle m_NormalTexture;
  16. /// <summary>
  17. /// Creates a new <c>ProbeVolumeDebugPass</c> instance.
  18. /// </summary>
  19. public ProbeVolumeDebugPass(RenderPassEvent evt, ComputeShader computeShader)
  20. {
  21. base.profilingSampler = new ProfilingSampler(nameof(ProbeVolumeDebugPass));
  22. renderPassEvent = evt;
  23. m_ComputeShader = computeShader;
  24. }
  25. public void Setup(RTHandle depthBuffer, RTHandle normalBuffer)
  26. {
  27. m_DepthTexture = depthBuffer;
  28. m_NormalTexture = normalBuffer;
  29. }
  30. /// <inheritdoc/>
  31. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  32. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  33. {
  34. if (!ProbeReferenceVolume.instance.isInitialized)
  35. return;
  36. ref CameraData cameraData = ref renderingData.cameraData;
  37. if (ProbeReferenceVolume.instance.GetProbeSamplingDebugResources(cameraData.camera, out var resultBuffer, out Vector2 coords))
  38. {
  39. var cmd = renderingData.commandBuffer;
  40. int kernel = m_ComputeShader.FindKernel("ComputePositionNormal");
  41. cmd.SetComputeTextureParam(m_ComputeShader, kernel, "_CameraDepthTexture", m_DepthTexture);
  42. cmd.SetComputeTextureParam(m_ComputeShader, kernel, "_NormalBufferTexture", m_NormalTexture);
  43. cmd.SetComputeVectorParam(m_ComputeShader, "_positionSS", new Vector4(coords.x, coords.y, 0.0f, 0.0f));
  44. cmd.SetComputeBufferParam(m_ComputeShader, kernel, "_ResultBuffer", resultBuffer);
  45. cmd.DispatchCompute(m_ComputeShader, kernel, 1, 1, 1);
  46. }
  47. }
  48. class WriteApvData
  49. {
  50. public ComputeShader computeShader;
  51. public BufferHandle resultBuffer;
  52. public Vector2 clickCoordinates;
  53. public TextureHandle depthBuffer;
  54. public TextureHandle normalBuffer;
  55. }
  56. /// <summary>
  57. /// Render graph entry point
  58. /// </summary>
  59. /// <param name="renderGraph"></param>
  60. /// <param name="renderingData"></param>
  61. /// <param name="depthPyramidBuffer"></param>
  62. /// <param name="normalBuffer"></param>
  63. internal void Render(RenderGraph renderGraph, ContextContainer frameData, TextureHandle depthPyramidBuffer, TextureHandle normalBuffer)
  64. {
  65. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  66. if (!ProbeReferenceVolume.instance.isInitialized)
  67. return;
  68. if (ProbeReferenceVolume.instance.GetProbeSamplingDebugResources(cameraData.camera, out var resultBuffer, out Vector2 coords))
  69. {
  70. using (var builder = renderGraph.AddComputePass<WriteApvData>("APV Debug", out var passData, base.profilingSampler))
  71. {
  72. passData.clickCoordinates = coords;
  73. passData.computeShader = m_ComputeShader;
  74. passData.resultBuffer = renderGraph.ImportBuffer(resultBuffer);
  75. passData.depthBuffer = depthPyramidBuffer;
  76. passData.normalBuffer = normalBuffer;
  77. builder.UseBuffer(passData.resultBuffer, AccessFlags.Write);
  78. builder.UseTexture(passData.depthBuffer, AccessFlags.Read);
  79. builder.UseTexture(passData.normalBuffer, AccessFlags.Read);
  80. builder.SetRenderFunc((WriteApvData data, ComputeGraphContext ctx) =>
  81. {
  82. int kernel = data.computeShader.FindKernel("ComputePositionNormal");
  83. ctx.cmd.SetComputeTextureParam(data.computeShader, kernel, "_CameraDepthTexture", data.depthBuffer);
  84. ctx.cmd.SetComputeTextureParam(data.computeShader, kernel, "_NormalBufferTexture", data.normalBuffer);
  85. ctx.cmd.SetComputeVectorParam(data.computeShader, "_positionSS", new Vector4(data.clickCoordinates.x, data.clickCoordinates.y, 0.0f, 0.0f));
  86. ctx.cmd.SetComputeBufferParam(data.computeShader, kernel, "_ResultBuffer", data.resultBuffer);
  87. ctx.cmd.DispatchCompute(data.computeShader, kernel, 1, 1, 1);
  88. });
  89. }
  90. }
  91. }
  92. }
  93. }