DiffuseProbeGrid.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <Atom/RHI/DrawPacketBuilder.h>
  10. #include <Atom/RHI/RayTracingAccelerationStructure.h>
  11. #include <Atom/RPI.Public/Culling.h>
  12. #include <Atom/RPI.Public/PipelineState.h>
  13. #include <Atom/RPI.Public/Scene.h>
  14. #include <AzCore/Math/Random.h>
  15. #include <AzCore/Math/Aabb.h>
  16. #include <Render/DiffuseProbeGridTextureReadback.h>
  17. namespace AZ
  18. {
  19. namespace Render
  20. {
  21. class DiffuseProbeGridFeatureProcessor;
  22. struct DiffuseProbeGridRenderData
  23. {
  24. static const RHI::Format RayTraceImageFormat = RHI::Format::R32G32B32A32_FLOAT;
  25. static const RHI::Format IrradianceImageFormat = RHI::Format::R16G16B16A16_FLOAT;
  26. static const RHI::Format DistanceImageFormat = RHI::Format::R32G32_FLOAT;
  27. static const RHI::Format ProbeDataImageFormat = RHI::Format::R16G16B16A16_FLOAT;
  28. static const uint32_t GridDataBufferSize = 112;
  29. RHI::Ptr<RHI::ImagePool> m_imagePool;
  30. RHI::Ptr<RHI::BufferPool> m_bufferPool;
  31. AZStd::array<RHI::StreamBufferView, 1> m_boxPositionBufferView;
  32. RHI::IndexBufferView m_boxIndexBufferView;
  33. uint32_t m_boxIndexCount = 0;
  34. // image views
  35. RHI::ImageViewDescriptor m_probeRayTraceImageViewDescriptor;
  36. RHI::ImageViewDescriptor m_probeIrradianceImageViewDescriptor;
  37. RHI::ImageViewDescriptor m_probeDistanceImageViewDescriptor;
  38. RHI::ImageViewDescriptor m_probeDataImageViewDescriptor;
  39. // buffer views
  40. RHI::BufferViewDescriptor m_gridDataBufferViewDescriptor;
  41. // render pipeline state
  42. RPI::Ptr<RPI::PipelineStateForDraw> m_pipelineState;
  43. // For the render Srg
  44. Data::Instance<RPI::Shader> m_shader;
  45. RHI::Ptr<RHI::ShaderResourceGroupLayout> m_srgLayout;
  46. // render drawlist tag
  47. RHI::DrawListTag m_drawListTag;
  48. // Srg input indices
  49. RHI::ShaderInputNameIndex m_prepareSrgGridDataNameIndex = "m_gridData";
  50. RHI::ShaderInputNameIndex m_prepareSrgGridDataInitializedNameIndex = "m_gridDataInitialized";
  51. RHI::ShaderInputNameIndex m_prepareSrgProbeGridOriginNameIndex = "m_probeGrid.origin";
  52. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeHysteresisNameIndex = "m_probeGrid.probeHysteresis";
  53. RHI::ShaderInputNameIndex m_prepareSrgProbeGridRotationNameIndex = "m_probeGrid.rotation";
  54. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeRayRotationNameIndex = "m_probeGrid.probeRayRotation";
  55. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeMaxRayDistanceNameIndex = "m_probeGrid.probeMaxRayDistance";
  56. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeNormalBiasNameIndex = "m_probeGrid.probeNormalBias";
  57. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeViewBiasNameIndex = "m_probeGrid.probeViewBias";
  58. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeDistanceExponentNameIndex = "m_probeGrid.probeDistanceExponent";
  59. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeSpacingNameIndex = "m_probeGrid.probeSpacing";
  60. RHI::ShaderInputNameIndex m_prepareSrgProbeGridPacked0NameIndex = "m_probeGrid.packed0";
  61. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeIrradianceEncodingGammaNameIndex = "m_probeGrid.probeIrradianceEncodingGamma";
  62. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeIrradianceThresholdNameIndex = "m_probeGrid.probeIrradianceThreshold";
  63. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeBrightnessThresholdNameIndex = "m_probeGrid.probeBrightnessThreshold";
  64. RHI::ShaderInputNameIndex m_prepareSrgProbeGridPacked1NameIndex = "m_probeGrid.packed1";
  65. RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeMinFrontfaceDistanceNameIndex = "m_probeGrid.probeMinFrontfaceDistance";
  66. RHI::ShaderInputNameIndex m_prepareSrgProbeGridPacked2NameIndex = "m_probeGrid.packed2";
  67. RHI::ShaderInputNameIndex m_prepareSrgProbeGridPacked3NameIndex = "m_probeGrid.packed3";
  68. RHI::ShaderInputNameIndex m_prepareSrgProbeGridPacked4NameIndex = "m_probeGrid.packed4";
  69. RHI::ShaderInputNameIndex m_rayTraceSrgGridDataNameIndex = "m_gridData";
  70. RHI::ShaderInputNameIndex m_rayTraceSrgProbeRayTraceNameIndex = "m_probeRayTrace";
  71. RHI::ShaderInputNameIndex m_rayTraceSrgProbeIrradianceNameIndex = "m_probeIrradiance";
  72. RHI::ShaderInputNameIndex m_rayTraceSrgProbeDistanceNameIndex = "m_probeDistance";
  73. RHI::ShaderInputNameIndex m_rayTraceSrgProbeDataNameIndex = "m_probeData";
  74. RHI::ShaderInputNameIndex m_rayTraceSrgAmbientMultiplierNameIndex = "m_ambientMultiplier";
  75. RHI::ShaderInputNameIndex m_rayTraceSrgGiShadowsNameIndex = "m_giShadows";
  76. RHI::ShaderInputNameIndex m_rayTraceSrgUseDiffuseIblNameIndex = "m_useDiffuseIbl";
  77. RHI::ShaderInputNameIndex m_rayTraceSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
  78. RHI::ShaderInputNameIndex m_rayTraceSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
  79. RHI::ShaderInputNameIndex m_rayTraceSrgTransparencyModeNameIndex = "m_transparencyMode";
  80. RHI::ShaderInputNameIndex m_rayTraceSrgEmissiveMultiplierNameIndex = "m_emissiveMultiplier";
  81. RHI::ShaderInputNameIndex m_blendIrradianceSrgGridDataNameIndex = "m_gridData";
  82. RHI::ShaderInputNameIndex m_blendIrradianceSrgProbeRayTraceNameIndex = "m_probeRayTrace";
  83. RHI::ShaderInputNameIndex m_blendIrradianceSrgProbeIrradianceNameIndex = "m_probeIrradiance";
  84. RHI::ShaderInputNameIndex m_blendIrradianceSrgProbeDataNameIndex = "m_probeData";
  85. RHI::ShaderInputNameIndex m_blendIrradianceSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
  86. RHI::ShaderInputNameIndex m_blendIrradianceSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
  87. RHI::ShaderInputNameIndex m_blendDistanceSrgGridDataNameIndex = "m_gridData";
  88. RHI::ShaderInputNameIndex m_blendDistanceSrgProbeRayTraceNameIndex = "m_probeRayTrace";
  89. RHI::ShaderInputNameIndex m_blendDistanceSrgProbeDistanceNameIndex = "m_probeDistance";
  90. RHI::ShaderInputNameIndex m_blendDistanceSrgProbeDataNameIndex = "m_probeData";
  91. RHI::ShaderInputNameIndex m_blendDistanceSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
  92. RHI::ShaderInputNameIndex m_blendDistanceSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
  93. RHI::ShaderInputNameIndex m_borderUpdateRowIrradianceSrgProbeTextureNameIndex = "m_probeTexture";
  94. RHI::ShaderInputNameIndex m_borderUpdateRowIrradianceSrgNumTexelsNameIndex = "m_numTexels";
  95. RHI::ShaderInputNameIndex m_borderUpdateColumnIrradianceSrgProbeTextureNameIndex = "m_probeTexture";
  96. RHI::ShaderInputNameIndex m_borderUpdateColumnIrradianceSrgNumTexelsNameIndex = "m_numTexels";
  97. RHI::ShaderInputNameIndex m_borderUpdateRowDistanceSrgProbeTextureNameIndex = "m_probeTexture";
  98. RHI::ShaderInputNameIndex m_borderUpdateRowDistanceSrgNumTexelsNameIndex = "m_numTexels";
  99. RHI::ShaderInputNameIndex m_borderUpdateColumnDistanceSrgProbeTextureNameIndex = "m_probeTexture";
  100. RHI::ShaderInputNameIndex m_borderUpdateColumnDistanceSrgNumTexelsNameIndex = "m_numTexels";
  101. RHI::ShaderInputNameIndex m_relocationSrgGridDataNameIndex = "m_gridData";
  102. RHI::ShaderInputNameIndex m_relocationSrgProbeRayTraceNameIndex = "m_probeRayTrace";
  103. RHI::ShaderInputNameIndex m_relocationSrgProbeDataNameIndex = "m_probeData";
  104. RHI::ShaderInputNameIndex m_relocationSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
  105. RHI::ShaderInputNameIndex m_relocationSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
  106. RHI::ShaderInputNameIndex m_classificationSrgGridDataNameIndex = "m_gridData";
  107. RHI::ShaderInputNameIndex m_classificationSrgProbeRayTraceNameIndex = "m_probeRayTrace";
  108. RHI::ShaderInputNameIndex m_classificationSrgProbeDataNameIndex = "m_probeData";
  109. RHI::ShaderInputNameIndex m_classificationSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
  110. RHI::ShaderInputNameIndex m_classificationSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
  111. RHI::ShaderInputNameIndex m_renderSrgGridDataNameIndex = "m_gridData";
  112. RHI::ShaderInputNameIndex m_renderSrgModelToWorldNameIndex = "m_modelToWorld";
  113. RHI::ShaderInputNameIndex m_renderSrgModelToWorldInverseNameIndex = "m_modelToWorldInverse";
  114. RHI::ShaderInputNameIndex m_renderSrgObbHalfLengthsNameIndex = "m_obbHalfLengths";
  115. RHI::ShaderInputNameIndex m_renderSrgEnableDiffuseGiNameIndex = "m_enableDiffuseGI";
  116. RHI::ShaderInputNameIndex m_renderSrgAmbientMultiplierNameIndex = "m_ambientMultiplier";
  117. RHI::ShaderInputNameIndex m_renderSrgEdgeBlendIblNameIndex = "m_edgeBlendIbl";
  118. RHI::ShaderInputNameIndex m_renderSrgProbeIrradianceNameIndex = "m_probeIrradiance";
  119. RHI::ShaderInputNameIndex m_renderSrgProbeDistanceNameIndex = "m_probeDistance";
  120. RHI::ShaderInputNameIndex m_renderSrgProbeDataNameIndex = "m_probeData";
  121. RHI::ShaderInputNameIndex m_visualizationPrepareSrgTlasInstancesNameIndex = "m_tlasInstances";
  122. RHI::ShaderInputNameIndex m_visualizationPrepareSrgGridDataNameIndex = "m_gridData";
  123. RHI::ShaderInputNameIndex m_visualizationPrepareSrgProbeDataNameIndex = "m_probeData";
  124. RHI::ShaderInputNameIndex m_visualizationPrepareSrgProbeSphereRadiusNameIndex = "m_probeSphereRadius";
  125. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgTlasNameIndex = "m_tlas";
  126. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgGridDataNameIndex = "m_gridData";
  127. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgProbeIrradianceNameIndex = "m_probeIrradiance";
  128. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgProbeDistanceNameIndex = "m_probeDistance";
  129. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgProbeDataNameIndex = "m_probeData";
  130. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgShowInactiveProbesNameIndex = "m_showInactiveProbes";
  131. RHI::ShaderInputNameIndex m_visualizationRayTraceSrgOutputNameIndex = "m_output";
  132. RHI::ShaderInputNameIndex m_querySrgGridDataNameIndex = "m_gridData";
  133. RHI::ShaderInputNameIndex m_querySrgProbeIrradianceNameIndex = "m_probeIrradiance";
  134. RHI::ShaderInputNameIndex m_querySrgProbeDistanceNameIndex = "m_probeDistance";
  135. RHI::ShaderInputNameIndex m_querySrgProbeDataNameIndex = "m_probeData";
  136. RHI::ShaderInputNameIndex m_querySrgAmbientMultiplierNameIndex = "m_ambientMultiplier";
  137. };
  138. //! This class manages contains the functionality necessary to update diffuse probes and
  139. //! generate diffuse global illumination.
  140. class DiffuseProbeGrid final
  141. {
  142. public:
  143. DiffuseProbeGrid();
  144. ~DiffuseProbeGrid();
  145. void Init(RPI::Scene* scene, DiffuseProbeGridRenderData* diffuseProbeGridRenderData);
  146. void Simulate(uint32_t probeIndex);
  147. void SetTransform(const AZ::Transform& transform);
  148. bool ValidateExtents(const AZ::Vector3& newExtents);
  149. const AZ::Vector3& GetExtents() const { return m_extents; }
  150. void SetExtents(const AZ::Vector3& extents);
  151. const AZ::Obb& GetObbWs() const { return m_obbWs; }
  152. bool ValidateProbeSpacing(const AZ::Vector3& newSpacing);
  153. const AZ::Vector3& GetProbeSpacing() const { return m_probeSpacing; }
  154. void SetProbeSpacing(const AZ::Vector3& probeSpacing);
  155. float GetNormalBias() const { return m_normalBias; }
  156. void SetNormalBias(float normalBias);
  157. float GetViewBias() const { return m_viewBias; }
  158. void SetViewBias(float viewBias);
  159. const DiffuseProbeGridNumRaysPerProbeEntry& GetNumRaysPerProbe() const { return DiffuseProbeGridNumRaysPerProbeArray[aznumeric_cast<uint32_t>(m_numRaysPerProbe)]; }
  160. void SetNumRaysPerProbe(DiffuseProbeGridNumRaysPerProbe numRaysPerProbe);
  161. float GetAmbientMultiplier() const { return m_ambientMultiplier; }
  162. void SetAmbientMultiplier(float ambientMultiplier);
  163. void Enable(bool enabled);
  164. bool GetGIShadows() const { return m_giShadows; }
  165. void SetGIShadows(bool giShadows) { m_giShadows = giShadows; }
  166. bool GetUseDiffuseIbl() const { return m_useDiffuseIbl; }
  167. void SetUseDiffuseIbl(bool useDiffuseIbl) { m_useDiffuseIbl = useDiffuseIbl; }
  168. DiffuseProbeGridMode GetMode() const { return m_mode; }
  169. void SetMode(DiffuseProbeGridMode mode);
  170. bool GetScrolling() const { return m_scrolling; }
  171. void SetScrolling(bool scrolling);
  172. bool GetEdgeBlendIbl() const { return m_edgeBlendIbl; }
  173. void SetEdgeBlendIbl(bool edgeBlendIbl);
  174. uint32_t GetFrameUpdateCount() const { return m_frameUpdateCount; }
  175. void SetFrameUpdateCount(uint32_t frameUpdateCount) { m_frameUpdateCount = frameUpdateCount; }
  176. uint32_t GetFrameUpdateIndex() const { return m_frameUpdateIndex; }
  177. DiffuseProbeGridTransparencyMode GetTransparencyMode() const { return m_transparencyMode; }
  178. void SetTransparencyMode(DiffuseProbeGridTransparencyMode transparencyMode) { m_transparencyMode = transparencyMode; }
  179. float GetEmissiveMultiplier() const { return m_emissiveMultiplier; }
  180. void SetEmissiveMultiplier(float emissiveMultiplier) { m_emissiveMultiplier = emissiveMultiplier; }
  181. bool GetVisualizationEnabled() const { return m_visualizationEnabled; }
  182. void SetVisualizationEnabled(bool visualizationEnabled);
  183. bool GetVisualizationShowInactiveProbes() const { return m_visualizationShowInactiveProbes; }
  184. void SetVisualizationShowInactiveProbes(bool visualizationShowInactiveProbes) { m_visualizationShowInactiveProbes = visualizationShowInactiveProbes; }
  185. float GetVisualizationSphereRadius() const { return m_visualizationSphereRadius; }
  186. void SetVisualizationSphereRadius(float visualizationSphereRadius);
  187. uint32_t GetRemainingRelocationIterations() const { return aznumeric_cast<uint32_t>(m_remainingRelocationIterations); }
  188. void DecrementRemainingRelocationIterations() { m_remainingRelocationIterations = AZStd::max(0, m_remainingRelocationIterations - 1); }
  189. void ResetRemainingRelocationIterations() { m_remainingRelocationIterations = DefaultNumRelocationIterations; }
  190. void ResetCullingVisibility();
  191. bool GetIsVisible() const;
  192. // compute total number of probes in the grid
  193. uint32_t GetTotalProbeCount() const;
  194. // compute probe counts for a 2D texture layout
  195. void GetTexture2DProbeCount(uint32_t& probeCountX, uint32_t& probeCountY) const;
  196. // Srgs
  197. const Data::Instance<RPI::ShaderResourceGroup>& GetPrepareSrg() const { return m_prepareSrg; }
  198. const Data::Instance<RPI::ShaderResourceGroup>& GetRayTraceSrg() const { return m_rayTraceSrg; }
  199. const Data::Instance<RPI::ShaderResourceGroup>& GetBlendIrradianceSrg() const { return m_blendIrradianceSrg; }
  200. const Data::Instance<RPI::ShaderResourceGroup>& GetBlendDistanceSrg() const { return m_blendDistanceSrg; }
  201. const Data::Instance<RPI::ShaderResourceGroup>& GetBorderUpdateRowIrradianceSrg() const { return m_borderUpdateRowIrradianceSrg; }
  202. const Data::Instance<RPI::ShaderResourceGroup>& GetBorderUpdateColumnIrradianceSrg() const { return m_borderUpdateColumnIrradianceSrg; }
  203. const Data::Instance<RPI::ShaderResourceGroup>& GetBorderUpdateRowDistanceSrg() const { return m_borderUpdateRowDistanceSrg; }
  204. const Data::Instance<RPI::ShaderResourceGroup>& GetBorderUpdateColumnDistanceSrg() const { return m_borderUpdateColumnDistanceSrg; }
  205. const Data::Instance<RPI::ShaderResourceGroup>& GetRelocationSrg() const { return m_relocationSrg; }
  206. const Data::Instance<RPI::ShaderResourceGroup>& GetClassificationSrg() const { return m_classificationSrg; }
  207. const Data::Instance<RPI::ShaderResourceGroup>& GetRenderObjectSrg() const { return m_renderObjectSrg; }
  208. const Data::Instance<RPI::ShaderResourceGroup>& GetVisualizationPrepareSrg() const { return m_visualizationPrepareSrg; }
  209. const Data::Instance<RPI::ShaderResourceGroup>& GetVisualizationRayTraceSrg() const { return m_visualizationRayTraceSrg; }
  210. const Data::Instance<RPI::ShaderResourceGroup>& GetQuerySrg() const { return m_querySrg; }
  211. // Srg updates
  212. void UpdatePrepareSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  213. void UpdateRayTraceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  214. void UpdateBlendIrradianceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  215. void UpdateBlendDistanceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  216. void UpdateBorderUpdateSrgs(const Data::Instance<RPI::Shader>& rowShader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& rowSrgLayout,
  217. const Data::Instance<RPI::Shader>& columnShader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& columnSrgLayout);
  218. void UpdateRelocationSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  219. void UpdateClassificationSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  220. void UpdateRenderObjectSrg();
  221. void UpdateVisualizationPrepareSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  222. void UpdateVisualizationRayTraceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout, const RHI::ImageView* outputImageView);
  223. void UpdateQuerySrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& srgLayout);
  224. // textures
  225. const RHI::Ptr<RHI::Image> GetRayTraceImage() { return m_rayTraceImage[m_currentImageIndex]; }
  226. const RHI::Ptr<RHI::Image> GetIrradianceImage() { return m_mode == DiffuseProbeGridMode::RealTime ? m_irradianceImage[m_currentImageIndex] : m_bakedIrradianceImage->GetRHIImage(); }
  227. const RHI::Ptr<RHI::Image> GetDistanceImage() { return m_mode == DiffuseProbeGridMode::RealTime ? m_distanceImage[m_currentImageIndex] : m_bakedDistanceImage->GetRHIImage(); }
  228. const RHI::Ptr<RHI::Image> GetProbeDataImage() { return m_mode == DiffuseProbeGridMode::RealTime ? m_probeDataImage[m_currentImageIndex] : m_bakedProbeDataImage->GetRHIImage(); }
  229. const RHI::Ptr<RHI::Buffer> GetGridDataBuffer() { return m_gridDataBuffer; }
  230. const AZStd::string& GetBakedIrradianceRelativePath() const { return m_bakedIrradianceRelativePath; }
  231. const AZStd::string& GetBakedDistanceRelativePath() const { return m_bakedDistanceRelativePath; }
  232. const AZStd::string& GetBakedProbeDataRelativePath() const { return m_bakedProbeDataRelativePath; }
  233. // attachment Ids
  234. const RHI::AttachmentId GetRayTraceImageAttachmentId() const { return m_rayTraceImageAttachmentId; }
  235. const RHI::AttachmentId GetIrradianceImageAttachmentId() const { return m_irradianceImageAttachmentId; }
  236. const RHI::AttachmentId GetDistanceImageAttachmentId() const { return m_distanceImageAttachmentId; }
  237. const RHI::AttachmentId GetProbeDataImageAttachmentId() const { return m_probeDataImageAttachmentId; }
  238. const RHI::AttachmentId GetGridDataBufferAttachmentId() const { return m_gridDataBufferAttachmentId; }
  239. const RHI::AttachmentId GetProbeVisualizationTlasAttachmentId() const { return m_visualizationTlasAttachmentId; }
  240. const RHI::AttachmentId GetProbeVisualizationTlasInstancesAttachmentId() const { return m_visualizationTlasInstancesAttachmentId; }
  241. const DiffuseProbeGridRenderData* GetRenderData() const { return m_renderData; }
  242. // the Irradiance, Distance, and ProbeData images need to be manually cleared after certain operations, e.g., changing the grid size
  243. bool GetTextureClearRequired() const { return m_textureClearRequired; }
  244. void ResetTextureClearRequired() { m_textureClearRequired = false; }
  245. // texture readback
  246. DiffuseProbeGridTextureReadback& GetTextureReadback() { return m_textureReadback; }
  247. void SetBakedTextures(const DiffuseProbeGridBakedTextures& bakedTextures);
  248. bool HasValidBakedTextures() const;
  249. static constexpr uint32_t DefaultNumIrradianceTexels = 6;
  250. static constexpr uint32_t DefaultNumDistanceTexels = 14;
  251. static constexpr int32_t DefaultNumRelocationIterations = 100;
  252. // visualization TLAS
  253. const RHI::Ptr<RHI::RayTracingTlas>& GetVisualizationTlas() const { return m_visualizationTlas; }
  254. RHI::Ptr<RHI::RayTracingTlas>& GetVisualizationTlas() { return m_visualizationTlas; }
  255. bool GetVisualizationTlasUpdateRequired() const;
  256. void ResetVisualizationTlasUpdateRequired() { m_visualizationTlasUpdateRequired = false; }
  257. // query
  258. bool ContainsPosition(const AZ::Vector3& position) const;
  259. private:
  260. // helper functions
  261. void UpdateTextures();
  262. void ComputeProbeCount(const AZ::Vector3& extents, const AZ::Vector3& probeSpacing, uint32_t& probeCountX, uint32_t& probeCountY, uint32_t& probeCountZ);
  263. bool ValidateProbeCount(const AZ::Vector3& extents, const AZ::Vector3& probeSpacing);
  264. void UpdateProbeCount();
  265. void UpdateCulling();
  266. // scene
  267. RPI::Scene* m_scene = nullptr;
  268. // probe grid transform
  269. AZ::Transform m_transform = AZ::Transform::CreateIdentity();
  270. // extents of the probe grid
  271. AZ::Vector3 m_extents = AZ::Vector3(0.0f, 0.0f, 0.0f);
  272. // expanded extents for rendering the volume
  273. AZ::Vector3 m_renderExtents = AZ::Vector3(0.0f, 0.0f, 0.0f);
  274. // probe grid OBB (world space), built from transform and extents
  275. AZ::Obb m_obbWs;
  276. // per-axis spacing of probes in the grid
  277. AZ::Vector3 m_probeSpacing = AZ::Vector3(0.0f, 0.0f, 0.0f);
  278. // per-axis number of probes in the grid
  279. uint32_t m_probeCountX = 0;
  280. uint32_t m_probeCountY = 0;
  281. uint32_t m_probeCountZ = 0;
  282. // grid settings
  283. bool m_enabled = true;
  284. float m_normalBias = DefaultDiffuseProbeGridNormalBias;
  285. float m_viewBias = DefaultDiffuseProbeGridViewBias;
  286. float m_probeMaxRayDistance = 30.0f;
  287. float m_probeDistanceExponent = 50.0f;
  288. float m_probeHysteresis = 0.95f;
  289. float m_probeIrradianceThreshold = 0.2f;
  290. float m_probeBrightnessThreshold = 1.0f;
  291. float m_probeIrradianceEncodingGamma = 5.0f;
  292. float m_probeMinFrontfaceDistance = 1.0f;
  293. float m_probeRandomRayBackfaceThreshold = 0.1f;
  294. float m_probeFixedRayBackfaceThreshold = 0.25f;
  295. float m_ambientMultiplier = DefaultDiffuseProbeGridAmbientMultiplier;
  296. bool m_giShadows = true;
  297. bool m_useDiffuseIbl = true;
  298. bool m_scrolling = false;
  299. bool m_edgeBlendIbl = true;
  300. float m_emissiveMultiplier = DefaultDiffuseProbeGridEmissiveMultiplier;
  301. DiffuseProbeGridNumRaysPerProbe m_numRaysPerProbe = DefaultDiffuseProbeGridNumRaysPerProbe;
  302. DiffuseProbeGridTransparencyMode m_transparencyMode = DefaultDiffuseProbeGridTransparencyMode;
  303. // frame count and current frame index for alternating probe updates across frames
  304. uint32_t m_frameUpdateCount = 1;
  305. uint32_t m_frameUpdateIndex = 0;
  306. // rotation transform applied to probe rays
  307. AZ::Quaternion m_probeRayRotation;
  308. AZ::SimpleLcgRandom m_random;
  309. // probe relocation settings
  310. int32_t m_remainingRelocationIterations = DefaultNumRelocationIterations;
  311. // render data
  312. DiffuseProbeGridRenderData* m_renderData = nullptr;
  313. // render draw packet
  314. RHI::ConstPtr<RHI::DrawPacket> m_drawPacket;
  315. // sort key for the draw item
  316. const RHI::DrawItemSortKey InvalidSortKey = static_cast<RHI::DrawItemSortKey>(-1);
  317. RHI::DrawItemSortKey m_sortKey = InvalidSortKey;
  318. // culling
  319. RPI::Cullable m_cullable;
  320. // grid mode (RealTime or Baked)
  321. DiffuseProbeGridMode m_mode = DiffuseProbeGridMode::RealTime;
  322. // grid data buffer
  323. RHI::Ptr<RHI::Buffer> m_gridDataBuffer;
  324. bool m_gridDataInitialized = false;
  325. // real-time textures
  326. static const uint32_t MaxTextureDimension = 8192;
  327. static const uint32_t ImageFrameCount = 3;
  328. RHI::Ptr<RHI::Image> m_rayTraceImage[ImageFrameCount];
  329. RHI::Ptr<RHI::Image> m_irradianceImage[ImageFrameCount];
  330. RHI::Ptr<RHI::Image> m_distanceImage[ImageFrameCount];
  331. RHI::Ptr<RHI::Image> m_probeDataImage[ImageFrameCount];
  332. uint32_t m_currentImageIndex = 0;
  333. bool m_updateTextures = false;
  334. bool m_textureClearRequired = true;
  335. // baked textures
  336. Data::Instance<RPI::Image> m_bakedIrradianceImage;
  337. Data::Instance<RPI::Image> m_bakedDistanceImage;
  338. Data::Instance<RPI::Image> m_bakedProbeDataImage;
  339. // baked texture relative paths
  340. AZStd::string m_bakedIrradianceRelativePath;
  341. AZStd::string m_bakedDistanceRelativePath;
  342. AZStd::string m_bakedProbeDataRelativePath;
  343. // texture readback
  344. DiffuseProbeGridTextureReadback m_textureReadback;
  345. // Srgs
  346. Data::Instance<RPI::ShaderResourceGroup> m_prepareSrg;
  347. Data::Instance<RPI::ShaderResourceGroup> m_rayTraceSrg;
  348. Data::Instance<RPI::ShaderResourceGroup> m_blendIrradianceSrg;
  349. Data::Instance<RPI::ShaderResourceGroup> m_blendDistanceSrg;
  350. Data::Instance<RPI::ShaderResourceGroup> m_borderUpdateRowIrradianceSrg;
  351. Data::Instance<RPI::ShaderResourceGroup> m_borderUpdateColumnIrradianceSrg;
  352. Data::Instance<RPI::ShaderResourceGroup> m_borderUpdateRowDistanceSrg;
  353. Data::Instance<RPI::ShaderResourceGroup> m_borderUpdateColumnDistanceSrg;
  354. Data::Instance<RPI::ShaderResourceGroup> m_relocationSrg;
  355. Data::Instance<RPI::ShaderResourceGroup> m_classificationSrg;
  356. Data::Instance<RPI::ShaderResourceGroup> m_renderObjectSrg;
  357. Data::Instance<RPI::ShaderResourceGroup> m_querySrg;
  358. bool m_updateRenderObjectSrg = true;
  359. // attachment Ids
  360. RHI::AttachmentId m_rayTraceImageAttachmentId;
  361. RHI::AttachmentId m_irradianceImageAttachmentId;
  362. RHI::AttachmentId m_distanceImageAttachmentId;
  363. RHI::AttachmentId m_probeDataImageAttachmentId;
  364. RHI::AttachmentId m_gridDataBufferAttachmentId;
  365. // probe visualization
  366. bool m_visualizationEnabled = false;
  367. bool m_visualizationShowInactiveProbes = false;
  368. float m_visualizationSphereRadius = DefaultVisualizationSphereRadius;
  369. RHI::Ptr<RHI::RayTracingTlas> m_visualizationTlas;
  370. bool m_visualizationTlasUpdateRequired = false;
  371. RHI::AttachmentId m_visualizationTlasAttachmentId;
  372. RHI::AttachmentId m_visualizationTlasInstancesAttachmentId;
  373. Data::Instance<RPI::ShaderResourceGroup> m_visualizationPrepareSrg;
  374. Data::Instance<RPI::ShaderResourceGroup> m_visualizationRayTraceSrg;
  375. };
  376. } // namespace Render
  377. } // namespace AZ