Просмотр исходного кода

Updated the RPI MSAA sample to use the NoMSAA supervariant and specify the number of MSAA samples in the RenderPipelineDescriptor.
The sample now uses the MainPipeline for all modes, including non-MSAA.
Updated other samples to account for changes to the shader system.

Doug McDiarmid 4 лет назад
Родитель
Сommit
12eadceed5

+ 1 - 1
Gem/Code/Source/BloomExampleComponent.cpp

@@ -367,7 +367,7 @@ namespace AtomSampleViewer
             m_colorSpaceIndex.Reset();
         }
 
-        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
+        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, m_srgLayout->GetName());
         m_drawImage.m_wasStreamed = false;
 
         // Set the image to occupy the full screen.

+ 5 - 0
Gem/Code/Source/CommonSampleComponentBase.cpp

@@ -284,4 +284,9 @@ namespace AtomSampleViewer
             });
     }
 
+    void CommonSampleComponentBase::ResetScene()
+    {
+        m_meshFeatureProcessor = nullptr;
+    }
+
 } // namespace AtomSampleViewer

+ 3 - 0
Gem/Code/Source/CommonSampleComponentBase.h

@@ -62,6 +62,9 @@ namespace AtomSampleViewer
         //! Clear all lighting presets.
         void ClearLightingPresets();
 
+        //! Reset internal scene related data
+        void ResetScene();
+
         //! Apply lighting presets to the scene.
         //! Derived samples can override this function to have custom behaviors.
         virtual void OnLightingPresetSelected(const AZ::Render::LightingPreset& preset, bool useAltSkybox);

+ 96 - 81
Gem/Code/Source/MSAA_RPI_ExampleComponent.cpp

@@ -17,10 +17,12 @@
 
 #include <Atom/RPI.Public/View.h>
 #include <Atom/RPI.Public/Image/StreamingImage.h>
+#include <Atom/RPI.Public/Shader/ShaderSystemInterface.h>
 
 #include <Atom/RPI.Reflect/Asset/AssetUtils.h>
 #include <Atom/RPI.Reflect/Model/ModelAsset.h>
 #include <Atom/RPI.Reflect/Material/MaterialAsset.h>
+#include <Atom/RPI.Reflect/Shader/ShaderCommonTypes.h>
 
 #include <Utils/Utils.h>
 
@@ -34,23 +36,6 @@
 
 namespace AtomSampleViewer
 {
-    static const char* GetPipelineName(int numSamples)
-    {
-        switch (numSamples)
-        {
-        case 1:
-            return "No_MSAA_RPI_Pipeline";
-        case 2:
-            return "MSAA_2x_RPI_Pipeline";
-        case 4:
-            return "MSAA_4x_RPI_Pipeline";
-        case 8:
-            return "MSAA_8x_RPI_Pipeline";
-        }
-        AZ_Warning("MSAA_RPI_ExampleComponent", false, "Unsupported number of samples, defaulting to 1");
-        return "No_MSAA_RPI_Pipeline";
-    }
-
     void MSAA_RPI_ExampleComponent::Reflect(AZ::ReflectContext* context)
     {
         if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
@@ -61,41 +46,22 @@ namespace AtomSampleViewer
         }
     }
 
-    void MSAA_RPI_ExampleComponent::Activate()
-    {
-        m_imguiSidebar.Activate();
-        AZ::TickBus::Handler::BusConnect();
-        ExampleComponentRequestBus::Handler::BusConnect(GetEntityId());
-        AZ::Render::Bootstrap::DefaultWindowNotificationBus::Handler::BusConnect();
-        ActivateMSAAPipeline();
-        EnableArcBallCameraController();
-        ActivateModel();
-        ActivateIbl();
-    }
-
     void MSAA_RPI_ExampleComponent::Deactivate()
     {
-        DeactivateIbl();
-        DeactivateModel();
-        DisableArcBallCameraController();
-        DeactivateMSAAPipeline();
+        GetMeshFeatureProcessor()->ReleaseMesh(m_meshHandle);
+        AZ::Debug::CameraControllerRequestBus::Event(GetCameraEntityId(), &AZ::Debug::CameraControllerRequestBus::Events::Disable);
+        m_defaultIbl.Reset();
+
+        // clear the non-MSAA pipeline and the RPI scene
+        AZ::RPI::ShaderSystemInterface::Get()->SetSupervariantName(AZ::Name(""));
+        SampleComponentManagerRequestBus::Broadcast(&SampleComponentManagerRequests::ClearRPIScene);
+
         AZ::Render::Bootstrap::DefaultWindowNotificationBus::Handler::BusDisconnect();
         ExampleComponentRequestBus::Handler::BusDisconnect();
         AZ::TickBus::Handler::BusDisconnect();
         m_imguiSidebar.Deactivate();
     }
 
-    void MSAA_RPI_ExampleComponent::EnableArcBallCameraController()
-    {
-        AZ::Debug::CameraControllerRequestBus::Event(GetCameraEntityId(), &AZ::Debug::CameraControllerRequestBus::Events::Enable,
-            azrtti_typeid<AZ::Debug::ArcBallControllerComponent>());
-    }
-
-    void MSAA_RPI_ExampleComponent::DisableArcBallCameraController()
-    {
-        AZ::Debug::CameraControllerRequestBus::Event(GetCameraEntityId(), &AZ::Debug::CameraControllerRequestBus::Events::Disable);
-    }
-
     void MSAA_RPI_ExampleComponent::OnModelReady(AZ::Data::Instance<AZ::RPI::Model> model)
     {
         AZ::Data::Asset<AZ::RPI::ModelAsset> modelAsset = model->GetModelAsset();
@@ -103,39 +69,105 @@ namespace AtomSampleViewer
         ScriptRunnerRequestBus::Broadcast(&ScriptRunnerRequests::ResumeScript);
     }
 
-    void MSAA_RPI_ExampleComponent::ActivateMSAAPipeline()
+    void MSAA_RPI_ExampleComponent::Activate()
     {
-        CreateMSAAPipeline(m_numSamples);
+        m_imguiSidebar.Activate();
+        AZ::TickBus::Handler::BusConnect();
+        ExampleComponentRequestBus::Handler::BusConnect(GetEntityId());
+        AZ::Render::Bootstrap::DefaultWindowNotificationBus::Handler::BusConnect();
 
+        // save the current render pipeline
         AZ::RPI::ScenePtr defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene();
         m_originalPipeline = defaultScene->GetDefaultRenderPipeline();
-        defaultScene->AddRenderPipeline(m_msaaPipeline);
-        m_msaaPipeline->SetDefaultView(m_originalPipeline->GetDefaultView());
         defaultScene->RemoveRenderPipeline(m_originalPipeline->GetId());
 
-        // Create an ImGuiActiveContextScope to ensure the ImGui context on the new pipeline's ImGui pass is activated.
-        m_imguiScope = AZ::Render::ImGuiActiveContextScope::FromPass(AZ::RPI::PassHierarchyFilter({ m_msaaPipeline->GetId().GetCStr(), "ImGuiPass" }));
+        // switch to the sample render pipeline
+        ChangeRenderPipeline();
+  
+        // set ArcBall camera controller
+        AZ::Debug::CameraControllerRequestBus::Event(GetCameraEntityId(), &AZ::Debug::CameraControllerRequestBus::Events::Enable,
+            azrtti_typeid<AZ::Debug::ArcBallControllerComponent>());
+    
+        ActivateModel();
+        ActivateIbl();
     }
 
-    void MSAA_RPI_ExampleComponent::DeactivateMSAAPipeline()
+    void MSAA_RPI_ExampleComponent::ChangeRenderPipeline()
     {
-        m_imguiScope = {}; // restores previous ImGui context.
-
         AZ::RPI::ScenePtr defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene();
-        defaultScene->AddRenderPipeline(m_originalPipeline);
-        AZ::RPI::RenderPipelineDescriptor pipelineDesc;
-        defaultScene->RemoveRenderPipeline(m_msaaPipeline->GetId());
-        DestroyMSAAPipeline();
-    }
 
-    void MSAA_RPI_ExampleComponent::CreateMSAAPipeline(int numSamples)
-    {
+        m_imguiScope = {}; // restores previous ImGui context.
+
+        // remove currently running sample pipeline, if any
+        if (m_samplePipeline)
+        {
+            defaultScene->RemoveRenderPipeline(m_samplePipeline->GetId());
+            m_samplePipeline = nullptr;
+        }
+        
+        bool isNonMsaaPipeline = (m_numSamples == 1);
+        
+        // if we are changing between the MSAA and non-MSAA pipelines we need to force a reset on the RPI scene.  This is
+        // necessary to re-initialize all of the feature processor shaders and Srgs
+        if (isNonMsaaPipeline != m_isNonMsaaPipeline)
+        {      
+            // set the NoMsaa flag based on the pipeline type and reset the RPI scene
+            const char* supervariantName = isNonMsaaPipeline ? AZ::RPI::NoMsaaSupervariantName : "";
+            AZ::RPI::ShaderSystemInterface::Get()->SetSupervariantName(AZ::Name(supervariantName));
+            SampleComponentManagerRequestBus::Broadcast(&SampleComponentManagerRequests::ResetRPIScene);
+
+            // reset internal sample scene related data
+            ResetScene();
+
+            // re-acquire the default scene
+            defaultScene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene();
+
+            // remove the default render pipeline
+            AZ::RPI::RenderPipelinePtr defaultPipeline = defaultScene->GetDefaultRenderPipeline();
+            defaultScene->RemoveRenderPipeline(defaultPipeline->GetId());
+
+            // scene IBL is cleared after the reset, re-activate it
+            ActivateIbl();
+
+            m_isNonMsaaPipeline = isNonMsaaPipeline;          
+        }
+        
+        // create the new sample pipeline
         AZ::RPI::RenderPipelineDescriptor pipelineDesc;
         pipelineDesc.m_mainViewTagName = "MainCamera";
         pipelineDesc.m_name = "MSAA";
-        pipelineDesc.m_rootPassTemplate = GetPipelineName(numSamples);
+        pipelineDesc.m_rootPassTemplate = "MainPipeline";
+        pipelineDesc.m_renderSettings.m_multisampleState.m_samples = m_numSamples;
+        m_samplePipeline = AZ::RPI::RenderPipeline::CreateRenderPipelineForWindow(pipelineDesc, *m_windowContext);
+
+        // add the sample pipeline to the scene
+        defaultScene->AddRenderPipeline(m_samplePipeline);
+        m_samplePipeline->SetDefaultView(m_originalPipeline->GetDefaultView());
+        defaultScene->SetDefaultRenderPipeline(m_samplePipeline->GetId());
+
+        // create an ImGuiActiveContextScope to ensure the ImGui context on the new pipeline's ImGui pass is activated.
+        m_imguiScope = AZ::Render::ImGuiActiveContextScope::FromPass(AZ::RPI::PassHierarchyFilter({ m_samplePipeline->GetId().GetCStr(), "ImGuiPass" }));
 
-        m_msaaPipeline = AZ::RPI::RenderPipeline::CreateRenderPipelineForWindow(pipelineDesc, *m_windowContext);
+        // enable/disable resolve passes as appropriate
+        bool enableResolvePass = !isNonMsaaPipeline;
+
+        AZStd::vector<AZ::Name> resolvePassNames =
+        {
+            AZ::Name("MSAAResolveDepthPass"),
+            AZ::Name("MSAAResolveDiffusePass"),
+            AZ::Name("MSAAResolveSpecularPass"),
+            AZ::Name("MSAAResolveScatterDistancePass")
+        };
+
+        for (const auto& resolvePassName : resolvePassNames)
+        {
+            AZ::RPI::PassHierarchyFilter passFilter(resolvePassName);
+            const AZStd::vector<AZ::RPI::Pass*>& passes = AZ::RPI::PassSystemInterface::Get()->FindPasses(passFilter);
+            for (auto& pass : passes)
+            {
+                pass->SetEnabled(enableResolvePass);
+            }
+        }
     }
 
     void MSAA_RPI_ExampleComponent::ResetCamera()
@@ -155,11 +187,6 @@ namespace AtomSampleViewer
         AZ::Render::Bootstrap::DefaultWindowBus::BroadcastResult(m_windowContext, &AZ::Render::Bootstrap::DefaultWindowBus::Events::GetDefaultWindowContext);
     }
 
-    void MSAA_RPI_ExampleComponent::DestroyMSAAPipeline()
-    {
-        m_msaaPipeline = nullptr;
-    }
-
     AZ::Data::Asset<AZ::RPI::MaterialAsset> MSAA_RPI_ExampleComponent::GetMaterialAsset()
     {
         AZ::RPI::AssetUtils::TraceLevel traceLevel = AZ::RPI::AssetUtils::TraceLevel::Assert;
@@ -183,7 +210,6 @@ namespace AtomSampleViewer
         return AZ::RPI::AssetUtils::GetAssetByProductPath<AZ::RPI::ModelAsset>("objects/cylinder.azmodel", traceLevel);
     }
 
-
     void MSAA_RPI_ExampleComponent::ActivateModel()
     {
         m_meshHandle = GetMeshFeatureProcessor()->AcquireMesh(GetModelAsset(), AZ::RPI::Material::FindOrCreate(GetMaterialAsset()));
@@ -201,11 +227,6 @@ namespace AtomSampleViewer
         }
     }
 
-    void MSAA_RPI_ExampleComponent::DeactivateModel()
-    {
-        GetMeshFeatureProcessor()->ReleaseMesh(m_meshHandle);
-    }
-
     void MSAA_RPI_ExampleComponent::ActivateIbl()
     {
         m_defaultIbl.Init(AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get());
@@ -214,11 +235,6 @@ namespace AtomSampleViewer
         m_defaultIbl.SetExposure(-0.5f);
     }
 
-    void MSAA_RPI_ExampleComponent::DeactivateIbl()
-    {
-        m_defaultIbl.Reset();
-    }
-
     void MSAA_RPI_ExampleComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint timePoint)
     {
         DrawSidebar();
@@ -239,9 +255,8 @@ namespace AtomSampleViewer
         if (refresh)
         {
             // Note that the model's have some multisample information embedded into their pipeline state, so delete and recreate the model
-            DeactivateModel();
-            DeactivateMSAAPipeline();
-            ActivateMSAAPipeline();
+            GetMeshFeatureProcessor()->ReleaseMesh(m_meshHandle);
+            ChangeRenderPipeline();
             ActivateModel();
         }
     }

+ 21 - 24
Gem/Code/Source/MSAA_RPI_ExampleComponent.h

@@ -40,43 +40,32 @@ namespace AtomSampleViewer
         static void Reflect(AZ::ReflectContext* context);
 
         void Activate() override;
-
-
         void Deactivate() override;
 
     private:
 
-        void ActivateMSAAPipeline();
-        void DeactivateMSAAPipeline();
-
-        void ActivateIbl();
-        void DeactivateIbl();
-
-        void CreateMSAAPipeline(int numSamples);
-        void DestroyMSAAPipeline();
+        // DefaultWindowNotificationBus::Handler
+        void DefaultWindowCreated() override;
 
-        void ActivateModel();
-        void DeactivateModel();
-        
         // AZ::TickBus::Handler
         void OnTick(float deltaTime, AZ::ScriptTimePoint timePoint) override;
 
         // ExampleComponentRequestBus::Handler
         void ResetCamera() override;
 
-        void DefaultWindowCreated() override;
-
-        void EnableArcBallCameraController();
-        void DisableArcBallCameraController();
-
+        // helper functions
+        void ChangeRenderPipeline();
+        void ActivateIbl();
+        void ActivateModel();
         void OnModelReady(AZ::Data::Instance<AZ::RPI::Model> model);
         AZ::Data::Asset<AZ::RPI::MaterialAsset> GetMaterialAsset();
         AZ::Data::Asset<AZ::RPI::ModelAsset> GetModelAsset();
         void DrawSidebar();
-
         bool DrawSidebarModeChooser(bool refresh);
         bool DrawSideBarModelChooser(bool refresh);
 
+        // sample mesh
+        int m_modelType = 0;
         AZ::Render::MeshFeatureProcessorInterface::MeshHandle m_meshHandle;
         AZ::Render::MeshFeatureProcessorInterface::ModelChangedEvent::Handler m_meshChangedHandler
         {
@@ -85,15 +74,23 @@ namespace AtomSampleViewer
                 OnModelReady(model);
             }
         };
-        
-        AZ::RPI::RenderPipelinePtr m_msaaPipeline;
+
+        // original render pipeline when the sample was started
         AZ::RPI::RenderPipelinePtr m_originalPipeline;
+
+        // sample render pipeline, can be MSAA 2x/4x/8x or non-MSAA
+        AZ::RPI::RenderPipelinePtr m_samplePipeline;
+
+        // number of MSAA samples in the pipeline, controlled by the user
+        int m_numSamples = 1;
+
+        // flag indicating if the current pipeline is a non-MSAA pipeline
+        bool m_isNonMsaaPipeline = false;
+
+        // other state
         AZStd::shared_ptr<AZ::RPI::WindowContext> m_windowContext;
         Utils::DefaultIBL m_defaultIbl;
         ImGuiSidebar m_imguiSidebar;
-        int m_numSamples = 1;
-        int m_modelType = 0;
-
         AZ::Render::ImGuiActiveContextScope m_imguiScope;
     };
 } // namespace AtomSampleViewer

+ 1 - 1
Gem/Code/Source/Passes/RayTracingAmbientOcclusionPass.cpp

@@ -89,7 +89,7 @@ namespace AZ
             AZ_Assert(m_globalPipelineState, "Failed to acquire ray tracing global pipeline state");
 
             //Get pass srg
-            m_shaderResourceGroup = RPI::ShaderResourceGroup::Create(m_rayGenerationShader->GetAsset(), AZ::RPI::DefaultSupervariantIndex, Name { "RayTracingGlobalSrg" });
+            m_shaderResourceGroup = RPI::ShaderResourceGroup::Create(m_rayGenerationShader->GetAsset(), Name { "RayTracingGlobalSrg" });
             AZ_Assert(m_shaderResourceGroup, "[RayTracingAmbientOcclusionPass '%s']: Failed to create SRG from shader asset '%s'",
                 GetPathName().GetCStr(), rayGenerationShaderFilePath);
                         

+ 1 - 1
Gem/Code/Source/RHI/BasicRHIComponent.cpp

@@ -462,7 +462,7 @@ namespace AtomSampleViewer
 
     AZ::Data::Instance<AZ::RPI::ShaderResourceGroup> BasicRHIComponent::CreateShaderResourceGroup(AZ::Data::Instance<AZ::RPI::Shader> shader, const char* shaderResourceGroupId, [[maybe_unused]] const char* sampleName)
     {
-        auto srg = AZ::RPI::ShaderResourceGroup::Create(shader->GetAsset(), AZ::RPI::DefaultSupervariantIndex, AZ::Name { shaderResourceGroupId });
+        auto srg = AZ::RPI::ShaderResourceGroup::Create(shader->GetAsset(), AZ::Name { shaderResourceGroupId });
         if (!srg)
         {
             AZ_Error(sampleName, false, "Failed to create shader resource group");

+ 1 - 1
Gem/Code/Source/RootConstantsExampleComponent.cpp

@@ -143,7 +143,7 @@ namespace AtomSampleViewer
             m_rootConstantData = RHI::ConstantsData(rootConstantsLayout);
 
             // Load shader resource group asset
-            m_srg = AZ::RPI::ShaderResourceGroup::Create(shaderAsset, AZ::RPI::DefaultSupervariantIndex, Name { "MaterialGroupSrg" });
+            m_srg = AZ::RPI::ShaderResourceGroup::Create(shaderAsset, Name { "MaterialGroupSrg" });
             if (!m_srg)
             {
                 AZ_Error("Render", false, "Failed to create shader resource group");

+ 11 - 0
Gem/Code/Source/SampleComponentManager.cpp

@@ -1142,6 +1142,17 @@ namespace AtomSampleViewer
         }
     }
 
+    void SampleComponentManager::ResetRPIScene()
+    {
+        ReleaseRPIScene();
+        SwitchSceneForRPISample();
+    }
+
+    void SampleComponentManager::ClearRPIScene()
+    {
+        ReleaseRPIScene();
+    }
+
     void SampleComponentManager::ShowFrameCaptureDialog()
     {
         static bool requestCaptureOnNextFrame = false;

+ 2 - 0
Gem/Code/Source/SampleComponentManager.h

@@ -149,6 +149,8 @@ namespace AtomSampleViewer
         void RequestFrameCapture(const AZStd::string& filePath, bool hideImGui) override;
         bool IsFrameCapturePending() override;
         void RunMainTestSuite(const AZStd::string& suiteFilePath, bool exitOnTestEnd, int randomSeed) override;
+        void ResetRPIScene() override;
+        void ClearRPIScene() override;
 
         // FrameCaptureNotificationBus overrides...
         void OnCaptureFinished(AZ::Render::FrameCaptureResult result, const AZStd::string& info) override;

+ 6 - 0
Gem/Code/Source/SampleComponentManagerBus.h

@@ -42,6 +42,12 @@ namespace AtomSampleViewer
         //! @param exitOnTestEnd if true, exits AtomSampleViewerStandalone when the script finishes, used in jenkins
         //! @param randomSeed the seed for the random generator, frequently used inside lua tests to shuffle the order of the test execution
         virtual void RunMainTestSuite(const AZStd::string& suiteFilePath, bool exitOnTestEnd, int randomSeed) = 0;
+
+        //! Reset the RPI scene while keeping the current sample running
+        virtual void ResetRPIScene() = 0;
+
+        //! Clear the RPI scene
+        virtual void ClearRPIScene() = 0;
     };
     using SampleComponentManagerRequestBus = AZ::EBus<SampleComponentManagerRequests>;
 

+ 4 - 4
Gem/Code/Source/StreamingImageExampleComponent.cpp

@@ -103,7 +103,7 @@ namespace AtomSampleViewer
             m_residentMipInputIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_residentMip"));
 
             // Create an SRG instance for the hot reloaded image
-            m_imageHotReload.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
+            m_imageHotReload.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, m_srgLayout->GetName());
         }
 
         // Create the 3D pipeline object
@@ -601,7 +601,7 @@ namespace AtomSampleViewer
             m_numImageAssetQueued++;
             ImageToDraw img;
             img.m_asset = AZ::Data::AssetManager::Instance().GetAsset<AZ::RPI::StreamingImageAsset>(imageAssetId, AZ::Data::AssetLoadBehavior::PreLoad);
-            img.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
+            img.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, m_srgLayout->GetName());
             img.m_assetId = imageAssetId;
             m_images.push_back(img);
 
@@ -642,7 +642,7 @@ namespace AtomSampleViewer
 
             // Create the srg
             Image3dToDraw image3d;
-            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dShaderAsset, AZ::RPI::DefaultSupervariantIndex, m_image3dSrgLayout->GetName());
+            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dShaderAsset, m_image3dSrgLayout->GetName());
             image3d.m_srg->SetImage(image3DInputIndex, image.get(), 0);
             image3d.m_sliceCount = layout.m_size.m_depth;
 
@@ -687,7 +687,7 @@ namespace AtomSampleViewer
 
             // Create the srg
             Image3dToDraw image3d;
-            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dShaderAsset, AZ::RPI::DefaultSupervariantIndex, m_image3dSrgLayout->GetName());
+            image3d.m_srg = RPI::ShaderResourceGroup::Create(m_image3dShaderAsset, m_image3dSrgLayout->GetName());
             image3d.m_srg->SetImage(image3DInputIndex, image.get(), 0);
             image3d.m_sliceCount = depth;
 

+ 1 - 1
Gem/Code/Source/TonemappingExampleComponent.cpp

@@ -258,7 +258,7 @@ namespace AtomSampleViewer
             m_colorSpaceIndex = m_srgLayout->FindShaderInputConstantIndex(Name("m_colorSpace"));
         }
 
-        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, AZ::RPI::DefaultSupervariantIndex, m_srgLayout->GetName());
+        m_drawImage.m_srg = RPI::ShaderResourceGroup::Create(m_shaderAsset, m_srgLayout->GetName());
         m_drawImage.m_wasStreamed = false;
 
         // Set the image to occupy the full screen.

+ 0 - 80
Passes/MSAA_2x_RPI_Pipeline.pass

@@ -1,80 +0,0 @@
-// Create the Depth Pass in this .pass file with a specific MSAA value, then pass it into MSAA_Core_Pipeline which contains the rest of the pipeline (forward pass, UI, etc)
-{
-    "Type": "JsonSerialization",
-    "Version": 1,
-    "ClassName": "PassAsset",
-    "ClassData": {
-        "PassTemplate": {
-            "Name": "MSAA_2x_RPI_Pipeline",
-            "PassClass": "ParentPass",
-            "Slots": [
-                {
-                    "Name": "SwapChainOutput",
-                    "SlotType": "InputOutput"
-                }
-            ],
-            "PassRequests": [
-                {
-                    "Name": "MorphTargetPass",
-                    "TemplateName": "MorphTargetPassTemplate"
-                },
-                {
-                    "Name": "SkinningPass",
-                    "TemplateName": "SkinningPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshOutputStream",
-                            "AttachmentRef": {
-                                "Pass": "MorphTargetPass",
-                                "Attachment": "MorphTargetDeltaOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "DepthMSAAPass",
-                    "TemplateName": "DepthMSAA2xPassTemplate",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "MSAA_Core_Pipeline",
-                    "TemplateName": "MSAA_RPI_Pipeline_Core",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "DepthMSAAPass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SwapChainOutput",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                }
-            ]
-        }
-    }
-}

+ 0 - 80
Passes/MSAA_4x_RPI_Pipeline.pass

@@ -1,80 +0,0 @@
-// Create the Depth Pass in this .pass file with a specific MSAA value, then pass it into MSAA_Core_Pipeline which contains the rest of the pipeline (forward pass, UI, etc)
-{
-    "Type": "JsonSerialization",
-    "Version": 1,
-    "ClassName": "PassAsset",
-    "ClassData": {
-        "PassTemplate": {
-            "Name": "MSAA_4x_RPI_Pipeline",
-            "PassClass": "ParentPass",
-            "Slots": [
-                {
-                    "Name": "SwapChainOutput",
-                    "SlotType": "InputOutput"
-                }
-            ],
-            "PassRequests": [
-                {
-                    "Name": "MorphTargetPass",
-                    "TemplateName": "MorphTargetPassTemplate"
-                },
-                {
-                    "Name": "SkinningPass",
-                    "TemplateName": "SkinningPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshOutputStream",
-                            "AttachmentRef": {
-                                "Pass": "MorphTargetPass",
-                                "Attachment": "MorphTargetDeltaOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "DepthMSAAPass",
-                    "TemplateName": "DepthMSAA4xPassTemplate",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "MSAA_Core_Pipeline",
-                    "TemplateName": "MSAA_RPI_Pipeline_Core",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "DepthMSAAPass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SwapChainOutput",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                }
-            ]
-        }
-    }
-}

+ 0 - 80
Passes/MSAA_8x_RPI_Pipeline.pass

@@ -1,80 +0,0 @@
-// Create the Depth Pass in this .pass file with a specific MSAA value, then pass it into MSAA_Core_Pipeline which contains the rest of the pipeline (forward pass, UI, etc)
-{
-    "Type": "JsonSerialization",
-    "Version": 1,
-    "ClassName": "PassAsset",
-    "ClassData": {
-        "PassTemplate": {
-            "Name": "MSAA_8x_RPI_Pipeline",
-            "PassClass": "ParentPass",
-            "Slots": [
-                {
-                    "Name": "SwapChainOutput",
-                    "SlotType": "InputOutput"
-                }
-            ],
-            "PassRequests": [
-                {
-                    "Name": "MorphTargetPass",
-                    "TemplateName": "MorphTargetPassTemplate"
-                },
-                {
-                    "Name": "SkinningPass",
-                    "TemplateName": "SkinningPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshOutputStream",
-                            "AttachmentRef": {
-                                "Pass": "MorphTargetPass",
-                                "Attachment": "MorphTargetDeltaOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "DepthMSAAPass",
-                    "TemplateName": "DepthMSAA8xPassTemplate",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "MSAA_Core_Pipeline",
-                    "TemplateName": "MSAA_RPI_Pipeline_Core",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "DepthMSAAPass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SwapChainOutput",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                }
-            ]
-        }
-    }
-}

+ 0 - 342
Passes/MSAA_RPI_Pipeline_Core.pass

@@ -1,342 +0,0 @@
-{
-    "Type": "JsonSerialization",
-    "Version": 1,
-    "ClassName": "PassAsset",
-    "ClassData": {
-        "PassTemplate": {
-            "Name": "MSAA_RPI_Pipeline_Core",
-            "PassClass": "ParentPass",
-            "Slots": [
-                {
-                    "Name": "Depth",
-                    "SlotType": "Input"
-                },
-                {
-                    "Name": "SwapChainOutput",
-                    "SlotType": "InputOutput"
-                }
-            ],
-            "PassRequests": [
-                {
-                    "Name": "LightCullingTilePrepareMSAAPass",
-                    "TemplateName": "LightCullingTilePrepareMSAATemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "Depth"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "LightCullingPass",
-                    "TemplateName": "LightCullingTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "TileLightData",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingTilePrepareMSAAPass",
-                                "Attachment": "TileLightData"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "LightCullingRemapPass",
-                    "TemplateName": "LightCullingRemapTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "TileLightData",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingTilePrepareMSAAPass",
-                                "Attachment": "TileLightData"
-                            }
-                        },
-                        {
-                            "LocalSlot": "LightCount",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingPass",
-                                "Attachment": "LightCount"
-                            }
-                        },
-                        {
-                            "LocalSlot": "LightList",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingPass",
-                                "Attachment": "LightList"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ProjectedShadowmapsPass",
-                    "TemplateName": "ProjectedShadowmapsTemplate",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "shadow",
-                        "PipelineViewTag": "ProjectedShadowView"
-                    }
-                },
-                {
-                    "Name": "ForwardMSAAPass",
-                    "TemplateName": "ForwardMSAAPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "Depth"
-                            }
-                        },
-                        {
-                            "LocalSlot": "TileLightData",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingTilePrepareMSAAPass",
-                                "Attachment": "TileLightData"
-                            }
-                        },
-                        {
-                            "LocalSlot": "LightListRemapped",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingRemapPass",
-                                "Attachment": "LightListRemapped"
-                            }
-                        }
-                    ],
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "forward",
-                        "PipelineViewTag": "MainCamera",
-                        "PassSrgShaderAsset": {
-                            "FilePath": "Shaders/ForwardPassSrg.shader"
-                        }
-                    }
-                },
-                {
-                    "Name": "DiffuseGlobalIlluminationPass",
-                    "TemplateName": "DiffuseGlobalIlluminationPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "DiffuseInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "DiffuseOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "AlbedoInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "AlbedoOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "NormalInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "NormalOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "DepthStencilInputOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ReflectionsPass",
-                    "TemplateName": "ReflectionsParentPassTemplate",
-                    "Enabled": true,
-                    "Connections": [
-                        {
-                            "LocalSlot": "NormalInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "NormalOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SpecularF0Input",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "SpecularF0Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "AlbedoInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "AlbedoOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "DepthStencilInputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SpecularInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "SpecularOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ReflectionCompositePass",
-                    "TemplateName": "ReflectionCompositePassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "ReflectionInput",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionsPass",
-                                "Attachment": "ReflectionOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SpecularInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionsPass",
-                                "Attachment": "SpecularInputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionsPass",
-                                "Attachment": "DepthStencilInputOutput"
-                            }
-                        }
-                    ],
-                    "PassData": {
-                        "$type": "FullscreenTrianglePassData",
-                        "ShaderAsset": {
-                            "FilePath": "Shaders/Reflections/ReflectionComposite.shader"
-                        },
-                        "StencilRef": 1,
-                        "PipelineViewTag": "MainCamera"
-                    }
-                },
-                {
-                    "Name": "MSAAResolveDiffusePass",
-                    "TemplateName": "MSAAResolveColorTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "Input",
-                            "AttachmentRef": {
-                                "Pass": "ForwardMSAAPass",
-                                "Attachment": "DiffuseOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "MSAAResolveSpecularPass",
-                    "TemplateName": "MSAAResolveColorTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "Input",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionCompositePass",
-                                "Attachment": "SpecularInputOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "MotionVectorPass",
-                    "TemplateName": "MotionVectorParentTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        },
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "DepthPass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SwapChainOutput",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "DiffuseSpecularMergePass",
-                    "TemplateName": "DiffuseSpecularMergeTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "InputDiffuse",
-                            "AttachmentRef": {
-                                "Pass": "MSAAResolveDiffusePass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "InputSpecular",
-                            "AttachmentRef": {
-                                "Pass": "MSAAResolveSpecularPass",
-                                "Attachment": "Output"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ImGuiPass",
-                    "TemplateName": "ImGuiPassTemplate",
-                    "Enabled": true,
-                    "Connections": [
-                        {
-                            "LocalSlot": "InputOutput",
-                            "AttachmentRef": {
-                                "Pass": "DiffuseSpecularMergePass",
-                                "Attachment": "Output"
-                            }
-                        }
-                    ],
-                    "PassData": {
-                        "$type": "ImGuiPassData",
-                        "IsDefaultImGui": true
-                    }
-                },
-                {
-                    "Name": "CopyToSwapChain",
-                    "TemplateName": "FullscreenCopyTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "Input",
-                            "AttachmentRef": {
-                                "Pass": "ImGuiPass",
-                                "Attachment": "InputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "Output",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                }
-            ]
-        }
-    }
-}

+ 0 - 356
Passes/No_MSAA_RPI_Pipeline.pass

@@ -1,356 +0,0 @@
-{
-    "Type": "JsonSerialization",
-    "Version": 1,
-    "ClassName": "PassAsset",
-    "ClassData": {
-        "PassTemplate": {
-            "Name": "No_MSAA_RPI_Pipeline",
-            "PassClass": "ParentPass",
-            "Slots": [
-                {
-                    "Name": "SwapChainOutput",
-                    "SlotType": "InputOutput"
-                }
-            ],
-            "PassRequests": [
-                {
-                    "Name": "MorphTargetPass",
-                    "TemplateName": "MorphTargetPassTemplate"
-                },
-                {
-                    "Name": "SkinningPass",
-                    "TemplateName": "SkinningPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshOutputStream",
-                            "AttachmentRef": {
-                                "Pass": "MorphTargetPass",
-                                "Attachment": "MorphTargetDeltaOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "DepthPass",
-                    "TemplateName": "DepthPassTemplate",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "depth",
-                        "PipelineViewTag": "MainCamera"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "LightCullingTilePreparePass",
-                    "TemplateName": "LightCullingTilePrepareTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "DepthPass",
-                                "Attachment": "Output"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "LightCullingPass",
-                    "TemplateName": "LightCullingTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "TileLightData",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingTilePreparePass",
-                                "Attachment": "TileLightData"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "LightCullingRemapPass",
-                    "TemplateName": "LightCullingRemapTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "TileLightData",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingTilePreparePass",
-                                "Attachment": "TileLightData"
-                            }
-                        },
-                        {
-                            "LocalSlot": "LightCount",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingPass",
-                                "Attachment": "LightCount"
-                            }
-                        },
-                        {
-                            "LocalSlot": "LightList",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingPass",
-                                "Attachment": "LightList"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ProjectedShadowmapsPass",
-                    "TemplateName": "ProjectedShadowmapsTemplate",
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "shadow",
-                        "PipelineViewTag": "ProjectedShadowView"
-                    },
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ForwardPass",
-                    "TemplateName": "ForwardPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "DepthPass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "TileLightData",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingTilePreparePass",
-                                "Attachment": "TileLightData"
-                            }
-                        },
-                        {
-                            "LocalSlot": "LightListRemapped",
-                            "AttachmentRef": {
-                                "Pass": "LightCullingRemapPass",
-                                "Attachment": "LightListRemapped"
-                            }
-                        }
-                    ],
-                    "PassData": {
-                        "$type": "RasterPassData",
-                        "DrawListTag": "forward",
-                        "PipelineViewTag": "MainCamera",
-                        "PassSrgShaderAsset": {
-                            "FilePath": "Shaders/ForwardPassSrg.shader"
-                        }
-                    }
-                },
-                {
-                    "Name": "DiffuseGlobalIlluminationPass",
-                    "TemplateName": "DiffuseGlobalIlluminationPassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "DiffuseInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "DiffuseOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "AlbedoInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "AlbedoOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "NormalInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "NormalOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "DepthStencilInputOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ReflectionsPass",
-                    "TemplateName": "ReflectionsParentPassTemplate",
-                    "Enabled": true,
-                    "Connections": [
-                        {
-                            "LocalSlot": "NormalInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "NormalOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SpecularF0Input",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "SpecularF0Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "AlbedoInput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "AlbedoOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "DepthStencilInputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SpecularInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ForwardPass",
-                                "Attachment": "SpecularOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ReflectionCompositePass",
-                    "TemplateName": "ReflectionCompositePassTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "ReflectionInput",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionsPass",
-                                "Attachment": "ReflectionOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SpecularInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionsPass",
-                                "Attachment": "SpecularInputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "DepthStencilInputOutput",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionsPass",
-                                "Attachment": "DepthStencilInputOutput"
-                            }
-                        }
-                    ],
-                    "PassData": {
-                        "$type": "FullscreenTrianglePassData",
-                        "ShaderAsset": {
-                            "FilePath": "Shaders/Reflections/ReflectionComposite.shader"
-                        },
-                        "StencilRef": 1,
-                        "PipelineViewTag": "MainCamera"
-                    }
-                },
-                {
-                    "Name": "DiffuseSpecularMergePass",
-                    "TemplateName": "DiffuseSpecularMergeTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "InputDiffuse",
-                            "AttachmentRef": {
-                                "Pass": "DiffuseGlobalIlluminationPass",
-                                "Attachment": "DiffuseInputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "InputSpecular",
-                            "AttachmentRef": {
-                                "Pass": "ReflectionCompositePass",
-                                "Attachment": "SpecularInputOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "MotionVectorPass",
-                    "TemplateName": "MotionVectorParentTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "SkinnedMeshes",
-                            "AttachmentRef": {
-                                "Pass": "SkinningPass",
-                                "Attachment": "SkinnedMeshOutputStream"
-                            }
-                        },
-                        {
-                            "LocalSlot": "Depth",
-                            "AttachmentRef": {
-                                "Pass": "DepthPass",
-                                "Attachment": "Output"
-                            }
-                        },
-                        {
-                            "LocalSlot": "SwapChainOutput",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                },
-                {
-                    "Name": "ImGuiPass",
-                    "TemplateName": "ImGuiPassTemplate",
-                    "Enabled": true,
-                    "Connections": [
-                        {
-                            "LocalSlot": "InputOutput",
-                            "AttachmentRef": {
-                                "Pass": "DiffuseSpecularMergePass",
-                                "Attachment": "Output"
-                            }
-                        }
-                    ],
-                    "PassData": {
-                        "$type": "ImGuiPassData",
-                        "IsDefaultImGui": true
-                    }
-                },
-                {
-                    "Name": "CopyToSwapChain",
-                    "TemplateName": "FullscreenCopyTemplate",
-                    "Connections": [
-                        {
-                            "LocalSlot": "Input",
-                            "AttachmentRef": {
-                                "Pass": "ImGuiPass",
-                                "Attachment": "InputOutput"
-                            }
-                        },
-                        {
-                            "LocalSlot": "Output",
-                            "AttachmentRef": {
-                                "Pass": "Parent",
-                                "Attachment": "SwapChainOutput"
-                            }
-                        }
-                    ]
-                }
-            ]
-        }
-    }
-}