Nessuna descrizione
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.

ComputeRayTracingShader.cs 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using Unity.Mathematics;
  2. using UnityEngine.Assertions;
  3. namespace UnityEngine.Rendering.UnifiedRayTracing
  4. {
  5. internal class ComputeRayTracingShader : IRayTracingShader
  6. {
  7. ComputeShader m_Shader;
  8. int m_KernelIndex;
  9. uint3 m_ThreadGroupSizes;
  10. private GraphicsBuffer m_DispatchBuffer; // This is a buffer to hold dispatch arguments when using non indirect dispatch
  11. internal ComputeRayTracingShader(ComputeShader shader, string dispatchFuncName, GraphicsBuffer dispatchBuffer)
  12. {
  13. m_Shader = shader;
  14. m_KernelIndex = m_Shader.FindKernel(dispatchFuncName);
  15. m_Shader.GetKernelThreadGroupSizes(m_KernelIndex,
  16. out m_ThreadGroupSizes.x, out m_ThreadGroupSizes.y, out m_ThreadGroupSizes.z);
  17. m_DispatchBuffer = dispatchBuffer;
  18. }
  19. public uint3 GetThreadGroupSizes()
  20. {
  21. return m_ThreadGroupSizes;
  22. }
  23. public void PopulateDispatchDimensionBuffer(CommandBuffer cmd, GraphicsBuffer dispatchDimensionsBuffer, uint3 dimensions)
  24. {
  25. Assert.IsTrue((dispatchDimensionsBuffer.target & GraphicsBuffer.Target.IndirectArguments) != 0);
  26. Assert.IsTrue((dispatchDimensionsBuffer.target & GraphicsBuffer.Target.Structured) != 0);
  27. Assert.IsTrue(dispatchDimensionsBuffer.count * dispatchDimensionsBuffer.stride == 24);
  28. uint3 workgroups = GraphicsHelpers.DivUp(dimensions, m_ThreadGroupSizes);
  29. cmd.SetBufferData(dispatchDimensionsBuffer, new uint[] { dimensions.x, dimensions.y, dimensions.z, workgroups.x, workgroups.y, workgroups.z });
  30. }
  31. public void SetAccelerationStructure(CommandBuffer cmd, string name, IRayTracingAccelStruct accelStruct)
  32. {
  33. var computeAccelStruct = accelStruct as ComputeRayTracingAccelStruct;
  34. Assert.IsNotNull(computeAccelStruct);
  35. computeAccelStruct.Bind(cmd, name, this);
  36. }
  37. public void SetIntParam(CommandBuffer cmd, int nameID, int val)
  38. {
  39. cmd.SetComputeIntParam(m_Shader, nameID, val);
  40. }
  41. public void SetFloatParam(CommandBuffer cmd, int nameID, float val)
  42. {
  43. cmd.SetComputeFloatParam(m_Shader, nameID, val);
  44. }
  45. public void SetVectorParam(CommandBuffer cmd, int nameID, Vector4 val)
  46. {
  47. cmd.SetComputeVectorParam(m_Shader, nameID, val);
  48. }
  49. public void SetMatrixParam(CommandBuffer cmd, int nameID, Matrix4x4 val)
  50. {
  51. cmd.SetComputeMatrixParam(m_Shader, nameID, val);
  52. }
  53. public void SetTextureParam(CommandBuffer cmd, int nameID, RenderTargetIdentifier rt)
  54. {
  55. cmd.SetComputeTextureParam(m_Shader, m_KernelIndex, nameID, rt);
  56. }
  57. public void SetBufferParam(CommandBuffer cmd, int nameID, GraphicsBuffer buffer)
  58. {
  59. cmd.SetComputeBufferParam(m_Shader, m_KernelIndex, nameID, buffer);
  60. }
  61. public void SetBufferParam(CommandBuffer cmd, int nameID, ComputeBuffer buffer)
  62. {
  63. cmd.SetComputeBufferParam(m_Shader, m_KernelIndex, nameID, buffer);
  64. }
  65. public void Dispatch(CommandBuffer cmd, GraphicsBuffer scratchBuffer, uint width, uint height, uint depth)
  66. {
  67. var requiredScratchSize = GetTraceScratchBufferRequiredSizeInBytes(width, height, depth);
  68. if (requiredScratchSize > 0 && (scratchBuffer == null || ((ulong)(scratchBuffer.count * scratchBuffer.stride) < requiredScratchSize)))
  69. {
  70. throw new System.ArgumentException("scratchBuffer size is too small");
  71. }
  72. if (requiredScratchSize > 0 && scratchBuffer.stride != 4)
  73. {
  74. throw new System.ArgumentException("scratchBuffer stride must be 4");
  75. }
  76. cmd.SetComputeBufferParam(m_Shader, m_KernelIndex, RadeonRays.SID.g_stack, scratchBuffer);
  77. uint workgroupsX = (uint)GraphicsHelpers.DivUp((int)width, m_ThreadGroupSizes.x);
  78. uint workgroupsY = (uint)GraphicsHelpers.DivUp((int)height, m_ThreadGroupSizes.y);
  79. uint workgroupsZ = (uint)GraphicsHelpers.DivUp((int)depth, m_ThreadGroupSizes.z);
  80. PopulateDispatchDimensionBuffer(cmd, m_DispatchBuffer, new uint3(width, height, depth));
  81. SetBufferParam(cmd, RadeonRays.SID.g_dispatch_dimensions, m_DispatchBuffer);
  82. cmd.DispatchCompute(m_Shader, m_KernelIndex, (int)workgroupsX, (int)workgroupsY, (int)workgroupsZ);
  83. }
  84. public ulong GetTraceScratchBufferRequiredSizeInBytes(uint width, uint height, uint depth)
  85. {
  86. uint rayCount = width * height * depth;
  87. return (RadeonRays.RadeonRaysAPI.GetTraceMemoryRequirements(rayCount) * 4);
  88. }
  89. public void Dispatch(CommandBuffer cmd, GraphicsBuffer scratchBuffer, GraphicsBuffer argsBuffer)
  90. {
  91. Assert.IsTrue((argsBuffer.target & GraphicsBuffer.Target.IndirectArguments) != 0);
  92. Assert.IsTrue((argsBuffer.target & GraphicsBuffer.Target.Structured) != 0);
  93. Assert.IsTrue(argsBuffer.count * argsBuffer.stride == 24);
  94. cmd.SetComputeBufferParam(m_Shader, m_KernelIndex, RadeonRays.SID.g_stack, scratchBuffer);
  95. SetBufferParam(cmd, RadeonRays.SID.g_dispatch_dimensions, argsBuffer);
  96. cmd.DispatchCompute(m_Shader, m_KernelIndex, argsBuffer, RayTracingHelper.k_GroupSizeByteOffset);
  97. }
  98. }
  99. }