3
0

DiffuseProbeGrid.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  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. #include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
  9. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  10. #include <Render/DiffuseProbeGrid.h>
  11. #include <Atom/RPI.Public/Image/StreamingImage.h>
  12. #include <Atom/RPI.Public/View.h>
  13. #include <Atom/RHI/RHISystemInterface.h>
  14. #include <Atom/RHI/Factory.h>
  15. #include <AzCore/Math/MathUtils.h>
  16. #include <RayTracing/RayTracingFeatureProcessor.h>
  17. namespace AZ
  18. {
  19. namespace Render
  20. {
  21. DiffuseProbeGrid::DiffuseProbeGrid()
  22. : m_textureReadback(this)
  23. {
  24. }
  25. DiffuseProbeGrid::~DiffuseProbeGrid()
  26. {
  27. m_scene->GetCullingScene()->UnregisterCullable(m_cullable);
  28. }
  29. void DiffuseProbeGrid::Init(RPI::Scene* scene, DiffuseProbeGridRenderData* renderData)
  30. {
  31. AZ_Assert(scene, "DiffuseProbeGrid::Init called with a null Scene pointer");
  32. m_scene = scene;
  33. m_renderData = renderData;
  34. // create attachment Ids
  35. AZStd::string uuidString = AZ::Uuid::CreateRandom().ToString<AZStd::string>();
  36. m_rayTraceImageAttachmentId = AZStd::string::format("ProbeRayTraceImageAttachmentId_%s", uuidString.c_str());
  37. m_irradianceImageAttachmentId = AZStd::string::format("ProbeIrradianceImageAttachmentId_%s", uuidString.c_str());
  38. m_distanceImageAttachmentId = AZStd::string::format("ProbeDistanceImageAttachmentId_%s", uuidString.c_str());
  39. m_probeDataImageAttachmentId = AZStd::string::format("ProbeDataImageAttachmentId_%s", uuidString.c_str());
  40. m_gridDataBufferAttachmentId = AZStd::string::format("ProbeGridDataBufferAttachmentId_%s", uuidString.c_str());
  41. m_visualizationTlasAttachmentId = AZStd::string::format("ProbeVisualizationTlasAttachmentId_%s", uuidString.c_str());
  42. m_visualizationTlasInstancesAttachmentId = AZStd::string::format("ProbeVisualizationTlasInstancesAttachmentId_%s", uuidString.c_str());
  43. // setup culling
  44. m_cullable.SetDebugName(AZ::Name("DiffuseProbeGrid Volume"));
  45. // create the visualization TLAS
  46. m_visualizationTlas = aznew RHI::RayTracingTlas;
  47. // create the grid data buffer
  48. m_gridDataBuffer = aznew RHI::Buffer;
  49. RHI::BufferDescriptor descriptor;
  50. descriptor.m_byteCount = DiffuseProbeGridRenderData::GridDataBufferSize;
  51. descriptor.m_bindFlags = RHI::BufferBindFlags::ShaderReadWrite;
  52. RHI::BufferInitRequest request;
  53. request.m_buffer = m_gridDataBuffer.get();
  54. request.m_descriptor = descriptor;
  55. [[maybe_unused]] RHI::ResultCode result = m_renderData->m_bufferPool->InitBuffer(request);
  56. AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize GridData buffer");
  57. }
  58. void DiffuseProbeGrid::Simulate(uint32_t probeIndex)
  59. {
  60. UpdateTextures();
  61. if (m_renderObjectSrg)
  62. {
  63. // the list index passed in from the feature processor is the index of this probe in the sorted probe list.
  64. // this is needed to render the probe volumes in order from largest to smallest
  65. RHI::DrawItemSortKey sortKey = static_cast<RHI::DrawItemSortKey>(probeIndex);
  66. if (sortKey != m_sortKey)
  67. {
  68. if (m_renderData->m_pipelineState->GetRHIPipelineState())
  69. {
  70. // the sort key changed, rebuild draw packets
  71. m_sortKey = sortKey;
  72. RHI::DrawPacketBuilder drawPacketBuilder{RHI::MultiDevice::AllDevices};
  73. RHI::DrawIndexed drawIndexed;
  74. drawIndexed.m_indexCount = aznumeric_cast<uint32_t>(m_renderData->m_boxIndexCount);
  75. drawIndexed.m_indexOffset = 0;
  76. drawIndexed.m_vertexOffset = 0;
  77. drawPacketBuilder.Begin(nullptr);
  78. drawPacketBuilder.SetDrawArguments(drawIndexed);
  79. drawPacketBuilder.SetIndexBufferView(m_renderData->m_boxIndexBufferView);
  80. drawPacketBuilder.AddShaderResourceGroup(m_renderObjectSrg->GetRHIShaderResourceGroup());
  81. RHI::DrawPacketBuilder::DrawRequest drawRequest;
  82. drawRequest.m_listTag = m_renderData->m_drawListTag;
  83. drawRequest.m_pipelineState = m_renderData->m_pipelineState->GetRHIPipelineState();
  84. drawRequest.m_streamBufferViews = m_renderData->m_boxPositionBufferView;
  85. drawRequest.m_sortKey = m_sortKey;
  86. drawPacketBuilder.AddDrawItem(drawRequest);
  87. m_drawPacket = drawPacketBuilder.End();
  88. // we also need to update culling with the new draw packet
  89. UpdateCulling();
  90. }
  91. }
  92. }
  93. m_probeRayRotation = AZ::Quaternion::CreateIdentity();
  94. m_frameUpdateIndex = (m_frameUpdateIndex + 1) % m_frameUpdateCount;
  95. }
  96. bool DiffuseProbeGrid::ValidateProbeSpacing(const AZ::Vector3& newSpacing)
  97. {
  98. return ValidateProbeCount(m_extents, newSpacing);
  99. }
  100. void DiffuseProbeGrid::SetProbeSpacing(const AZ::Vector3& probeSpacing)
  101. {
  102. // remove previous spacing from the render extents
  103. m_renderExtents -= m_probeSpacing;
  104. // update probe spacing
  105. m_probeSpacing = probeSpacing;
  106. // expand the extents by one probe spacing unit in order to blend properly around the edges of the volume
  107. m_renderExtents += m_probeSpacing;
  108. m_obbWs = Obb::CreateFromPositionRotationAndHalfLengths(m_transform.GetTranslation(), m_transform.GetRotation(), m_renderExtents / 2.0f);
  109. // recompute the number of probes since the spacing changed
  110. UpdateProbeCount();
  111. m_updateTextures = true;
  112. }
  113. void DiffuseProbeGrid::SetViewBias(float viewBias)
  114. {
  115. m_viewBias = viewBias;
  116. m_updateRenderObjectSrg = true;
  117. }
  118. void DiffuseProbeGrid::SetNormalBias(float normalBias)
  119. {
  120. m_normalBias = normalBias;
  121. m_updateRenderObjectSrg = true;
  122. }
  123. void DiffuseProbeGrid::SetNumRaysPerProbe(DiffuseProbeGridNumRaysPerProbe numRaysPerProbe)
  124. {
  125. m_numRaysPerProbe = numRaysPerProbe;
  126. m_updateTextures = true;
  127. }
  128. void DiffuseProbeGrid::SetTransform(const AZ::Transform& transform)
  129. {
  130. m_transform = transform;
  131. m_obbWs = Obb::CreateFromPositionRotationAndHalfLengths(m_transform.GetTranslation(), m_transform.GetRotation(), m_renderExtents / 2.0f);
  132. // probes need to be relocated since the grid position changed
  133. m_remainingRelocationIterations = DefaultNumRelocationIterations;
  134. m_updateRenderObjectSrg = true;
  135. }
  136. bool DiffuseProbeGrid::ValidateExtents(const AZ::Vector3& newExtents)
  137. {
  138. return ValidateProbeCount(newExtents, m_probeSpacing);
  139. }
  140. void DiffuseProbeGrid::SetExtents(const AZ::Vector3& extents)
  141. {
  142. m_extents = extents;
  143. // recompute the number of probes since the extents changed
  144. UpdateProbeCount();
  145. // expand the extents by one probe spacing unit in order to blend properly around the edges of the volume
  146. m_renderExtents = m_extents + m_probeSpacing;
  147. m_obbWs = Obb::CreateFromPositionRotationAndHalfLengths(m_transform.GetTranslation(), m_transform.GetRotation(), m_renderExtents / 2.0f);
  148. m_updateTextures = true;
  149. }
  150. void DiffuseProbeGrid::SetAmbientMultiplier(float ambientMultiplier)
  151. {
  152. m_ambientMultiplier = ambientMultiplier;
  153. m_updateRenderObjectSrg = true;
  154. }
  155. void DiffuseProbeGrid::Enable(bool enabled)
  156. {
  157. m_enabled = enabled;
  158. m_updateRenderObjectSrg = true;
  159. }
  160. void DiffuseProbeGrid::SetMode(DiffuseProbeGridMode mode)
  161. {
  162. // handle auto-select
  163. if (mode == DiffuseProbeGridMode::AutoSelect)
  164. {
  165. m_mode = (RHI::RHISystemInterface::Get()->GetRayTracingSupport() != RHI::MultiDevice::NoDevices) ? DiffuseProbeGridMode::RealTime : DiffuseProbeGridMode::Baked;
  166. }
  167. else
  168. {
  169. m_mode = mode;
  170. }
  171. m_updateTextures = true;
  172. }
  173. void DiffuseProbeGrid::SetScrolling(bool scrolling)
  174. {
  175. if (m_scrolling == scrolling)
  176. {
  177. return;
  178. }
  179. m_scrolling = scrolling;
  180. // probes need to be relocated since the scrolling mode changed
  181. m_remainingRelocationIterations = DefaultNumRelocationIterations;
  182. m_gridDataInitialized = false;
  183. }
  184. void DiffuseProbeGrid::SetEdgeBlendIbl(bool edgeBlendIbl)
  185. {
  186. if (m_edgeBlendIbl == edgeBlendIbl)
  187. {
  188. return;
  189. }
  190. m_edgeBlendIbl = edgeBlendIbl;
  191. m_updateRenderObjectSrg = true;
  192. }
  193. void DiffuseProbeGrid::SetBakedTextures(const DiffuseProbeGridBakedTextures& bakedTextures)
  194. {
  195. AZ_Assert(bakedTextures.m_irradianceImage.get(), "Invalid Irradiance image passed to SetBakedTextures");
  196. AZ_Assert(bakedTextures.m_distanceImage.get(), "Invalid Distance image passed to SetBakedTextures");
  197. AZ_Assert(bakedTextures.m_probeDataImage.get(), "Invalid ProbeData image passed to SetBakedTextures");
  198. m_bakedIrradianceImage = bakedTextures.m_irradianceImage;
  199. m_bakedDistanceImage = bakedTextures.m_distanceImage;
  200. m_bakedProbeDataImage = bakedTextures.m_probeDataImage;
  201. m_bakedIrradianceRelativePath = bakedTextures.m_irradianceImageRelativePath;
  202. m_bakedDistanceRelativePath = bakedTextures.m_distanceImageRelativePath;
  203. m_bakedProbeDataRelativePath = bakedTextures.m_probeDataImageRelativePath;
  204. m_updateTextures = true;
  205. }
  206. bool DiffuseProbeGrid::HasValidBakedTextures() const
  207. {
  208. return m_bakedIrradianceImage.get() &&
  209. m_bakedDistanceImage.get() &&
  210. m_bakedProbeDataImage.get();
  211. }
  212. void DiffuseProbeGrid::ResetCullingVisibility()
  213. {
  214. m_cullable.m_isVisible = false;
  215. }
  216. bool DiffuseProbeGrid::GetIsVisible() const
  217. {
  218. // we need to go through the DiffuseProbeGrid passes at least once in order to initialize
  219. // the RenderObjectSrg, which means we need to be visible until the RenderObjectSrg is created
  220. if (m_renderObjectSrg == nullptr)
  221. {
  222. return true;
  223. }
  224. // if a bake is in progress we need to make this DiffuseProbeGrid visible
  225. if (!m_textureReadback.IsIdle())
  226. {
  227. return true;
  228. }
  229. return m_cullable.m_isVisible;
  230. }
  231. void DiffuseProbeGrid::SetVisualizationEnabled(bool visualizationEnabled)
  232. {
  233. m_visualizationEnabled = visualizationEnabled;
  234. m_visualizationTlasUpdateRequired = true;
  235. }
  236. void DiffuseProbeGrid::SetVisualizationSphereRadius(float visualizationSphereRadius)
  237. {
  238. m_visualizationSphereRadius = visualizationSphereRadius;
  239. m_visualizationTlasUpdateRequired = true;
  240. }
  241. bool DiffuseProbeGrid::GetVisualizationTlasUpdateRequired() const
  242. {
  243. return m_visualizationTlasUpdateRequired || m_remainingRelocationIterations > 0;
  244. }
  245. bool DiffuseProbeGrid::ContainsPosition(const AZ::Vector3& position) const
  246. {
  247. return m_obbWs.Contains(position);
  248. }
  249. uint32_t DiffuseProbeGrid::GetTotalProbeCount() const
  250. {
  251. return m_probeCountX * m_probeCountY * m_probeCountZ;
  252. }
  253. // compute probe counts for a 2D texture layout
  254. void DiffuseProbeGrid::GetTexture2DProbeCount(uint32_t& probeCountX, uint32_t& probeCountY) const
  255. {
  256. // z-up left-handed
  257. probeCountX = m_probeCountY * m_probeCountZ;
  258. probeCountY = m_probeCountX;
  259. }
  260. void DiffuseProbeGrid::UpdateTextures()
  261. {
  262. if (!m_updateTextures)
  263. {
  264. return;
  265. }
  266. uint32_t probeCountX;
  267. uint32_t probeCountY;
  268. GetTexture2DProbeCount(probeCountX, probeCountY);
  269. if (m_mode == DiffuseProbeGridMode::RealTime)
  270. {
  271. // advance to the next image in the frame image array
  272. m_currentImageIndex = (m_currentImageIndex + 1) % ImageFrameCount;
  273. // probe raytrace
  274. {
  275. uint32_t width = GetNumRaysPerProbe().m_rayCount;
  276. uint32_t height = GetTotalProbeCount();
  277. m_rayTraceImage[m_currentImageIndex] = aznew RHI::Image;
  278. RHI::ImageInitRequest request;
  279. request.m_image = m_rayTraceImage[m_currentImageIndex].get();
  280. request.m_descriptor = RHI::ImageDescriptor::Create2D(RHI::ImageBindFlags::ShaderReadWrite | RHI::ImageBindFlags::CopyRead, width, height, DiffuseProbeGridRenderData::RayTraceImageFormat);
  281. [[maybe_unused]] RHI::ResultCode result = m_renderData->m_imagePool->InitImage(request);
  282. AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize m_probeRayTraceImage image");
  283. }
  284. // probe irradiance
  285. {
  286. uint32_t width = probeCountX * (DefaultNumIrradianceTexels + 2);
  287. uint32_t height = probeCountY * (DefaultNumIrradianceTexels + 2);
  288. m_irradianceImage[m_currentImageIndex] = aznew RHI::Image;
  289. RHI::ImageInitRequest request;
  290. request.m_image = m_irradianceImage[m_currentImageIndex].get();
  291. request.m_descriptor = RHI::ImageDescriptor::Create2D(RHI::ImageBindFlags::ShaderReadWrite | RHI::ImageBindFlags::CopyRead, width, height, DiffuseProbeGridRenderData::IrradianceImageFormat);
  292. RHI::ClearValue clearValue = RHI::ClearValue::CreateVector4Float(0.0f, 0.0f, 0.0f, 0.0f);
  293. request.m_optimizedClearValue = &clearValue;
  294. [[maybe_unused]] RHI::ResultCode result = m_renderData->m_imagePool->InitImage(request);
  295. AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize m_probeIrradianceImage image");
  296. }
  297. // probe distance
  298. {
  299. uint32_t width = probeCountX * (DefaultNumDistanceTexels + 2);
  300. uint32_t height = probeCountY * (DefaultNumDistanceTexels + 2);
  301. m_distanceImage[m_currentImageIndex] = aznew RHI::Image;
  302. RHI::ImageInitRequest request;
  303. request.m_image = m_distanceImage[m_currentImageIndex].get();
  304. request.m_descriptor = RHI::ImageDescriptor::Create2D(RHI::ImageBindFlags::ShaderReadWrite | RHI::ImageBindFlags::CopyRead, width, height, DiffuseProbeGridRenderData::DistanceImageFormat);
  305. [[maybe_unused]] RHI::ResultCode result = m_renderData->m_imagePool->InitImage(request);
  306. AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize m_probeDistanceImage image");
  307. }
  308. // probe data
  309. {
  310. uint32_t width = probeCountX;
  311. uint32_t height = probeCountY;
  312. m_probeDataImage[m_currentImageIndex] = aznew RHI::Image;
  313. RHI::ImageInitRequest request;
  314. request.m_image = m_probeDataImage[m_currentImageIndex].get();
  315. request.m_descriptor = RHI::ImageDescriptor::Create2D(RHI::ImageBindFlags::ShaderReadWrite | RHI::ImageBindFlags::CopyRead, width, height, DiffuseProbeGridRenderData::ProbeDataImageFormat);
  316. [[maybe_unused]] RHI::ResultCode result = m_renderData->m_imagePool->InitImage(request);
  317. AZ_Assert(result == RHI::ResultCode::Success, "Failed to initialize m_probeDataImage image");
  318. }
  319. // probes need to be relocated since the textures changed
  320. m_remainingRelocationIterations = DefaultNumRelocationIterations;
  321. }
  322. m_updateTextures = false;
  323. // textures have changed so we need to update the render Srg to bind the new ones
  324. m_updateRenderObjectSrg = true;
  325. // we need to clear the Irradiance, Distance, and ProbeData textures
  326. m_textureClearRequired = true;
  327. }
  328. void DiffuseProbeGrid::ComputeProbeCount(const AZ::Vector3& extents, const AZ::Vector3& probeSpacing, uint32_t& probeCountX, uint32_t& probeCountY, uint32_t& probeCountZ)
  329. {
  330. probeCountX = aznumeric_cast<uint32_t>(AZStd::floorf(extents.GetX() / probeSpacing.GetX()));
  331. probeCountY = aznumeric_cast<uint32_t>(AZStd::floorf(extents.GetY() / probeSpacing.GetY()));
  332. probeCountZ = aznumeric_cast<uint32_t>(AZStd::floorf(extents.GetZ() / probeSpacing.GetZ()));
  333. }
  334. bool DiffuseProbeGrid::ValidateProbeCount(const AZ::Vector3& extents, const AZ::Vector3& probeSpacing)
  335. {
  336. uint32_t probeCountX = 0;
  337. uint32_t probeCountY = 0;
  338. uint32_t probeCountZ = 0;
  339. ComputeProbeCount(extents, probeSpacing, probeCountX, probeCountY, probeCountZ);
  340. uint32_t totalProbeCount = probeCountX * probeCountY * probeCountZ;
  341. if (totalProbeCount == 0)
  342. {
  343. return false;
  344. }
  345. // radiance texture height is equal to the probe count
  346. if (totalProbeCount > MaxTextureDimension)
  347. {
  348. return false;
  349. }
  350. // distance texture uses the largest number of texels per probe
  351. // z-up left-handed
  352. uint32_t width = probeCountY * probeCountZ * (DefaultNumDistanceTexels + 2);
  353. uint32_t height = probeCountX * (DefaultNumDistanceTexels + 2);
  354. if (width > MaxTextureDimension || height > MaxTextureDimension)
  355. {
  356. return false;
  357. }
  358. return true;
  359. }
  360. void DiffuseProbeGrid::UpdateProbeCount()
  361. {
  362. ComputeProbeCount(m_extents,
  363. m_probeSpacing,
  364. m_probeCountX,
  365. m_probeCountY,
  366. m_probeCountZ);
  367. }
  368. void DiffuseProbeGrid::UpdatePrepareSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  369. {
  370. if (!m_prepareSrg)
  371. {
  372. m_prepareSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  373. AZ_Error("DiffuseProbeGrid", m_prepareSrg.get(), "Failed to create Prepare shader resource group");
  374. }
  375. // scale the normal bias based on the grid density to reduce artifacts on thin geometry, less density results in more bias
  376. float scaledNormalBias = m_normalBias + 0.15f * (m_probeSpacing.GetMaxElement() / 2.0f);
  377. // scale the probe distance exponent based on the grid density to reduce artifacts on thin geometry
  378. static const float MinProbeDistanceExponent = 50.0f;
  379. float scaledProbeDistanceExponent = AZStd::max(m_probeDistanceExponent * (m_probeSpacing.GetMaxElement() / 1.5f), MinProbeDistanceExponent);
  380. // setup packed data
  381. uint32_t packed0 = m_probeCountX | (m_probeCountY << 8) | (m_probeCountZ << 16);
  382. uint32_t packed1 = aznumeric_cast<uint32_t>(m_probeRandomRayBackfaceThreshold * 65535) | (aznumeric_cast<uint32_t>(m_probeFixedRayBackfaceThreshold * 65535) << 16);
  383. uint32_t packed2 = GetNumRaysPerProbe().m_rayCount | (DefaultNumIrradianceTexels << 16) | (DefaultNumDistanceTexels << 24);
  384. uint32_t packed3 = 0;
  385. uint32_t packed4 = (m_scrolling << 16) | (1 << 17) | (1 << 18) | (1 << 19) | (1 << 20); // scrolling, rayFormat, irradianceFormat, relocation, classification
  386. m_prepareSrg->SetBufferView(m_renderData->m_prepareSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  387. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgGridDataInitializedNameIndex, m_gridDataInitialized);
  388. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridOriginNameIndex, m_transform.GetTranslation());
  389. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeHysteresisNameIndex, m_probeHysteresis);
  390. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridRotationNameIndex, m_transform.GetRotation());
  391. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeRayRotationNameIndex, m_probeRayRotation);
  392. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeMaxRayDistanceNameIndex, m_probeMaxRayDistance);
  393. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeNormalBiasNameIndex, scaledNormalBias);
  394. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeViewBiasNameIndex, m_viewBias);
  395. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeDistanceExponentNameIndex, scaledProbeDistanceExponent);
  396. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeSpacingNameIndex, m_probeSpacing);
  397. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridPacked0NameIndex, packed0);
  398. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeIrradianceEncodingGammaNameIndex, m_probeIrradianceEncodingGamma);
  399. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeIrradianceThresholdNameIndex, m_probeIrradianceThreshold);
  400. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeBrightnessThresholdNameIndex, m_probeBrightnessThreshold);
  401. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridPacked1NameIndex, packed1);
  402. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeMinFrontfaceDistanceNameIndex, m_probeMinFrontfaceDistance);
  403. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridPacked2NameIndex, packed2);
  404. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridPacked3NameIndex, packed3);
  405. m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridPacked4NameIndex, packed4);
  406. m_gridDataInitialized = true;
  407. }
  408. void DiffuseProbeGrid::UpdateRayTraceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  409. {
  410. if (!m_rayTraceSrg)
  411. {
  412. m_rayTraceSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  413. AZ_Error("DiffuseProbeGrid", m_rayTraceSrg.get(), "Failed to create RayTrace shader resource group");
  414. }
  415. m_rayTraceSrg->SetBufferView(m_renderData->m_rayTraceSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  416. m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
  417. m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeIrradianceNameIndex, m_irradianceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  418. m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeDistanceNameIndex, m_distanceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  419. m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  420. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgAmbientMultiplierNameIndex, m_ambientMultiplier);
  421. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgGiShadowsNameIndex, m_giShadows);
  422. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgUseDiffuseIblNameIndex, m_useDiffuseIbl);
  423. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
  424. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
  425. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgTransparencyModeNameIndex, aznumeric_cast<uint32_t>(m_transparencyMode));
  426. m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgEmissiveMultiplierNameIndex, m_emissiveMultiplier);
  427. }
  428. void DiffuseProbeGrid::UpdateBlendIrradianceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  429. {
  430. if (!m_blendIrradianceSrg)
  431. {
  432. m_blendIrradianceSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  433. AZ_Error("DiffuseProbeGrid", m_blendIrradianceSrg.get(), "Failed to create BlendIrradiance shader resource group");
  434. }
  435. m_blendIrradianceSrg->SetBufferView(m_renderData->m_blendIrradianceSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  436. m_blendIrradianceSrg->SetImageView(m_renderData->m_blendIrradianceSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
  437. m_blendIrradianceSrg->SetImageView(m_renderData->m_blendIrradianceSrgProbeIrradianceNameIndex, m_irradianceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  438. m_blendIrradianceSrg->SetImageView(m_renderData->m_blendIrradianceSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  439. m_blendIrradianceSrg->SetConstant(m_renderData->m_blendIrradianceSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
  440. m_blendIrradianceSrg->SetConstant(m_renderData->m_blendIrradianceSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
  441. }
  442. void DiffuseProbeGrid::UpdateBlendDistanceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  443. {
  444. if (!m_blendDistanceSrg)
  445. {
  446. m_blendDistanceSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  447. AZ_Error("DiffuseProbeGrid", m_blendDistanceSrg.get(), "Failed to create BlendDistance shader resource group");
  448. }
  449. m_blendDistanceSrg->SetBufferView(m_renderData->m_blendDistanceSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  450. m_blendDistanceSrg->SetImageView(m_renderData->m_blendDistanceSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
  451. m_blendDistanceSrg->SetImageView(m_renderData->m_blendDistanceSrgProbeDistanceNameIndex, m_distanceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  452. m_blendDistanceSrg->SetImageView(m_renderData->m_blendDistanceSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  453. m_blendDistanceSrg->SetConstant(m_renderData->m_blendDistanceSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
  454. m_blendDistanceSrg->SetConstant(m_renderData->m_blendDistanceSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
  455. }
  456. void DiffuseProbeGrid::UpdateBorderUpdateSrgs(
  457. const Data::Instance<RPI::Shader>& rowShader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& rowSrgLayout,
  458. const Data::Instance<RPI::Shader>& columnShader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& columnSrgLayout)
  459. {
  460. // border update row irradiance
  461. {
  462. if (!m_borderUpdateRowIrradianceSrg)
  463. {
  464. m_borderUpdateRowIrradianceSrg = RPI::ShaderResourceGroup::Create(rowShader->GetAsset(), rowShader->GetSupervariantIndex(), rowSrgLayout->GetName());
  465. AZ_Error("DiffuseProbeGrid", m_borderUpdateRowIrradianceSrg.get(), "Failed to create BorderUpdateRowIrradiance shader resource group");
  466. }
  467. m_borderUpdateRowIrradianceSrg->SetImageView(m_renderData->m_borderUpdateRowIrradianceSrgProbeTextureNameIndex, m_irradianceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  468. m_borderUpdateRowIrradianceSrg->SetConstant(m_renderData->m_borderUpdateRowIrradianceSrgNumTexelsNameIndex, DefaultNumIrradianceTexels);
  469. }
  470. // border update column irradiance
  471. {
  472. if (!m_borderUpdateColumnIrradianceSrg)
  473. {
  474. m_borderUpdateColumnIrradianceSrg = RPI::ShaderResourceGroup::Create(columnShader->GetAsset(), columnShader->GetSupervariantIndex(), columnSrgLayout->GetName());
  475. AZ_Error("DiffuseProbeGrid", m_borderUpdateColumnIrradianceSrg.get(), "Failed to create BorderUpdateColumnRowIrradiance shader resource group");
  476. }
  477. m_borderUpdateColumnIrradianceSrg->SetImageView(m_renderData->m_borderUpdateColumnIrradianceSrgProbeTextureNameIndex, m_irradianceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  478. m_borderUpdateColumnIrradianceSrg->SetConstant(m_renderData->m_borderUpdateColumnIrradianceSrgNumTexelsNameIndex, DefaultNumIrradianceTexels);
  479. }
  480. // border update row distance
  481. {
  482. if (!m_borderUpdateRowDistanceSrg)
  483. {
  484. m_borderUpdateRowDistanceSrg = RPI::ShaderResourceGroup::Create(rowShader->GetAsset(), rowShader->GetSupervariantIndex(), rowSrgLayout->GetName());
  485. AZ_Error("DiffuseProbeGrid", m_borderUpdateRowDistanceSrg.get(), "Failed to create BorderUpdateRowDistance shader resource group");
  486. }
  487. m_borderUpdateRowDistanceSrg->SetImageView(m_renderData->m_borderUpdateRowDistanceSrgProbeTextureNameIndex, m_distanceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  488. m_borderUpdateRowDistanceSrg->SetConstant(m_renderData->m_borderUpdateRowDistanceSrgNumTexelsNameIndex, DefaultNumDistanceTexels);
  489. }
  490. // border update column distance
  491. {
  492. if (!m_borderUpdateColumnDistanceSrg)
  493. {
  494. m_borderUpdateColumnDistanceSrg = RPI::ShaderResourceGroup::Create(columnShader->GetAsset(), columnShader->GetSupervariantIndex(), columnSrgLayout->GetName());
  495. AZ_Error("DiffuseProbeGrid", m_borderUpdateColumnDistanceSrg.get(), "Failed to create BorderUpdateColumnRowDistance shader resource group");
  496. }
  497. m_borderUpdateColumnDistanceSrg->SetImageView(m_renderData->m_borderUpdateColumnDistanceSrgProbeTextureNameIndex, m_distanceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  498. m_borderUpdateColumnDistanceSrg->SetConstant(m_renderData->m_borderUpdateColumnDistanceSrgNumTexelsNameIndex, DefaultNumDistanceTexels);
  499. }
  500. }
  501. void DiffuseProbeGrid::UpdateRelocationSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  502. {
  503. if (!m_relocationSrg)
  504. {
  505. m_relocationSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  506. AZ_Error("DiffuseProbeGrid", m_relocationSrg.get(), "Failed to create Relocation shader resource group");
  507. }
  508. m_relocationSrg->SetBufferView(m_renderData->m_relocationSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  509. m_relocationSrg->SetImageView(m_renderData->m_relocationSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
  510. m_relocationSrg->SetImageView(m_renderData->m_relocationSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  511. m_relocationSrg->SetConstant(m_renderData->m_relocationSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
  512. m_relocationSrg->SetConstant(m_renderData->m_relocationSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
  513. }
  514. void DiffuseProbeGrid::UpdateClassificationSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  515. {
  516. if (!m_classificationSrg)
  517. {
  518. m_classificationSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  519. AZ_Error("DiffuseProbeGrid", m_classificationSrg.get(), "Failed to create Classification shader resource group");
  520. }
  521. m_classificationSrg->SetBufferView(m_renderData->m_classificationSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  522. m_classificationSrg->SetImageView(m_renderData->m_classificationSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
  523. m_classificationSrg->SetImageView(m_renderData->m_classificationSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  524. m_classificationSrg->SetConstant(m_renderData->m_classificationSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
  525. m_classificationSrg->SetConstant(m_renderData->m_classificationSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
  526. }
  527. void DiffuseProbeGrid::UpdateRenderObjectSrg()
  528. {
  529. if (!m_updateRenderObjectSrg)
  530. {
  531. return;
  532. }
  533. if (!m_renderObjectSrg)
  534. {
  535. m_renderObjectSrg = RPI::ShaderResourceGroup::Create(m_renderData->m_shader->GetAsset(), m_renderData->m_shader->GetSupervariantIndex(), m_renderData->m_srgLayout->GetName());
  536. AZ_Error("DiffuseProbeGrid", m_renderObjectSrg.get(), "Failed to create render shader resource group");
  537. }
  538. m_renderObjectSrg->SetBufferView(m_renderData->m_renderSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  539. AZ::Matrix3x4 modelToWorld = AZ::Matrix3x4::CreateFromTransform(m_transform) * AZ::Matrix3x4::CreateScale(m_renderExtents);
  540. m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgModelToWorldNameIndex, modelToWorld);
  541. AZ::Matrix3x4 modelToWorldInverse = modelToWorld.GetInverseFull();
  542. m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgModelToWorldInverseNameIndex, modelToWorldInverse);
  543. m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgObbHalfLengthsNameIndex, m_obbWs.GetHalfLengths());
  544. m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgEnableDiffuseGiNameIndex, m_enabled);
  545. m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgAmbientMultiplierNameIndex, m_ambientMultiplier);
  546. m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgEdgeBlendIblNameIndex, m_edgeBlendIbl);
  547. m_renderObjectSrg->SetImageView(m_renderData->m_renderSrgProbeIrradianceNameIndex, GetIrradianceImage()->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  548. m_renderObjectSrg->SetImageView(m_renderData->m_renderSrgProbeDistanceNameIndex, GetDistanceImage()->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  549. m_renderObjectSrg->SetImageView(m_renderData->m_renderSrgProbeDataNameIndex, GetProbeDataImage()->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  550. m_updateRenderObjectSrg = false;
  551. // update culling now since the position and/or extents may have changed
  552. UpdateCulling();
  553. }
  554. void DiffuseProbeGrid::UpdateVisualizationPrepareSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  555. {
  556. if (!m_visualizationPrepareSrg)
  557. {
  558. m_visualizationPrepareSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  559. AZ_Error("DiffuseProbeGrid", m_visualizationPrepareSrg.get(), "Failed to create VisualizationPrepare shader resource group");
  560. }
  561. uint32_t tlasInstancesBufferByteCount = aznumeric_cast<uint32_t>(m_visualizationTlas->GetTlasInstancesBuffer()->GetDescriptor().m_byteCount);
  562. RHI::BufferViewDescriptor bufferViewDescriptor = RHI::BufferViewDescriptor::CreateStructured(0, tlasInstancesBufferByteCount / RayTracingTlasInstanceElementSize, RayTracingTlasInstanceElementSize);
  563. m_visualizationPrepareSrg->SetBufferView(m_renderData->m_visualizationPrepareSrgTlasInstancesNameIndex, m_visualizationTlas->GetTlasInstancesBuffer()->BuildBufferView(bufferViewDescriptor).get());
  564. m_visualizationPrepareSrg->SetBufferView(m_renderData->m_visualizationPrepareSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  565. m_visualizationPrepareSrg->SetImageView(m_renderData->m_visualizationPrepareSrgProbeDataNameIndex, GetProbeDataImage()->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  566. m_visualizationPrepareSrg->SetConstant(m_renderData->m_visualizationPrepareSrgProbeSphereRadiusNameIndex, m_visualizationSphereRadius);
  567. }
  568. void DiffuseProbeGrid::UpdateVisualizationRayTraceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout, const RHI::ImageView* outputImageView)
  569. {
  570. if (!m_visualizationRayTraceSrg)
  571. {
  572. m_visualizationRayTraceSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  573. AZ_Error("DiffuseProbeGrid", m_visualizationRayTraceSrg.get(), "Failed to create VisualizationRayTrace shader resource group");
  574. }
  575. uint32_t tlasBufferByteCount = aznumeric_cast<uint32_t>(m_visualizationTlas->GetTlasBuffer()->GetDescriptor().m_byteCount);
  576. RHI::BufferViewDescriptor bufferViewDescriptor = RHI::BufferViewDescriptor::CreateRayTracingTLAS(tlasBufferByteCount);
  577. m_visualizationRayTraceSrg->SetBufferView(m_renderData->m_visualizationRayTraceSrgTlasNameIndex, m_visualizationTlas->GetTlasBuffer()->BuildBufferView(bufferViewDescriptor).get());
  578. m_visualizationRayTraceSrg->SetBufferView(m_renderData->m_visualizationRayTraceSrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  579. m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgProbeIrradianceNameIndex, GetIrradianceImage()->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  580. m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgProbeDistanceNameIndex, GetDistanceImage()->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  581. m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgProbeDataNameIndex, GetProbeDataImage()->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  582. m_visualizationRayTraceSrg->SetConstant(m_renderData->m_visualizationRayTraceSrgShowInactiveProbesNameIndex, m_visualizationShowInactiveProbes);
  583. m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgOutputNameIndex, outputImageView);
  584. }
  585. void DiffuseProbeGrid::UpdateQuerySrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
  586. {
  587. if (!m_querySrg)
  588. {
  589. m_querySrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), layout->GetName());
  590. AZ_Error("DiffuseProbeGrid", m_querySrg.get(), "Failed to create Query shader resource group");
  591. }
  592. m_querySrg->SetBufferView(m_renderData->m_querySrgGridDataNameIndex, m_gridDataBuffer->BuildBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
  593. m_querySrg->SetImageView(m_renderData->m_querySrgProbeIrradianceNameIndex, GetIrradianceImage()->BuildImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
  594. m_querySrg->SetImageView(m_renderData->m_querySrgProbeDistanceNameIndex, GetDistanceImage()->BuildImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
  595. m_querySrg->SetImageView(m_renderData->m_querySrgProbeDataNameIndex, GetProbeDataImage()->BuildImageView(m_renderData->m_probeDataImageViewDescriptor).get());
  596. m_querySrg->SetConstant(m_renderData->m_querySrgAmbientMultiplierNameIndex, m_ambientMultiplier);
  597. }
  598. void DiffuseProbeGrid::UpdateCulling()
  599. {
  600. if (!m_drawPacket)
  601. {
  602. return;
  603. }
  604. // set draw list mask
  605. m_cullable.m_cullData.m_drawListMask.reset();
  606. m_cullable.m_cullData.m_drawListMask = m_drawPacket->GetDrawListMask();
  607. // setup the Lod entry, only one entry is needed for the draw packet
  608. m_cullable.m_lodData.m_lods.clear();
  609. m_cullable.m_lodData.m_lods.resize(1);
  610. RPI::Cullable::LodData::Lod& lod = m_cullable.m_lodData.m_lods.back();
  611. // add the draw packet
  612. lod.m_drawPackets.push_back(m_drawPacket.get());
  613. // set screen coverage
  614. // probe volume should cover at least a screen pixel at 1080p to be drawn
  615. static const float MinimumScreenCoverage = 1.0f / 1080.0f;
  616. lod.m_screenCoverageMin = MinimumScreenCoverage;
  617. lod.m_screenCoverageMax = 1.0f;
  618. // update cullable bounds
  619. Aabb aabbWs = Aabb::CreateFromObb(m_obbWs);
  620. Vector3 center;
  621. float radius;
  622. aabbWs.GetAsSphere(center, radius);
  623. m_cullable.m_cullData.m_boundingSphere = Sphere(center, radius);
  624. m_cullable.m_cullData.m_boundingObb = m_obbWs;
  625. m_cullable.m_cullData.m_visibilityEntry.m_boundingVolume = aabbWs;
  626. m_cullable.m_cullData.m_visibilityEntry.m_userData = &m_cullable;
  627. m_cullable.m_cullData.m_visibilityEntry.m_typeFlags = AzFramework::VisibilityEntry::TYPE_RPI_Cullable;
  628. // register with culling system
  629. m_scene->GetCullingScene()->RegisterOrUpdateCullable(m_cullable);
  630. }
  631. } // namespace Render
  632. } // namespace AZ