DiffuseProbeGrid.h 28 KB

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