@@ -191,17 +191,7 @@ void Tutorial27_PostProcessing::Initialize(const SampleInitInfo& InitInfo)
191
191
192
192
// Create necessary textures for IBL
193
193
{
194
- // We only need PBR renderer to precompute environment maps
195
- const auto pIBLGenerator = std::make_unique<PBR_Renderer>(m_pDevice, nullptr , m_pImmediateContext, PBR_Renderer::CreateInfo{});
196
-
197
- RefCntAutoPtr<ITexture> pEnvironmentMap;
198
- CreateTextureFromFile (" textures/papermill.ktx" , TextureLoadInfo{" Tutorial27_PostProcessing::EnvironmentMap" }, m_pDevice, &pEnvironmentMap);
199
- pIBLGenerator->PrecomputeCubemaps (m_pImmediateContext, pEnvironmentMap->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE));
200
-
201
- m_Resources.Insert (RESOURCE_IDENTIFIER_ENVIRONMENT_MAP, pEnvironmentMap);
202
- m_Resources.Insert (RESOURCE_IDENTIFIER_PREFILTERED_ENVIRONMENT_MAP, pIBLGenerator->GetPrefilteredEnvMapSRV ()->GetTexture ());
203
- m_Resources.Insert (RESOURCE_IDENTIFIER_IRRADIANCE_MAP, pIBLGenerator->GetIrradianceCubeSRV ()->GetTexture ());
204
- m_Resources.Insert (RESOURCE_IDENTIFIER_BRDF_INTEGRATION_MAP, pIBLGenerator->GetPreintegratedGGX_SRV ()->GetTexture ());
194
+ LoadEnvironmentMap (" textures/papermill.ktx" );
205
195
}
206
196
207
197
m_PostFXContext = std::make_unique<PostFXContext>(m_pDevice);
@@ -616,10 +606,10 @@ void Tutorial27_PostProcessing::ComputeLighting()
616
606
.AddVariable (SHADER_TYPE_PIXEL, " g_TextureDepth" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
617
607
.AddVariable (SHADER_TYPE_PIXEL, " g_TextureSSR" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
618
608
.AddVariable (SHADER_TYPE_PIXEL, " g_TextureSSAO" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
619
- .AddVariable (SHADER_TYPE_PIXEL, " g_TextureEnvironmentMap" , SHADER_RESOURCE_VARIABLE_TYPE_STATIC )
620
- .AddVariable (SHADER_TYPE_PIXEL, " g_TextureIrradianceMap" , SHADER_RESOURCE_VARIABLE_TYPE_STATIC )
621
- .AddVariable (SHADER_TYPE_PIXEL, " g_TexturePrefilteredEnvironmentMap" , SHADER_RESOURCE_VARIABLE_TYPE_STATIC )
622
- .AddVariable (SHADER_TYPE_PIXEL, " g_TextureBRDFIntegrationMap" , SHADER_RESOURCE_VARIABLE_TYPE_STATIC );
609
+ .AddVariable (SHADER_TYPE_PIXEL, " g_TextureEnvironmentMap" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC )
610
+ .AddVariable (SHADER_TYPE_PIXEL, " g_TextureIrradianceMap" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC )
611
+ .AddVariable (SHADER_TYPE_PIXEL, " g_TexturePrefilteredEnvironmentMap" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC )
612
+ .AddVariable (SHADER_TYPE_PIXEL, " g_TextureBRDFIntegrationMap" , SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC );
623
613
624
614
ResourceLayout
625
615
.AddImmutableSampler (SHADER_TYPE_PIXEL, " g_TextureEnvironmentMap" , Sam_Aniso16xClamp)
@@ -637,15 +627,16 @@ void Tutorial27_PostProcessing::ComputeLighting()
637
627
DSS_DisableDepth, BS_Default, false );
638
628
ShaderResourceVariableX{RenderTech.PSO , SHADER_TYPE_PIXEL, " cbCameraAttribs" }.Set (m_Resources[RESOURCE_IDENTIFIER_CAMERA_CONSTANT_BUFFER].AsBuffer ());
639
629
ShaderResourceVariableX{RenderTech.PSO , SHADER_TYPE_PIXEL, " cbPBRRendererAttibs" }.Set (m_Resources[RESOURCE_IDENTIFIER_PBR_ATTRIBS_CONSTANT_BUFFER].AsBuffer ());
640
- ShaderResourceVariableX{RenderTech.PSO , SHADER_TYPE_PIXEL, " g_TextureEnvironmentMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_ENVIRONMENT_MAP].GetTextureSRV ());
641
- ShaderResourceVariableX{RenderTech.PSO , SHADER_TYPE_PIXEL, " g_TextureIrradianceMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_IRRADIANCE_MAP].GetTextureSRV ());
642
- ShaderResourceVariableX{RenderTech.PSO , SHADER_TYPE_PIXEL, " g_TexturePrefilteredEnvironmentMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_PREFILTERED_ENVIRONMENT_MAP].GetTextureSRV ());
643
- ShaderResourceVariableX{RenderTech.PSO , SHADER_TYPE_PIXEL, " g_TextureBRDFIntegrationMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_BRDF_INTEGRATION_MAP].GetTextureSRV ());
644
630
RenderTech.InitializeSRB (true );
645
631
}
646
632
647
633
const Uint32 CurrFrameIdx = (m_CurrentFrameNumber + 0x0 ) & 0x1 ;
648
634
635
+ ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TextureEnvironmentMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_ENVIRONMENT_MAP].GetTextureSRV ());
636
+ ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TextureIrradianceMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_IRRADIANCE_MAP].GetTextureSRV ());
637
+ ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TexturePrefilteredEnvironmentMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_PREFILTERED_ENVIRONMENT_MAP].GetTextureSRV ());
638
+ ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TextureBRDFIntegrationMap" }.Set (m_Resources[RESOURCE_IDENTIFIER_BRDF_INTEGRATION_MAP].GetTextureSRV ());
639
+
649
640
ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TextureBaseColor" }.Set (m_GBuffer->GetBuffer (GBUFFER_RT_BASE_COLOR)->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE));
650
641
ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TextureMaterialData" }.Set (m_GBuffer->GetBuffer (GBUFFER_RT_MATERIAL_DATA)->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE));
651
642
ShaderResourceVariableX{RenderTech.SRB , SHADER_TYPE_PIXEL, " g_TextureNormal" }.Set (m_GBuffer->GetBuffer (GBUFFER_RT_NORMAL)->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE));
@@ -758,6 +749,18 @@ void Tutorial27_PostProcessing::UpdateUI()
758
749
ImGui::SetNextItemOpen (true , ImGuiCond_FirstUseEver);
759
750
ImGui::Text (" FPS: %f" , m_fSmoothFPS);
760
751
752
+ #ifdef PLATFORM_WIN32
753
+ if (ImGui::Button (" Load Environment Map" ))
754
+ {
755
+ FileDialogAttribs OpenDialogAttribs{FILE_DIALOG_TYPE_OPEN};
756
+ OpenDialogAttribs.Title = " Select HDR file" ;
757
+ OpenDialogAttribs.Filter = " HDR files (*.hdr)\0 *.hdr;\0 All files\0 *.*\0\0 " ;
758
+ auto FileName = FileSystem::FileDialog (OpenDialogAttribs);
759
+ if (!FileName.empty ())
760
+ LoadEnvironmentMap (FileName.data ());
761
+ }
762
+ #endif
763
+
761
764
if (ImGui::TreeNode (" Rendering" ))
762
765
{
763
766
ImGui::SliderFloat (" Screen Space Reflection Strength" , &m_ShaderSettings->SSRStrength , 0 .0f , 1 .0f );
@@ -823,4 +826,24 @@ void Tutorial27_PostProcessing::ModifyEngineInitInfo(const ModifyEngineInitInfoA
823
826
}
824
827
}
825
828
829
+ void Tutorial27_PostProcessing::LoadEnvironmentMap (const char * FileName)
830
+ {
831
+ // We only need PBR renderer to precompute environment maps
832
+ if (!m_IBLBacker)
833
+ m_IBLBacker = std::make_unique<PBR_Renderer>(m_pDevice, nullptr , m_pImmediateContext, PBR_Renderer::CreateInfo{});
834
+
835
+ for (Uint32 TextureIdx = RESOURCE_IDENTIFIER_ENVIRONMENT_MAP; TextureIdx <= RESOURCE_IDENTIFIER_BRDF_INTEGRATION_MAP; TextureIdx++)
836
+ m_Resources[TextureIdx].Release ();
837
+
838
+ RefCntAutoPtr<ITexture> pEnvironmentMap;
839
+ CreateTextureFromFile (FileName, TextureLoadInfo{" Tutorial27_PostProcessing::EnvironmentMap" }, m_pDevice, &pEnvironmentMap);
840
+ DEV_CHECK_ERR (pEnvironmentMap, " Failed to load environment map" );
841
+ m_IBLBacker->PrecomputeCubemaps (m_pImmediateContext, pEnvironmentMap->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE));
842
+
843
+ m_Resources.Insert (RESOURCE_IDENTIFIER_ENVIRONMENT_MAP, m_IBLBacker->GetPrefilteredEnvMapSRV ()->GetTexture ());
844
+ m_Resources.Insert (RESOURCE_IDENTIFIER_PREFILTERED_ENVIRONMENT_MAP, m_IBLBacker->GetPrefilteredEnvMapSRV ()->GetTexture ());
845
+ m_Resources.Insert (RESOURCE_IDENTIFIER_IRRADIANCE_MAP, m_IBLBacker->GetIrradianceCubeSRV ()->GetTexture ());
846
+ m_Resources.Insert (RESOURCE_IDENTIFIER_BRDF_INTEGRATION_MAP, m_IBLBacker->GetPreintegratedGGX_SRV ()->GetTexture ());
847
+ }
848
+
826
849
} // namespace Diligent
0 commit comments