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

HardwareRayTracingAccelStruct.cs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System.Collections.Generic;
  2. namespace UnityEngine.Rendering.UnifiedRayTracing
  3. {
  4. internal class HardwareRayTracingAccelStruct : IRayTracingAccelStruct
  5. {
  6. public RayTracingAccelerationStructure accelStruct { get; }
  7. internal AccelStructInstances instances { get { return m_Instances; } }
  8. Shader m_HWMaterialShader;
  9. Material m_RayTracingMaterial;
  10. AccelStructInstances m_Instances;
  11. RayTracingAccelerationStructureBuildFlags m_BuildFlags;
  12. // keep a reference to Meshes because RayTracingAccelerationStructure impl is to automatically
  13. // remove instances when the mesh is disposed
  14. Dictionary<int, Mesh> m_Meshes = new();
  15. ReferenceCounter m_Counter;
  16. internal HardwareRayTracingAccelStruct(AccelerationStructureOptions options, Shader hwMaterialShader, ReferenceCounter counter, bool enableCompaction)
  17. {
  18. m_HWMaterialShader = hwMaterialShader;
  19. LoadRayTracingMaterial();
  20. m_BuildFlags = (RayTracingAccelerationStructureBuildFlags)options.buildFlags;
  21. RayTracingAccelerationStructure.Settings settings = new RayTracingAccelerationStructure.Settings();
  22. settings.rayTracingModeMask = RayTracingAccelerationStructure.RayTracingModeMask.Everything;
  23. settings.managementMode = RayTracingAccelerationStructure.ManagementMode.Manual;
  24. settings.enableCompaction = enableCompaction;
  25. settings.layerMask = 255;
  26. settings.buildFlagsStaticGeometries = m_BuildFlags;
  27. accelStruct = new RayTracingAccelerationStructure(settings);
  28. m_Counter = counter;
  29. m_Counter.Inc();
  30. }
  31. public void Dispose()
  32. {
  33. m_Counter.Dec();
  34. accelStruct?.Dispose();
  35. if (m_RayTracingMaterial != null)
  36. Utils.Destroy(m_RayTracingMaterial);
  37. }
  38. public int AddInstance(MeshInstanceDesc meshInstance)
  39. {
  40. LoadRayTracingMaterial();
  41. var instanceDesc = new RayTracingMeshInstanceConfig(meshInstance.mesh, (uint)meshInstance.subMeshIndex, m_RayTracingMaterial);
  42. instanceDesc.mask = meshInstance.mask;
  43. instanceDesc.enableTriangleCulling = meshInstance.enableTriangleCulling;
  44. instanceDesc.frontTriangleCounterClockwise = meshInstance.frontTriangleCounterClockwise;
  45. int instanceHandle = accelStruct.AddInstance(instanceDesc, meshInstance.localToWorldMatrix, null, meshInstance.instanceID);
  46. m_Meshes.Add(instanceHandle, meshInstance.mesh);
  47. return instanceHandle;
  48. }
  49. public void RemoveInstance(int instanceHandle)
  50. {
  51. m_Meshes.Remove(instanceHandle);
  52. accelStruct.RemoveInstance(instanceHandle);
  53. }
  54. public void ClearInstances()
  55. {
  56. m_Meshes.Clear();
  57. accelStruct.ClearInstances();
  58. }
  59. public void UpdateInstanceTransform(int instanceHandle, Matrix4x4 localToWorldMatrix)
  60. {
  61. accelStruct.UpdateInstanceTransform(instanceHandle, localToWorldMatrix);
  62. }
  63. public void UpdateInstanceID(int instanceHandle, uint instanceID)
  64. {
  65. accelStruct.UpdateInstanceID(instanceHandle, instanceID);
  66. }
  67. public void UpdateInstanceMask(int instanceHandle, uint mask)
  68. {
  69. accelStruct.UpdateInstanceMask(instanceHandle, mask);
  70. }
  71. public void Build(CommandBuffer cmd, GraphicsBuffer scratchBuffer)
  72. {
  73. var buildSettings = new RayTracingAccelerationStructure.BuildSettings()
  74. {
  75. buildFlags = m_BuildFlags,
  76. relativeOrigin = Vector3.zero
  77. };
  78. cmd.BuildRayTracingAccelerationStructure(accelStruct, buildSettings);
  79. }
  80. public ulong GetBuildScratchBufferRequiredSizeInBytes()
  81. {
  82. // Unity's Hardware impl (RayTracingAccelerationStructure) does not require any scratchbuffers.
  83. // They are directly handled internally by the GfxDevice.
  84. return 0;
  85. }
  86. private void LoadRayTracingMaterial()
  87. {
  88. if (m_RayTracingMaterial == null)
  89. m_RayTracingMaterial = new Material(m_HWMaterialShader);
  90. }
  91. }
  92. }