Browse Source

Added emissive multiplier to the DiffuseProbeGrid and Editor components
Replaced the DiffuseProbeGrid Srg index lookups with RHI::ShaderInputNameIndex variables (CPU optimization)
Moved the DiffuseProbeGrid default constants to the DiffuseProbeGridFeatureProcessorInterface
Transformed the base color and emissive values to the ACEScg space in RayTracingMaterialSrgUtils

Signed-off-by: dmcdiarmid-ly <[email protected]>

dmcdiarmid-ly 2 years ago
parent
commit
fd961ebfa1
27 changed files with 287 additions and 378 deletions
  1. 18 13
      Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/RayTracing/RayTracingMaterialUtils.azsli
  2. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing.azshader
  3. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_dx12_0.azshadervariant
  4. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_null_0.azshadervariant
  5. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_vulkan_0.azshadervariant
  6. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit.azshader
  7. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit_dx12_0.azshadervariant
  8. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit_null_0.azshadervariant
  9. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit_vulkan_0.azshadervariant
  10. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit.azshader
  11. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_dx12_0.azshadervariant
  12. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_null_0.azshadervariant
  13. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_vulkan_0.azshadervariant
  14. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss.azshader
  15. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_dx12_0.azshadervariant
  16. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_null_0.azshadervariant
  17. BIN
      Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_vulkan_0.azshadervariant
  18. 11 0
      Gems/DiffuseProbeGrid/Code/Include/DiffuseProbeGrid/DiffuseProbeGridFeatureProcessorInterface.h
  19. 0 7
      Gems/DiffuseProbeGrid/Code/Source/Components/DiffuseProbeGridComponentConstants.h
  20. 14 1
      Gems/DiffuseProbeGrid/Code/Source/Components/DiffuseProbeGridComponentController.cpp
  21. 2 0
      Gems/DiffuseProbeGrid/Code/Source/Components/DiffuseProbeGridComponentController.h
  22. 13 0
      Gems/DiffuseProbeGrid/Code/Source/EditorComponents/EditorDiffuseProbeGridComponent.cpp
  23. 3 1
      Gems/DiffuseProbeGrid/Code/Source/EditorComponents/EditorDiffuseProbeGridComponent.h
  24. 99 350
      Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGrid.cpp
  25. 120 6
      Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGrid.h
  26. 6 0
      Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGridFeatureProcessor.cpp
  27. 1 0
      Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGridFeatureProcessor.h

+ 18 - 13
Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/RayTracing/RayTracingMaterialUtils.azsli

@@ -6,7 +6,8 @@
  *
  */
 
- #include <Atom/Features/Bindless.azsli>
+#include <Atom/Features/Bindless.azsli>
+#include <Atom/Features/ColorManagement/TransformColor.azsli>
 
 struct TextureData
 {
@@ -38,6 +39,9 @@ TextureData GetHitTextureData(RayTracingMaterialSrg::MaterialInfo materialInfo,
         textureData.m_baseColor = materialInfo.m_baseColor;
     }
 
+    // transform the base color to the ACEScg color space
+    textureData.m_baseColor.rgb = TransformColor(textureData.m_baseColor.rgb, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg);
+
     // normal
     if (materialInfo.m_textureFlags & TEXTURE_FLAG_NORMAL)
     {
@@ -45,9 +49,9 @@ TextureData GetHitTextureData(RayTracingMaterialSrg::MaterialInfo materialInfo,
         uint normalTextureArrayIndex = RayTracingMaterialSrg::m_materialTextureIndices[materialInfo.m_textureStartIndex + MATERIAL_NORMAL_TEXTURE_OFFSET];
 
 #if USE_BINDLESS_SRG
-        textureData.m_normal = Bindless::GetTexture2D(normalTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_normal = Bindless::GetTexture2D(normalTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).rgb;
 #else
-        textureData.m_normal = RayTracingMaterialSrg::m_materialTextures[normalTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_normal = RayTracingMaterialSrg::m_materialTextures[normalTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).rgb;
 #endif       
     }
     else
@@ -62,9 +66,9 @@ TextureData GetHitTextureData(RayTracingMaterialSrg::MaterialInfo materialInfo,
         uint metallicTextureArrayIndex = RayTracingMaterialSrg::m_materialTextureIndices[materialInfo.m_textureStartIndex + MATERIAL_METALLIC_TEXTURE_OFFSET];
 
 #if USE_BINDLESS_SRG
-        textureData.m_metallic = Bindless::GetTexture2D(metallicTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_metallic = Bindless::GetTexture2D(metallicTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).r;
 #else
-        textureData.m_metallic = RayTracingMaterialSrg::m_materialTextures[metallicTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_metallic = RayTracingMaterialSrg::m_materialTextures[metallicTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).r;
 #endif
     }
     else
@@ -79,9 +83,9 @@ TextureData GetHitTextureData(RayTracingMaterialSrg::MaterialInfo materialInfo,
         uint roughnessTextureArrayIndex = RayTracingMaterialSrg::m_materialTextureIndices[materialInfo.m_textureStartIndex + MATERIAL_ROUGHNESS_TEXTURE_OFFSET];
 
 #if USE_BINDLESS_SRG
-        textureData.m_roughness = Bindless::GetTexture2D(roughnessTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_roughness = Bindless::GetTexture2D(roughnessTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).r;
 #else
-        textureData.m_roughness = RayTracingMaterialSrg::m_materialTextures[roughnessTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_roughness = RayTracingMaterialSrg::m_materialTextures[roughnessTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).r;
 #endif
     }
     else
@@ -90,21 +94,22 @@ TextureData GetHitTextureData(RayTracingMaterialSrg::MaterialInfo materialInfo,
     }
 
     // emissive
+    textureData.m_emissiveColor = materialInfo.m_emissiveColor;
+
     if (materialInfo.m_textureFlags & TEXTURE_FLAG_EMISSIVE)
     {
         // array index of the emissive texture for this material in the m_materialTextures unbounded array
         uint emissiveTextureArrayIndex = RayTracingMaterialSrg::m_materialTextureIndices[materialInfo.m_textureStartIndex + MATERIAL_EMISSIVE_TEXTURE_OFFSET];
 
 #if USE_BINDLESS_SRG
-        textureData.m_emissiveColor = Bindless::GetTexture2D(emissiveTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_emissiveColor *= Bindless::GetTexture2D(emissiveTextureArrayIndex).SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).rgb;
 #else
-        textureData.m_emissiveColor = RayTracingMaterialSrg::m_materialTextures[emissiveTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0);
+        textureData.m_emissiveColor *= RayTracingMaterialSrg::m_materialTextures[emissiveTextureArrayIndex].SampleLevel(RayTracingMaterialSrg::LinearSampler, uv, 0).rgb;
 #endif
     }
-    else
-    {
-        textureData.m_emissiveColor = materialInfo.m_emissiveColor;
-    }
+
+    // transform the emissive color to the ACEScg color space
+    textureData.m_emissiveColor = TransformColor(textureData.m_emissiveColor, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg);
 
     return textureData;
 }

BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing.azshader


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_dx12_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_null_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracing_vulkan_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit.azshader


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit_dx12_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit_null_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracinganyhit_vulkan_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit.azshader


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_dx12_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_null_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingclosesthit_vulkan_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss.azshader


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_dx12_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_null_0.azshadervariant


BIN
Gems/DiffuseProbeGrid/Assets/Shaders/DiffuseGlobalIllumination/diffuseprobegridraytracingmiss_vulkan_0.azshadervariant


+ 11 - 0
Gems/DiffuseProbeGrid/Code/Include/DiffuseProbeGrid/DiffuseProbeGridFeatureProcessorInterface.h

@@ -90,6 +90,16 @@ namespace AZ
             None
         };
 
+        constexpr float DefaultDiffuseProbeGridSpacing = 2.0f;
+        constexpr float DefaultDiffuseProbeGridExtents = 8.0f;
+        constexpr float DefaultDiffuseProbeGridAmbientMultiplier = 1.0f;
+        constexpr float DefaultDiffuseProbeGridEmissiveMultiplier = 1.0f;
+        constexpr float DefaultDiffuseProbeGridViewBias = 0.2f;
+        constexpr float DefaultDiffuseProbeGridNormalBias = 0.1f;
+        constexpr float DefaultVisualizationSphereRadius = 0.5f;
+        constexpr DiffuseProbeGridNumRaysPerProbe DefaultDiffuseProbeGridNumRaysPerProbe = DiffuseProbeGridNumRaysPerProbe::NumRaysPerProbe_288;
+        constexpr DiffuseProbeGridTransparencyMode DefaultDiffuseProbeGridTransparencyMode = DiffuseProbeGridTransparencyMode::ClosestOnly;
+
         using DiffuseProbeGridBakeTexturesCallback = AZStd::function<void(
             DiffuseProbeGridTexture irradianceTexture,
             DiffuseProbeGridTexture distanceTexture,
@@ -135,6 +145,7 @@ namespace AZ
             virtual void SetEdgeBlendIbl(const DiffuseProbeGridHandle& probeGrid, bool edgeBlendIbl) = 0;
             virtual void SetFrameUpdateCount(const DiffuseProbeGridHandle& probeGrid, uint32_t frameUpdateCount) = 0;
             virtual void SetTransparencyMode(const DiffuseProbeGridHandle& probeGrid, DiffuseProbeGridTransparencyMode transparencyMode) = 0;
+            virtual void SetEmissiveMultiplier(const DiffuseProbeGridHandle& probeGrid, float emissiveMultiplier) = 0;
             virtual void SetBakedTextures(const DiffuseProbeGridHandle& probeGrid, const DiffuseProbeGridBakedTextures& bakedTextures) = 0;
             virtual void SetVisualizationEnabled(const DiffuseProbeGridHandle& probeGrid, bool visualizationEnabled) = 0;
             virtual void SetVisualizationShowInactiveProbes(const DiffuseProbeGridHandle& probeGrid, bool visualizationShowInactiveProbes) = 0;

+ 0 - 7
Gems/DiffuseProbeGrid/Code/Source/Components/DiffuseProbeGridComponentConstants.h

@@ -16,12 +16,5 @@ namespace AZ
     {
         inline constexpr AZ::TypeId DiffuseProbeGridComponentTypeId{ "{9B900A04-192F-4F5E-AE31-762605D8159A}" };
         inline constexpr AZ::TypeId EditorDiffuseProbeGridComponentTypeId{ "{F80086E1-ECE7-4E8C-B727-A750D10F7D83}" };
-        static constexpr float DefaultDiffuseProbeGridSpacing = 2.0f;
-        static constexpr float DefaultDiffuseProbeGridExtents = 8.0f;
-        static constexpr float DefaultDiffuseProbeGridAmbientMultiplier = 1.0f;
-        static constexpr float DefaultDiffuseProbeGridViewBias = 0.2f;
-        static constexpr float DefaultDiffuseProbeGridNormalBias = 0.1f;
-        static constexpr DiffuseProbeGridNumRaysPerProbe DefaultDiffuseProbeGridNumRaysPerProbe = DiffuseProbeGridNumRaysPerProbe::NumRaysPerProbe_288;
-        static constexpr float DefaultVisualizationSphereRadius = 0.5f;
     } // namespace Render
 } // namespace AZ

+ 14 - 1
Gems/DiffuseProbeGrid/Code/Source/Components/DiffuseProbeGridComponentController.cpp

@@ -34,7 +34,7 @@ namespace AZ
             if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
             {
                 serializeContext->Class<DiffuseProbeGridComponentConfig>()
-                    ->Version(5) // Added EdgeBlendIbl
+                    ->Version(6) // Added EmissiveMultiplier
                     ->Field("ProbeSpacing", &DiffuseProbeGridComponentConfig::m_probeSpacing)
                     ->Field("Extents", &DiffuseProbeGridComponentConfig::m_extents)
                     ->Field("AmbientMultiplier", &DiffuseProbeGridComponentConfig::m_ambientMultiplier)
@@ -45,6 +45,7 @@ namespace AZ
                     ->Field("EdgeBlendIbl", &DiffuseProbeGridComponentConfig::m_edgeBlendIbl)
                     ->Field("FrameUpdateCount", &DiffuseProbeGridComponentConfig::m_frameUpdateCount)
                     ->Field("TransparencyMode", &DiffuseProbeGridComponentConfig::m_transparencyMode)
+                    ->Field("EmissiveMultiplier", &DiffuseProbeGridComponentConfig::m_emissiveMultiplier)
                     ->Field("EditorMode", &DiffuseProbeGridComponentConfig::m_editorMode)
                     ->Field("RuntimeMode", &DiffuseProbeGridComponentConfig::m_runtimeMode)
                     ->Field("BakedIrradianceTextureRelativePath", &DiffuseProbeGridComponentConfig::m_bakedIrradianceTextureRelativePath)
@@ -152,6 +153,7 @@ namespace AZ
             m_featureProcessor->SetEdgeBlendIbl(m_handle, m_configuration.m_edgeBlendIbl);
             m_featureProcessor->SetFrameUpdateCount(m_handle, m_configuration.m_frameUpdateCount);
             m_featureProcessor->SetTransparencyMode(m_handle, m_configuration.m_transparencyMode);
+            m_featureProcessor->SetEmissiveMultiplier(m_handle, m_configuration.m_emissiveMultiplier);
             m_featureProcessor->SetVisualizationEnabled(m_handle, m_configuration.m_visualizationEnabled);
             m_featureProcessor->SetVisualizationShowInactiveProbes(m_handle, m_configuration.m_visualizationShowInactiveProbes);
             m_featureProcessor->SetVisualizationSphereRadius(m_handle, m_configuration.m_visualizationSphereRadius);
@@ -402,6 +404,17 @@ namespace AZ
             m_featureProcessor->SetTransparencyMode(m_handle, m_configuration.m_transparencyMode);
         }
 
+        void DiffuseProbeGridComponentController::SetEmissiveMultiplier(float emissiveMultiplier)
+        {
+            if (!m_featureProcessor)
+            {
+                return;
+            }
+
+            m_configuration.m_emissiveMultiplier = emissiveMultiplier;
+            m_featureProcessor->SetEmissiveMultiplier(m_handle, m_configuration.m_emissiveMultiplier);
+        }
+
         void DiffuseProbeGridComponentController::SetEditorMode(DiffuseProbeGridMode editorMode)
         {
             if (!m_featureProcessor)

+ 2 - 0
Gems/DiffuseProbeGrid/Code/Source/Components/DiffuseProbeGridComponentController.h

@@ -40,6 +40,7 @@ namespace AZ
             bool m_edgeBlendIbl = true;
             uint32_t m_frameUpdateCount = 1;
             DiffuseProbeGridTransparencyMode m_transparencyMode = DiffuseProbeGridTransparencyMode::Full;
+            float m_emissiveMultiplier = DefaultDiffuseProbeGridEmissiveMultiplier;
 
             DiffuseProbeGridMode m_editorMode = DiffuseProbeGridMode::RealTime;
             DiffuseProbeGridMode m_runtimeMode = DiffuseProbeGridMode::RealTime;
@@ -114,6 +115,7 @@ namespace AZ
             void SetEdgeBlendIbl(bool edgeBlendIbl);
             void SetFrameUpdateCount(uint32_t frameUpdateCount);
             void SetTransparencyMode(DiffuseProbeGridTransparencyMode transparencyMode);
+            void SetEmissiveMultiplier(float emissiveMultiplier);
             void SetEditorMode(DiffuseProbeGridMode editorMode);
             void SetRuntimeMode(DiffuseProbeGridMode runtimeMode);
             void SetVisualizationEnabled(bool visualizationEnabled);

+ 13 - 0
Gems/DiffuseProbeGrid/Code/Source/EditorComponents/EditorDiffuseProbeGridComponent.cpp

@@ -45,6 +45,7 @@ namespace AZ
                     ->Field("edgeBlendIbl", &EditorDiffuseProbeGridComponent::m_edgeBlendIbl)
                     ->Field("frameUpdateCount", &EditorDiffuseProbeGridComponent::m_frameUpdateCount)
                     ->Field("transparencyMode", &EditorDiffuseProbeGridComponent::m_transparencyMode)
+                    ->Field("emissiveMultiplier", &EditorDiffuseProbeGridComponent::m_emissiveMultiplier)
                     ->Field("editorMode", &EditorDiffuseProbeGridComponent::m_editorMode)
                     ->Field("runtimeMode", &EditorDiffuseProbeGridComponent::m_runtimeMode)
                     ->Field("showVisualization", &EditorDiffuseProbeGridComponent::m_showVisualization)
@@ -120,6 +121,12 @@ namespace AZ
                                 ->EnumAttribute(DiffuseProbeGridTransparencyMode::ClosestOnly, "Closest Only")
                                 ->EnumAttribute(DiffuseProbeGridTransparencyMode::None, "None")
                                 ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDiffuseProbeGridComponent::OnTransparencyModeChanged)
+                            ->DataElement(AZ::Edit::UIHandlers::Slider, &EditorDiffuseProbeGridComponent::m_emissiveMultiplier, "Emissive Multiplier", "Multiplier for the emissive intensity")
+                                ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDiffuseProbeGridComponent::OnEmissiveMultiplierChanged)
+                                ->Attribute(Edit::Attributes::Decimals, 1)
+                                ->Attribute(Edit::Attributes::Step, 0.1f)
+                                ->Attribute(Edit::Attributes::Min, 0.0f)
+                                ->Attribute(Edit::Attributes::Max, 10.0f)
                         ->ClassElement(AZ::Edit::ClassElements::Group, "Visualization")
                             ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
                             ->DataElement(AZ::Edit::UIHandlers::CheckBox, &EditorDiffuseProbeGridComponent::m_showVisualization, "Show Visualization", "Show the probe grid visualization")
@@ -416,6 +423,12 @@ namespace AZ
             return AZ::Edit::PropertyRefreshLevels::None;
         }
 
+        AZ::u32 EditorDiffuseProbeGridComponent::OnEmissiveMultiplierChanged()
+        {
+            m_controller.SetEmissiveMultiplier(m_emissiveMultiplier);
+            return AZ::Edit::PropertyRefreshLevels::None;
+        }
+
         AZ::u32 EditorDiffuseProbeGridComponent::OnEditorModeChanged()
         {
             // this will update the configuration and also change the DiffuseProbeGrid mode

+ 3 - 1
Gems/DiffuseProbeGrid/Code/Source/EditorComponents/EditorDiffuseProbeGridComponent.h

@@ -72,6 +72,7 @@ namespace AZ
             AZ::u32 OnEdgeBlendIblChanged();
             AZ::u32 OnFrameUpdateCountChanged();
             AZ::u32 OnTransparencyModeChanged();
+            AZ::u32 OnEmissiveMultiplierChanged();
             AZ::u32 OnEditorModeChanged();
             AZ::u32 OnRuntimeModeChanged();
             AZ::u32 OnShowVisualizationChanged();
@@ -94,7 +95,8 @@ namespace AZ
             bool m_scrolling = false;
             bool m_edgeBlendIbl = true;
             uint32_t m_frameUpdateCount = 1;
-            DiffuseProbeGridTransparencyMode m_transparencyMode = DiffuseProbeGridTransparencyMode::Full;
+            DiffuseProbeGridTransparencyMode m_transparencyMode = DefaultDiffuseProbeGridTransparencyMode;
+            float m_emissiveMultiplier = DefaultDiffuseProbeGridEmissiveMultiplier;
             DiffuseProbeGridMode m_editorMode = DiffuseProbeGridMode::RealTime;
             DiffuseProbeGridMode m_runtimeMode = DiffuseProbeGridMode::RealTime;
             bool m_showVisualization = false;

+ 99 - 350
Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGrid.cpp

@@ -470,106 +470,51 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_prepareSrg.get(), "Failed to create Prepare shader resource group");
             }
 
-            RHI::ShaderInputBufferIndex bufferIndex;
-            RHI::ShaderInputConstantIndex constantIndex;
+            m_prepareSrg->SetBufferView(m_renderData->m_prepareSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgGridDataInitializedNameIndex, m_gridDataInitialized);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridOriginNameIndex, m_transform.GetTranslation());
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridRotationNameIndex, m_transform.GetRotation());
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeRayRotationNameIndex, m_probeRayRotation);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridMovementTypeNameIndex, (uint32_t)m_scrolling);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeSpacingNameIndex, m_probeSpacing);
 
-            bufferIndex = layout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_prepareSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_gridDataInitialized"));
-            m_prepareSrg->SetConstant(constantIndex, m_gridDataInitialized);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.origin"));
-            m_prepareSrg->SetConstant(constantIndex, m_transform.GetTranslation());
-
-            // pass identity for the rotation when scrolling is enabled
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.rotation"));
-            m_prepareSrg->SetConstant(constantIndex, m_transform.GetRotation());
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeRayRotation"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeRayRotation);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.movementType"));
-            m_prepareSrg->SetConstant(constantIndex, (uint32_t)m_scrolling);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeSpacing"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeSpacing);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeCounts"));
             uint32_t probeGridCounts[3];
             probeGridCounts[0] = m_probeCountX;
             probeGridCounts[1] = m_probeCountY;
             probeGridCounts[2] = m_probeCountZ;
-            m_prepareSrg->SetConstantRaw(constantIndex, &probeGridCounts[0], sizeof(probeGridCounts));
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeNumRays"));
-            m_prepareSrg->SetConstant(constantIndex, GetNumRaysPerProbe().m_rayCount);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeNumIrradianceTexels"));
-            m_prepareSrg->SetConstant(constantIndex, DefaultNumIrradianceTexels);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeNumDistanceTexels"));
-            m_prepareSrg->SetConstant(constantIndex, DefaultNumDistanceTexels);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeHysteresis"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeHysteresis);
+            m_prepareSrg->SetConstantRaw(m_renderData->m_prepareSrgProbeGridProbeCountsNameIndex, &probeGridCounts[0], sizeof(probeGridCounts));
 
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeMaxRayDistance"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeMaxRayDistance);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeNumRaysNameIndex, GetNumRaysPerProbe().m_rayCount);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeNumIrradianceTexelsNameIndex, DefaultNumIrradianceTexels);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeNumDistanceTexelsNameIndex, DefaultNumDistanceTexels);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeHysteresisNameIndex, m_probeHysteresis);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeMaxRayDistanceNameIndex, m_probeMaxRayDistance);
 
             // scale the normal bias based on the grid density to reduce artifacts on thin geometry, less density results in more bias
             float scaledNormalBias = m_normalBias + 0.15f * (m_probeSpacing.GetMaxElement() / 2.0f);
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeNormalBias"));
-            m_prepareSrg->SetConstant(constantIndex, scaledNormalBias);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeNormalBiasNameIndex, scaledNormalBias);
 
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeViewBias"));
-            m_prepareSrg->SetConstant(constantIndex, m_viewBias);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeViewBiasNameIndex, m_viewBias);
 
             // scale the probe distance exponent based on the grid density to reduce artifacts on thin geometry
             static const float MinProbeDistanceExponent = 50.0f;
             float scaledProbeDistanceExponent = AZStd::max(m_probeDistanceExponent * (m_probeSpacing.GetMaxElement() / 1.5f), MinProbeDistanceExponent);
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeDistanceExponent"));
-            m_prepareSrg->SetConstant(constantIndex, scaledProbeDistanceExponent);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeIrradianceThreshold"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeIrradianceThreshold);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeBrightnessThreshold"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeBrightnessThreshold);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeIrradianceEncodingGamma"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeIrradianceEncodingGamma);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeRandomRayBackfaceThreshold"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeRandomRayBackfaceThreshold);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeFixedRayBackfaceThreshold"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeFixedRayBackfaceThreshold);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeMinFrontfaceDistance"));
-            m_prepareSrg->SetConstant(constantIndex, m_probeMinFrontfaceDistance);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeScrollOffsets"));
-            m_prepareSrg->SetConstant(constantIndex, Vector3::CreateZero());
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeRayDataFormat"));
-            m_prepareSrg->SetConstant(constantIndex, 1);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeIrradianceFormat"));
-            m_prepareSrg->SetConstant(constantIndex, 1);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeRelocationEnabled"));
-            m_prepareSrg->SetConstant(constantIndex, true);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeClassificationEnabled"));
-            m_prepareSrg->SetConstant(constantIndex, true);
-
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeScrollClear[0]"));
-            m_prepareSrg->SetConstant(constantIndex, false);
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeScrollClear[1]"));
-            m_prepareSrg->SetConstant(constantIndex, false);
-            constantIndex = layout->FindShaderInputConstantIndex(AZ::Name("m_probeGrid.probeScrollClear[2]"));
-            m_prepareSrg->SetConstant(constantIndex, false);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeDistanceExponentNameIndex, scaledProbeDistanceExponent);
+
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeIrradianceThresholdNameIndex, m_probeIrradianceThreshold);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeBrightnessThresholdNameIndex, m_probeBrightnessThreshold);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeIrradianceEncodingGammaNameIndex, m_probeIrradianceEncodingGamma);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeRandomRayBackfaceThresholdNameIndex, m_probeRandomRayBackfaceThreshold);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeFixedRayBackfaceThresholdNameIndex, m_probeFixedRayBackfaceThreshold);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeMinFrontfaceDistanceNameIndex, m_probeMinFrontfaceDistance);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeScrollOffsetsNameIndex, Vector3::CreateZero());
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeRayDataFormatNameIndex, 1);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeIrradianceFormatNameIndex, 1);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeRelocationEnabledNameIndex, true);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeClassificationEnabledNameIndex, true);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeScrollClear0NameIndex, false);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeScrollClear1NameIndex, false);
+            m_prepareSrg->SetConstant(m_renderData->m_prepareSrgProbeGridProbeScrollClear2NameIndex, false);
 
             m_gridDataInitialized = true;
         }
@@ -582,49 +527,18 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_rayTraceSrg.get(), "Failed to create RayTrace shader resource group");
             }
 
-            const RHI::ShaderResourceGroupLayout* srgLayout = m_rayTraceSrg->GetLayout();
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            // grid data
-            bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_rayTraceSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            // probe raytrace
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeRayTrace"));
-            m_rayTraceSrg->SetImageView(imageIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
-
-            // probe irradiance
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeIrradiance"));
-            m_rayTraceSrg->SetImageView(imageIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-            // probe distance
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeDistance"));
-            m_rayTraceSrg->SetImageView(imageIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-            // probe data
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_rayTraceSrg->SetImageView(imageIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            // grid settings
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_ambientMultiplier"));
-            m_rayTraceSrg->SetConstant(constantIndex, m_ambientMultiplier);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_giShadows"));
-            m_rayTraceSrg->SetConstant(constantIndex, m_giShadows);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_useDiffuseIbl"));
-            m_rayTraceSrg->SetConstant(constantIndex, m_useDiffuseIbl);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateCount"));
-            m_rayTraceSrg->SetConstant(constantIndex, m_frameUpdateCount);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateIndex"));
-            m_rayTraceSrg->SetConstant(constantIndex, m_frameUpdateIndex);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_transparencyMode"));
-            m_rayTraceSrg->SetConstant(constantIndex, aznumeric_cast<uint32_t>(m_transparencyMode));
+            m_rayTraceSrg->SetBufferView(m_renderData->m_rayTraceSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
+            m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeIrradianceNameIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+            m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeDistanceNameIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+            m_rayTraceSrg->SetImageView(m_renderData->m_rayTraceSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgAmbientMultiplierNameIndex, m_ambientMultiplier);
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgGiShadowsNameIndex, m_giShadows);
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgUseDiffuseIblNameIndex, m_useDiffuseIbl);
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgTransparencyModeNameIndex, aznumeric_cast<uint32_t>(m_transparencyMode));
+            m_rayTraceSrg->SetConstant(m_renderData->m_rayTraceSrgEmissiveMultiplierNameIndex, m_emissiveMultiplier);
         }
 
         void DiffuseProbeGrid::UpdateBlendIrradianceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
@@ -635,28 +549,12 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_blendIrradianceSrg.get(), "Failed to create BlendIrradiance shader resource group");
             }
 
-            const RHI::ShaderResourceGroupLayout* srgLayout = m_blendIrradianceSrg->GetLayout();
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_blendIrradianceSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeRayTrace"));
-            m_blendIrradianceSrg->SetImageView(imageIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
-                    
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeIrradiance"));
-            m_blendIrradianceSrg->SetImageView(imageIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_blendIrradianceSrg->SetImageView(imageIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateCount"));
-            m_blendIrradianceSrg->SetConstant(constantIndex, m_frameUpdateCount);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateIndex"));
-            m_blendIrradianceSrg->SetConstant(constantIndex, m_frameUpdateIndex);
+            m_blendIrradianceSrg->SetBufferView(m_renderData->m_blendIrradianceSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_blendIrradianceSrg->SetImageView(m_renderData->m_blendIrradianceSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
+            m_blendIrradianceSrg->SetImageView(m_renderData->m_blendIrradianceSrgProbeIrradianceNameIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+            m_blendIrradianceSrg->SetImageView(m_renderData->m_blendIrradianceSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_blendIrradianceSrg->SetConstant(m_renderData->m_blendIrradianceSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
+            m_blendIrradianceSrg->SetConstant(m_renderData->m_blendIrradianceSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
         }
 
         void DiffuseProbeGrid::UpdateBlendDistanceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
@@ -667,28 +565,12 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_blendDistanceSrg.get(), "Failed to create BlendDistance shader resource group");
             }
 
-            const RHI::ShaderResourceGroupLayout* srgLayout = m_blendDistanceSrg->GetLayout();
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_blendDistanceSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeRayTrace"));
-            m_blendDistanceSrg->SetImageView(imageIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeDistance"));
-            m_blendDistanceSrg->SetImageView(imageIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_blendDistanceSrg->SetImageView(imageIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateCount"));
-            m_blendDistanceSrg->SetConstant(constantIndex, m_frameUpdateCount);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateIndex"));
-            m_blendDistanceSrg->SetConstant(constantIndex, m_frameUpdateIndex);
+            m_blendDistanceSrg->SetBufferView(m_renderData->m_blendDistanceSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_blendDistanceSrg->SetImageView(m_renderData->m_blendDistanceSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
+            m_blendDistanceSrg->SetImageView(m_renderData->m_blendDistanceSrgProbeDistanceNameIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+            m_blendDistanceSrg->SetImageView(m_renderData->m_blendDistanceSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_blendDistanceSrg->SetConstant(m_renderData->m_blendDistanceSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
+            m_blendDistanceSrg->SetConstant(m_renderData->m_blendDistanceSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
         }
 
         void DiffuseProbeGrid::UpdateBorderUpdateSrgs(
@@ -703,15 +585,8 @@ namespace AZ
                     AZ_Error("DiffuseProbeGrid", m_borderUpdateRowIrradianceSrg.get(), "Failed to create BorderUpdateRowIrradiance shader resource group");
                 }
 
-                const RHI::ShaderResourceGroupLayout* srgLayout = m_borderUpdateRowIrradianceSrg->GetLayout();
-                RHI::ShaderInputConstantIndex constantIndex;
-                RHI::ShaderInputImageIndex imageIndex;
-
-                imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeTexture"));
-                m_borderUpdateRowIrradianceSrg->SetImageView(imageIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-                constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_numTexels"));
-                m_borderUpdateRowIrradianceSrg->SetConstant(constantIndex, DefaultNumIrradianceTexels);
+                m_borderUpdateRowIrradianceSrg->SetImageView(m_renderData->m_borderUpdateRowIrradianceSrgProbeTextureNameIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+                m_borderUpdateRowIrradianceSrg->SetConstant(m_renderData->m_borderUpdateRowIrradianceSrgNumTexelsNameIndex, DefaultNumIrradianceTexels);
             }
 
             // border update column irradiance
@@ -722,15 +597,8 @@ namespace AZ
                     AZ_Error("DiffuseProbeGrid", m_borderUpdateColumnIrradianceSrg.get(), "Failed to create BorderUpdateColumnRowIrradiance shader resource group");
                 }
 
-                const RHI::ShaderResourceGroupLayout* srgLayout = m_borderUpdateColumnIrradianceSrg->GetLayout();
-                RHI::ShaderInputConstantIndex constantIndex;
-                RHI::ShaderInputImageIndex imageIndex;
-
-                imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeTexture"));
-                m_borderUpdateColumnIrradianceSrg->SetImageView(imageIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-                constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_numTexels"));
-                m_borderUpdateColumnIrradianceSrg->SetConstant(constantIndex, DefaultNumIrradianceTexels);
+                m_borderUpdateColumnIrradianceSrg->SetImageView(m_renderData->m_borderUpdateColumnIrradianceSrgProbeTextureNameIndex, m_irradianceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+                m_borderUpdateColumnIrradianceSrg->SetConstant(m_renderData->m_borderUpdateColumnIrradianceSrgNumTexelsNameIndex, DefaultNumIrradianceTexels);
             }
 
             // border update row distance
@@ -741,15 +609,8 @@ namespace AZ
                     AZ_Error("DiffuseProbeGrid", m_borderUpdateRowDistanceSrg.get(), "Failed to create BorderUpdateRowDistance shader resource group");
                 }
 
-                const RHI::ShaderResourceGroupLayout* srgLayout = m_borderUpdateRowDistanceSrg->GetLayout();
-                RHI::ShaderInputConstantIndex constantIndex;
-                RHI::ShaderInputImageIndex imageIndex;
-
-                imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeTexture"));
-                m_borderUpdateRowDistanceSrg->SetImageView(imageIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-                constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_numTexels"));
-                m_borderUpdateRowDistanceSrg->SetConstant(constantIndex, DefaultNumDistanceTexels);
+                m_borderUpdateRowDistanceSrg->SetImageView(m_renderData->m_borderUpdateRowDistanceSrgProbeTextureNameIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+                m_borderUpdateRowDistanceSrg->SetConstant(m_renderData->m_borderUpdateRowDistanceSrgNumTexelsNameIndex, DefaultNumDistanceTexels);
             }
 
             // border update column distance
@@ -760,15 +621,8 @@ namespace AZ
                     AZ_Error("DiffuseProbeGrid", m_borderUpdateColumnDistanceSrg.get(), "Failed to create BorderUpdateColumnRowDistance shader resource group");
                 }
 
-                const RHI::ShaderResourceGroupLayout* srgLayout = m_borderUpdateColumnDistanceSrg->GetLayout();
-                RHI::ShaderInputConstantIndex constantIndex;
-                RHI::ShaderInputImageIndex imageIndex;
-
-                imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeTexture"));
-                m_borderUpdateColumnDistanceSrg->SetImageView(imageIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-                constantIndex = srgLayout->FindShaderInputConstantIndex(AZ::Name("m_numTexels"));
-                m_borderUpdateColumnDistanceSrg->SetConstant(constantIndex, DefaultNumDistanceTexels);
+                m_borderUpdateColumnDistanceSrg->SetImageView(m_renderData->m_borderUpdateColumnDistanceSrgProbeTextureNameIndex, m_distanceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+                m_borderUpdateColumnDistanceSrg->SetConstant(m_renderData->m_borderUpdateColumnDistanceSrgNumTexelsNameIndex, DefaultNumDistanceTexels);
             }
         }
 
@@ -780,25 +634,11 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_relocationSrg.get(), "Failed to create Relocation shader resource group");
             }
 
-            const RHI::ShaderResourceGroupLayout* srgLayout = m_relocationSrg->GetLayout();
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_relocationSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeRayTrace"));
-            m_relocationSrg->SetImageView(imageIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_relocationSrg->SetImageView(imageIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateCount"));
-            m_relocationSrg->SetConstant(constantIndex, m_frameUpdateCount);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateIndex"));
-            m_relocationSrg->SetConstant(constantIndex, m_frameUpdateIndex);
+            m_relocationSrg->SetBufferView(m_renderData->m_relocationSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_relocationSrg->SetImageView(m_renderData->m_relocationSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
+            m_relocationSrg->SetImageView(m_renderData->m_relocationSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_relocationSrg->SetConstant(m_renderData->m_relocationSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
+            m_relocationSrg->SetConstant(m_renderData->m_relocationSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
         }
 
         void DiffuseProbeGrid::UpdateClassificationSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
@@ -809,25 +649,11 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_classificationSrg.get(), "Failed to create Classification shader resource group");
             }
 
-            const RHI::ShaderResourceGroupLayout* srgLayout = m_classificationSrg->GetLayout();
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_classificationSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeRayTrace"));
-            m_classificationSrg->SetImageView(imageIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_classificationSrg->SetImageView(imageIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateCount"));
-            m_classificationSrg->SetConstant(constantIndex, m_frameUpdateCount);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_frameUpdateIndex"));
-            m_classificationSrg->SetConstant(constantIndex, m_frameUpdateIndex);
+            m_classificationSrg->SetBufferView(m_renderData->m_classificationSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_classificationSrg->SetImageView(m_renderData->m_classificationSrgProbeRayTraceNameIndex, m_rayTraceImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeRayTraceImageViewDescriptor).get());
+            m_classificationSrg->SetImageView(m_renderData->m_classificationSrgProbeDataNameIndex, m_probeDataImage[m_currentImageIndex]->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_classificationSrg->SetConstant(m_renderData->m_classificationSrgFrameUpdateCountNameIndex, m_frameUpdateCount);
+            m_classificationSrg->SetConstant(m_renderData->m_classificationSrgFrameUpdateIndexNameIndex, m_frameUpdateIndex);
         }
 
         void DiffuseProbeGrid::UpdateRenderObjectSrg()
@@ -843,42 +669,21 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_renderObjectSrg.get(), "Failed to create render shader resource group");
             }
 
-            const RHI::ShaderResourceGroupLayout* srgLayout = m_renderObjectSrg->GetLayout();
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            bufferIndex = srgLayout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_renderObjectSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_renderObjectSrg->SetBufferView(m_renderData->m_renderSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
 
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_modelToWorld"));
             AZ::Matrix3x4 modelToWorld = AZ::Matrix3x4::CreateFromTransform(m_transform) * AZ::Matrix3x4::CreateScale(m_renderExtents);
-            m_renderObjectSrg->SetConstant(constantIndex, modelToWorld);
+            m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgModelToWorldNameIndex, modelToWorld);
 
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_modelToWorldInverse"));
             AZ::Matrix3x4 modelToWorldInverse = modelToWorld.GetInverseFull();
-            m_renderObjectSrg->SetConstant(constantIndex, modelToWorldInverse);
+            m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgModelToWorldInverseNameIndex, modelToWorldInverse);
 
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_obbHalfLengths"));
-            m_renderObjectSrg->SetConstant(constantIndex, m_obbWs.GetHalfLengths());
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_enableDiffuseGI"));
-            m_renderObjectSrg->SetConstant(constantIndex, m_enabled);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_ambientMultiplier"));
-            m_renderObjectSrg->SetConstant(constantIndex, m_ambientMultiplier);
-
-            constantIndex = srgLayout->FindShaderInputConstantIndex(Name("m_edgeBlendIbl"));
-            m_renderObjectSrg->SetConstant(constantIndex, m_edgeBlendIbl);
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(Name("m_probeIrradiance"));
-            m_renderObjectSrg->SetImageView(imageIndex, GetIrradianceImage()->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(Name("m_probeDistance"));
-            m_renderObjectSrg->SetImageView(imageIndex, GetDistanceImage()->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-            imageIndex = srgLayout->FindShaderInputImageIndex(Name("m_probeData"));
-            m_renderObjectSrg->SetImageView(imageIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgObbHalfLengthsNameIndex, m_obbWs.GetHalfLengths());
+            m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgEnableDiffuseGiNameIndex, m_enabled);
+            m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgAmbientMultiplierNameIndex, m_ambientMultiplier);
+            m_renderObjectSrg->SetConstant(m_renderData->m_renderSrgEdgeBlendIblNameIndex, m_edgeBlendIbl);
+            m_renderObjectSrg->SetImageView(m_renderData->m_renderSrgProbeIrradianceNameIndex, GetIrradianceImage()->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+            m_renderObjectSrg->SetImageView(m_renderData->m_renderSrgProbeDistanceNameIndex, GetDistanceImage()->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+            m_renderObjectSrg->SetImageView(m_renderData->m_renderSrgProbeDataNameIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
 
             m_updateRenderObjectSrg = false;
 
@@ -894,27 +699,13 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_visualizationPrepareSrg.get(), "Failed to create VisualizationPrepare shader resource group");
             }
 
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            // TLAS instances
-            bufferIndex = layout->FindShaderInputBufferIndex(AZ::Name("m_tlasInstances"));
             uint32_t tlasInstancesBufferByteCount = aznumeric_cast<uint32_t>(m_visualizationTlas->GetTlasInstancesBuffer()->GetDescriptor().m_byteCount);
             RHI::BufferViewDescriptor bufferViewDescriptor = RHI::BufferViewDescriptor::CreateStructured(0, tlasInstancesBufferByteCount / RayTracingTlasInstanceElementSize, RayTracingTlasInstanceElementSize);
-            m_visualizationPrepareSrg->SetBufferView(bufferIndex, m_visualizationTlas->GetTlasInstancesBuffer()->GetBufferView(bufferViewDescriptor).get());
-
-            // grid data
-            bufferIndex = layout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_visualizationPrepareSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            // probe data
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_visualizationPrepareSrg->SetImageView(imageIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_visualizationPrepareSrg->SetBufferView(m_renderData->m_visualizationPrepareSrgTlasInstancesNameIndex, m_visualizationTlas->GetTlasInstancesBuffer()->GetBufferView(bufferViewDescriptor).get());
 
-            // probe sphere radius
-            constantIndex = layout->FindShaderInputConstantIndex(Name("m_probeSphereRadius"));
-            m_visualizationPrepareSrg->SetConstant(constantIndex, m_visualizationSphereRadius);
+            m_visualizationPrepareSrg->SetBufferView(m_renderData->m_visualizationPrepareSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_visualizationPrepareSrg->SetImageView(m_renderData->m_visualizationPrepareSrgProbeDataNameIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_visualizationPrepareSrg->SetConstant(m_renderData->m_visualizationPrepareSrgProbeSphereRadiusNameIndex, m_visualizationSphereRadius);
         }
 
         void DiffuseProbeGrid::UpdateVisualizationRayTraceSrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout, const RHI::ImageView* outputImageView)
@@ -925,40 +716,16 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_visualizationRayTraceSrg.get(), "Failed to create VisualizationRayTrace shader resource group");
             }
 
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-
-            // TLAS
             uint32_t tlasBufferByteCount = aznumeric_cast<uint32_t>(m_visualizationTlas->GetTlasBuffer()->GetDescriptor().m_byteCount);
             RHI::BufferViewDescriptor bufferViewDescriptor = RHI::BufferViewDescriptor::CreateRayTracingTLAS(tlasBufferByteCount);
+            m_visualizationRayTraceSrg->SetBufferView(m_renderData->m_visualizationRayTraceSrgTlasNameIndex, m_visualizationTlas->GetTlasBuffer()->GetBufferView(bufferViewDescriptor).get());
 
-            bufferIndex = layout->FindShaderInputBufferIndex(AZ::Name("m_tlas"));
-            m_visualizationRayTraceSrg->SetBufferView(bufferIndex, m_visualizationTlas->GetTlasBuffer()->GetBufferView(bufferViewDescriptor).get());
-
-            // grid data
-            bufferIndex = layout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_visualizationRayTraceSrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            // probe irradiance
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeIrradiance"));
-            m_visualizationRayTraceSrg->SetImageView(imageIndex, GetIrradianceImage()->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-            // probe distance
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeDistance"));
-            m_visualizationRayTraceSrg->SetImageView(imageIndex, GetDistanceImage()->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-            // probe data
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_visualizationRayTraceSrg->SetImageView(imageIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            // show inactive probes
-            constantIndex = layout->FindShaderInputConstantIndex(Name("m_showInactiveProbes"));
-            m_visualizationRayTraceSrg->SetConstant(constantIndex, m_visualizationShowInactiveProbes);
-
-            // output
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_output"));
-            m_visualizationRayTraceSrg->SetImageView(imageIndex, outputImageView);
+            m_visualizationRayTraceSrg->SetBufferView(m_renderData->m_visualizationRayTraceSrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgProbeIrradianceNameIndex, GetIrradianceImage()->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+            m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgProbeDistanceNameIndex, GetDistanceImage()->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+            m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgProbeDataNameIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_visualizationRayTraceSrg->SetConstant(m_renderData->m_visualizationRayTraceSrgShowInactiveProbesNameIndex, m_visualizationShowInactiveProbes);
+            m_visualizationRayTraceSrg->SetImageView(m_renderData->m_visualizationRayTraceSrgOutputNameIndex, outputImageView);
         }
 
         void DiffuseProbeGrid::UpdateQuerySrg(const Data::Instance<RPI::Shader>& shader, const RHI::Ptr<RHI::ShaderResourceGroupLayout>& layout)
@@ -969,29 +736,11 @@ namespace AZ
                 AZ_Error("DiffuseProbeGrid", m_querySrg.get(), "Failed to create Query shader resource group");
             }
 
-            RHI::ShaderInputConstantIndex constantIndex;
-            RHI::ShaderInputBufferIndex bufferIndex;
-            RHI::ShaderInputImageIndex imageIndex;
-
-            // grid data
-            bufferIndex = layout->FindShaderInputBufferIndex(AZ::Name("m_gridData"));
-            m_querySrg->SetBufferView(bufferIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
-
-            // probe irradiance
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeIrradiance"));
-            m_querySrg->SetImageView(imageIndex, GetIrradianceImage()->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
-
-            // probe distance
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeDistance"));
-            m_querySrg->SetImageView(imageIndex, GetDistanceImage()->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
-
-            // probe data
-            imageIndex = layout->FindShaderInputImageIndex(AZ::Name("m_probeData"));
-            m_querySrg->SetImageView(imageIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
-
-            // ambient multiplier
-            constantIndex = layout->FindShaderInputConstantIndex(Name("m_ambientMultiplier"));
-            m_querySrg->SetConstant(constantIndex, m_ambientMultiplier);
+            m_querySrg->SetBufferView(m_renderData->m_querySrgGridDataNameIndex, m_gridDataBuffer->GetBufferView(m_renderData->m_gridDataBufferViewDescriptor).get());
+            m_querySrg->SetImageView(m_renderData->m_querySrgProbeIrradianceNameIndex, GetIrradianceImage()->GetImageView(m_renderData->m_probeIrradianceImageViewDescriptor).get());
+            m_querySrg->SetImageView(m_renderData->m_querySrgProbeDistanceNameIndex, GetDistanceImage()->GetImageView(m_renderData->m_probeDistanceImageViewDescriptor).get());
+            m_querySrg->SetImageView(m_renderData->m_querySrgProbeDataNameIndex, GetProbeDataImage()->GetImageView(m_renderData->m_probeDataImageViewDescriptor).get());
+            m_querySrg->SetConstant(m_renderData->m_querySrgAmbientMultiplierNameIndex, m_ambientMultiplier);
         }
 
         void DiffuseProbeGrid::UpdateCulling()

+ 120 - 6
Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGrid.h

@@ -55,6 +55,116 @@ namespace AZ
 
             // render drawlist tag
             RHI::DrawListTag m_drawListTag;
+
+            // Srg input indices
+            RHI::ShaderInputNameIndex m_prepareSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_prepareSrgGridDataInitializedNameIndex = "m_gridDataInitialized";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridOriginNameIndex = "m_probeGrid.origin";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridRotationNameIndex = "m_probeGrid.rotation";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeRayRotationNameIndex = "m_probeGrid.probeRayRotation";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridMovementTypeNameIndex = "m_probeGrid.movementType";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeSpacingNameIndex = "m_probeGrid.probeSpacing";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeCountsNameIndex = "m_probeGrid.probeCounts";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeNumRaysNameIndex = "m_probeGrid.probeNumRays";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeNumIrradianceTexelsNameIndex = "m_probeGrid.probeNumIrradianceTexels";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeNumDistanceTexelsNameIndex = "m_probeGrid.probeNumDistanceTexels";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeHysteresisNameIndex = "m_probeGrid.probeHysteresis";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeMaxRayDistanceNameIndex = "m_probeGrid.probeMaxRayDistance";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeNormalBiasNameIndex = "m_probeGrid.probeNormalBias";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeViewBiasNameIndex = "m_probeGrid.probeViewBias";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeDistanceExponentNameIndex = "m_probeGrid.probeDistanceExponent";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeIrradianceThresholdNameIndex = "m_probeGrid.probeIrradianceThreshold";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeBrightnessThresholdNameIndex = "m_probeGrid.probeBrightnessThreshold";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeIrradianceEncodingGammaNameIndex = "m_probeGrid.probeIrradianceEncodingGamma";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeRandomRayBackfaceThresholdNameIndex = "m_probeGrid.probeRandomRayBackfaceThreshold";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeFixedRayBackfaceThresholdNameIndex = "m_probeGrid.probeFixedRayBackfaceThreshold";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeMinFrontfaceDistanceNameIndex = "m_probeGrid.probeMinFrontfaceDistance";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeScrollOffsetsNameIndex = "m_probeGrid.probeScrollOffsets";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeRayDataFormatNameIndex = "m_probeGrid.probeRayDataFormat";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeIrradianceFormatNameIndex = "m_probeGrid.probeIrradianceFormat";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeRelocationEnabledNameIndex = "m_probeGrid.probeRelocationEnabled";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeClassificationEnabledNameIndex = "m_probeGrid.probeClassificationEnabled";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeScrollClear0NameIndex = "m_probeGrid.probeScrollClear[0]";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeScrollClear1NameIndex = "m_probeGrid.probeScrollClear[1]";
+            RHI::ShaderInputNameIndex m_prepareSrgProbeGridProbeScrollClear2NameIndex = "m_probeGrid.probeScrollClear[2]";
+
+            RHI::ShaderInputNameIndex m_rayTraceSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_rayTraceSrgProbeRayTraceNameIndex = "m_probeRayTrace";
+            RHI::ShaderInputNameIndex m_rayTraceSrgProbeIrradianceNameIndex = "m_probeIrradiance";
+            RHI::ShaderInputNameIndex m_rayTraceSrgProbeDistanceNameIndex = "m_probeDistance";
+            RHI::ShaderInputNameIndex m_rayTraceSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_rayTraceSrgAmbientMultiplierNameIndex = "m_ambientMultiplier";
+            RHI::ShaderInputNameIndex m_rayTraceSrgGiShadowsNameIndex = "m_giShadows";
+            RHI::ShaderInputNameIndex m_rayTraceSrgUseDiffuseIblNameIndex = "m_useDiffuseIbl";
+            RHI::ShaderInputNameIndex m_rayTraceSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
+            RHI::ShaderInputNameIndex m_rayTraceSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
+            RHI::ShaderInputNameIndex m_rayTraceSrgTransparencyModeNameIndex = "m_transparencyMode";
+            RHI::ShaderInputNameIndex m_rayTraceSrgEmissiveMultiplierNameIndex = "m_emissiveMultiplier";
+
+            RHI::ShaderInputNameIndex m_blendIrradianceSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_blendIrradianceSrgProbeRayTraceNameIndex = "m_probeRayTrace";
+            RHI::ShaderInputNameIndex m_blendIrradianceSrgProbeIrradianceNameIndex = "m_probeIrradiance";
+            RHI::ShaderInputNameIndex m_blendIrradianceSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_blendIrradianceSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
+            RHI::ShaderInputNameIndex m_blendIrradianceSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
+
+            RHI::ShaderInputNameIndex m_blendDistanceSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_blendDistanceSrgProbeRayTraceNameIndex = "m_probeRayTrace";
+            RHI::ShaderInputNameIndex m_blendDistanceSrgProbeDistanceNameIndex = "m_probeDistance";
+            RHI::ShaderInputNameIndex m_blendDistanceSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_blendDistanceSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
+            RHI::ShaderInputNameIndex m_blendDistanceSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
+
+            RHI::ShaderInputNameIndex m_borderUpdateRowIrradianceSrgProbeTextureNameIndex = "m_probeTexture";
+            RHI::ShaderInputNameIndex m_borderUpdateRowIrradianceSrgNumTexelsNameIndex = "m_numTexels";
+            RHI::ShaderInputNameIndex m_borderUpdateColumnIrradianceSrgProbeTextureNameIndex = "m_probeTexture";
+            RHI::ShaderInputNameIndex m_borderUpdateColumnIrradianceSrgNumTexelsNameIndex = "m_numTexels";
+            RHI::ShaderInputNameIndex m_borderUpdateRowDistanceSrgProbeTextureNameIndex = "m_probeTexture";
+            RHI::ShaderInputNameIndex m_borderUpdateRowDistanceSrgNumTexelsNameIndex = "m_numTexels";
+            RHI::ShaderInputNameIndex m_borderUpdateColumnDistanceSrgProbeTextureNameIndex = "m_probeTexture";
+            RHI::ShaderInputNameIndex m_borderUpdateColumnDistanceSrgNumTexelsNameIndex = "m_numTexels";
+
+            RHI::ShaderInputNameIndex m_relocationSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_relocationSrgProbeRayTraceNameIndex = "m_probeRayTrace";
+            RHI::ShaderInputNameIndex m_relocationSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_relocationSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
+            RHI::ShaderInputNameIndex m_relocationSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
+
+            RHI::ShaderInputNameIndex m_classificationSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_classificationSrgProbeRayTraceNameIndex = "m_probeRayTrace";
+            RHI::ShaderInputNameIndex m_classificationSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_classificationSrgFrameUpdateCountNameIndex = "m_frameUpdateCount";
+            RHI::ShaderInputNameIndex m_classificationSrgFrameUpdateIndexNameIndex = "m_frameUpdateIndex";
+
+            RHI::ShaderInputNameIndex m_renderSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_renderSrgModelToWorldNameIndex = "m_modelToWorld";
+            RHI::ShaderInputNameIndex m_renderSrgModelToWorldInverseNameIndex = "m_modelToWorldInverse";
+            RHI::ShaderInputNameIndex m_renderSrgObbHalfLengthsNameIndex = "m_obbHalfLengths";
+            RHI::ShaderInputNameIndex m_renderSrgEnableDiffuseGiNameIndex = "m_enableDiffuseGI";
+            RHI::ShaderInputNameIndex m_renderSrgAmbientMultiplierNameIndex = "m_ambientMultiplier";
+            RHI::ShaderInputNameIndex m_renderSrgEdgeBlendIblNameIndex = "m_edgeBlendIbl";
+            RHI::ShaderInputNameIndex m_renderSrgProbeIrradianceNameIndex = "m_probeIrradiance";
+            RHI::ShaderInputNameIndex m_renderSrgProbeDistanceNameIndex = "m_probeDistance";
+            RHI::ShaderInputNameIndex m_renderSrgProbeDataNameIndex = "m_probeData";
+
+            RHI::ShaderInputNameIndex m_visualizationPrepareSrgTlasInstancesNameIndex = "m_tlasInstances";
+            RHI::ShaderInputNameIndex m_visualizationPrepareSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_visualizationPrepareSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_visualizationPrepareSrgProbeSphereRadiusNameIndex = "m_probeSphereRadius";
+
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgTlasNameIndex = "m_tlas";
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgProbeIrradianceNameIndex = "m_probeIrradiance";
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgProbeDistanceNameIndex = "m_probeDistance";
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgShowInactiveProbesNameIndex = "m_showInactiveProbes";
+            RHI::ShaderInputNameIndex m_visualizationRayTraceSrgOutputNameIndex = "m_output";
+
+            RHI::ShaderInputNameIndex m_querySrgGridDataNameIndex = "m_gridData";
+            RHI::ShaderInputNameIndex m_querySrgProbeIrradianceNameIndex = "m_probeIrradiance";
+            RHI::ShaderInputNameIndex m_querySrgProbeDistanceNameIndex = "m_probeDistance";
+            RHI::ShaderInputNameIndex m_querySrgProbeDataNameIndex = "m_probeData";
+            RHI::ShaderInputNameIndex m_querySrgAmbientMultiplierNameIndex = "m_ambientMultiplier";
         };
 
         //! This class manages contains the functionality necessary to update diffuse probes and
@@ -117,6 +227,9 @@ namespace AZ
             DiffuseProbeGridTransparencyMode GetTransparencyMode() const { return m_transparencyMode; }
             void SetTransparencyMode(DiffuseProbeGridTransparencyMode transparencyMode) { m_transparencyMode = transparencyMode; }
 
+            float GetEmissiveMultiplier() const { return m_emissiveMultiplier; }
+            void SetEmissiveMultiplier(float emissiveMultiplier) { m_emissiveMultiplier = emissiveMultiplier; }
+
             bool GetVisualizationEnabled() const { return m_visualizationEnabled; }
             void SetVisualizationEnabled(bool visualizationEnabled);
 
@@ -249,8 +362,8 @@ namespace AZ
 
             // grid settings
             bool  m_enabled = true;
-            float m_normalBias = 0.6f;
-            float m_viewBias = 0.01f;
+            float m_normalBias = DefaultDiffuseProbeGridNormalBias;
+            float m_viewBias = DefaultDiffuseProbeGridViewBias;
             float m_probeMaxRayDistance = 30.0f;
             float m_probeDistanceExponent = 50.0f;
             float m_probeHysteresis = 0.95f;
@@ -260,14 +373,15 @@ namespace AZ
             float m_probeMinFrontfaceDistance = 1.0f;
             float m_probeRandomRayBackfaceThreshold = 0.1f;
             float m_probeFixedRayBackfaceThreshold = 0.25f;
-            float m_ambientMultiplier = 1.0f;
+            float m_ambientMultiplier = DefaultDiffuseProbeGridAmbientMultiplier;
             bool  m_giShadows = true;
             bool  m_useDiffuseIbl = true;
             bool  m_scrolling = false;
             bool  m_edgeBlendIbl = true;
+            float m_emissiveMultiplier = DefaultDiffuseProbeGridEmissiveMultiplier;
 
-            DiffuseProbeGridNumRaysPerProbe m_numRaysPerProbe = DiffuseProbeGridNumRaysPerProbe::NumRaysPerProbe_288;
-            DiffuseProbeGridTransparencyMode m_transparencyMode = DiffuseProbeGridTransparencyMode::Full;
+            DiffuseProbeGridNumRaysPerProbe m_numRaysPerProbe = DefaultDiffuseProbeGridNumRaysPerProbe;
+            DiffuseProbeGridTransparencyMode m_transparencyMode = DefaultDiffuseProbeGridTransparencyMode;
 
             // frame count and current frame index for alternating probe updates across frames
             uint32_t m_frameUpdateCount = 1;
@@ -349,7 +463,7 @@ namespace AZ
             // probe visualization
             bool m_visualizationEnabled = false;
             bool m_visualizationShowInactiveProbes = false;
-            float m_visualizationSphereRadius = 0.5f;
+            float m_visualizationSphereRadius = DefaultVisualizationSphereRadius;
             RHI::Ptr<RHI::RayTracingTlas> m_visualizationTlas;
             bool m_visualizationTlasUpdateRequired = false;
             RHI::AttachmentId m_visualizationTlasAttachmentId;

+ 6 - 0
Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGridFeatureProcessor.cpp

@@ -563,6 +563,12 @@ namespace AZ
             probeGrid->SetTransparencyMode(transparencyMode);
         }
 
+        void DiffuseProbeGridFeatureProcessor::SetEmissiveMultiplier(const DiffuseProbeGridHandle& probeGrid, float emissiveMultiplier)
+        {
+            AZ_Assert(probeGrid.get(), "SetEmissiveMultiplier called with an invalid handle");
+            probeGrid->SetEmissiveMultiplier(emissiveMultiplier);
+        }
+
         void DiffuseProbeGridFeatureProcessor::SetBakedTextures(const DiffuseProbeGridHandle& probeGrid, const DiffuseProbeGridBakedTextures& bakedTextures)
         {
             AZ_Assert(probeGrid.get(), "SetBakedTextures called with an invalid handle");

+ 1 - 0
Gems/DiffuseProbeGrid/Code/Source/Render/DiffuseProbeGridFeatureProcessor.h

@@ -53,6 +53,7 @@ namespace AZ
             void SetEdgeBlendIbl(const DiffuseProbeGridHandle& probeGrid, bool edgeBlendIbl) override;
             void SetFrameUpdateCount(const DiffuseProbeGridHandle& probeGrid, uint32_t frameUpdateCount) override;
             void SetTransparencyMode(const DiffuseProbeGridHandle& probeGrid, DiffuseProbeGridTransparencyMode transparencyMode) override;
+            void SetEmissiveMultiplier(const DiffuseProbeGridHandle& probeGrid, float emissiveMultiplier) override;
             void SetBakedTextures(const DiffuseProbeGridHandle& probeGrid, const DiffuseProbeGridBakedTextures& bakedTextures) override;
             void SetVisualizationEnabled(const DiffuseProbeGridHandle& probeGrid, bool visualizationEnabled) override;
             void SetVisualizationShowInactiveProbes(const DiffuseProbeGridHandle& probeGrid, bool visualizationShowInactiveProbes) override;