Skip to content

Commit 8fc5a11

Browse files
[GLTFViewer, USDViewer, Tutorial27_PostProcessing]: Added button to load HDR environment map (close #154)
1 parent c9a747f commit 8fc5a11

File tree

7 files changed

+112
-38
lines changed

7 files changed

+112
-38
lines changed

Samples/GLTFViewer/src/GLTFViewer.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,24 @@ void GLTFViewer::LoadModel(const char* Path)
200200
m_ModelPath = Path;
201201
}
202202

203+
void GLTFViewer::LoadEnvironmentMap(const char* Path)
204+
{
205+
RefCntAutoPtr<ITexture> pEnvironmentMap;
206+
CreateTextureFromFile(Path, TextureLoadInfo{"Environment map"}, m_pDevice, &pEnvironmentMap);
207+
VERIFY_EXPR(pEnvironmentMap);
208+
209+
if (m_GLTFRenderer)
210+
m_GLTFRenderer->PrecomputeCubemaps(m_pImmediateContext, pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
211+
212+
StateTransitionDesc Barriers[] = {
213+
{pEnvironmentMap, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
214+
};
215+
m_pImmediateContext->TransitionResourceStates(_countof(Barriers), Barriers);
216+
217+
m_EnvironmentMapSRV = pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
218+
m_pCurrentEnvMapSRV = m_EnvironmentMapSRV;
219+
}
220+
203221
void GLTFViewer::UpdateScene()
204222
{
205223
m_Model->ComputeTransforms(m_RenderParams.SceneIndex, m_Transforms[0]);
@@ -663,9 +681,7 @@ void GLTFViewer::Initialize(const SampleInitInfo& InitInfo)
663681

664682
m_bWireframeSupported = m_pDevice->GetDeviceInfo().Features.WireframeFill;
665683

666-
RefCntAutoPtr<ITexture> EnvironmentMap;
667-
CreateTextureFromFile("textures/papermill.ktx", TextureLoadInfo{"Environment map"}, m_pDevice, &EnvironmentMap);
668-
m_EnvironmentMapSRV = EnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
684+
LoadEnvironmentMap("textures/papermill.ktx");
669685

670686
m_WhiteFurnaceEnvMapSRV = CreateWhiteFurnaceEnvMap(m_pDevice);
671687

@@ -687,13 +703,10 @@ void GLTFViewer::Initialize(const SampleInitInfo& InitInfo)
687703
CreateGLTFRenderer();
688704

689705
CreateUniformBuffer(m_pDevice, m_GLTFRenderer->GetPRBFrameAttribsSize(), "PBR frame attribs buffer", &m_FrameAttribsCB);
690-
// clang-format off
691-
StateTransitionDesc Barriers [] =
692-
{
706+
707+
StateTransitionDesc Barriers[] = {
693708
{m_FrameAttribsCB, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE},
694-
{EnvironmentMap, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE}
695709
};
696-
// clang-format on
697710
m_pImmediateContext->TransitionResourceStates(_countof(Barriers), Barriers);
698711

699712
CrateEnvMapRenderer();
@@ -816,6 +829,17 @@ void GLTFViewer::UpdateUI()
816829
LoadModel(FileName.c_str());
817830
}
818831
}
832+
833+
if (ImGui::Button("Load Environment Map"))
834+
{
835+
FileDialogAttribs OpenDialogAttribs{FILE_DIALOG_TYPE_OPEN};
836+
OpenDialogAttribs.Title = "Select HDR file";
837+
OpenDialogAttribs.Filter = "HDR files (*.hdr)\0*.hdr;\0All files\0*.*\0\0";
838+
auto FileName = FileSystem::FileDialog(OpenDialogAttribs);
839+
if (!FileName.empty())
840+
LoadEnvironmentMap(FileName.data());
841+
}
842+
819843
#endif
820844
if (m_Model->Scenes.size() > 1)
821845
{

Samples/GLTFViewer/src/GLTFViewer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class GLTFViewer final : public SampleBase
6767

6868
private:
6969
void LoadModel(const char* Path);
70+
void LoadEnvironmentMap(const char* Path);
7071
void UpdateScene();
7172
void UpdateUI();
7273
void CreateGLTFResourceCache();

Samples/USDViewer/src/USDViewer.cpp

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -191,16 +191,7 @@ void USDViewer::Initialize(const SampleInitInfo& InitInfo)
191191

192192
ImGuizmo::SetGizmoSizeClipSpace(0.15f);
193193

194-
RefCntAutoPtr<ITexture> EnvironmentMap;
195-
CreateTextureFromFile("textures/papermill.ktx", TextureLoadInfo{"Environment map"}, m_pDevice, &EnvironmentMap);
196-
VERIFY_EXPR(EnvironmentMap);
197-
m_EnvironmentMapSRV = EnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
198-
199-
StateTransitionDesc Barriers[] =
200-
{
201-
{EnvironmentMap, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
202-
};
203-
m_pImmediateContext->TransitionResourceStates(_countof(Barriers), Barriers);
194+
LoadEnvironmentMap("textures/papermill.ktx");
204195

205196
if (m_UsdFileName.empty())
206197
m_UsdFileName = "usd/AppleVisionPro.usdz";
@@ -463,6 +454,26 @@ void USDViewer::LoadStage()
463454
m_Stage.Animation.Time = m_Stage.Animation.StartTime;
464455
}
465456

457+
void USDViewer::LoadEnvironmentMap(const char* Path)
458+
{
459+
RefCntAutoPtr<ITexture> pEnvironmentMap;
460+
CreateTextureFromFile(Path, TextureLoadInfo{"Environment map"}, m_pDevice, &pEnvironmentMap);
461+
VERIFY_EXPR(pEnvironmentMap);
462+
463+
if (m_Stage && m_Stage.RenderDelegate)
464+
{
465+
auto pIBLBacker = m_Stage.RenderDelegate->GetUSDRenderer();
466+
pIBLBacker->PrecomputeCubemaps(m_pImmediateContext, pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
467+
}
468+
469+
StateTransitionDesc Barriers[] = {
470+
{pEnvironmentMap, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
471+
};
472+
m_pImmediateContext->TransitionResourceStates(_countof(Barriers), Barriers);
473+
474+
m_EnvironmentMapSRV = pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
475+
}
476+
466477
// Render a frame
467478
void USDViewer::Render()
468479
{
@@ -646,6 +657,16 @@ void USDViewer::UpdateUI()
646657
}
647658
}
648659

660+
if (ImGui::Button("Load Environment Map"))
661+
{
662+
FileDialogAttribs OpenDialogAttribs{FILE_DIALOG_TYPE_OPEN};
663+
OpenDialogAttribs.Title = "Select HDR file";
664+
OpenDialogAttribs.Filter = "HDR files (*.hdr)\0*.hdr;\0All files\0*.*\0\0";
665+
auto FileName = FileSystem::FileDialog(OpenDialogAttribs);
666+
if (!FileName.empty())
667+
LoadEnvironmentMap(FileName.data());
668+
}
669+
649670
if (ImGui::Button("Open directory"))
650671
{
651672
auto DirName = FileSystem::OpenFolderDialog("Select folder with USD assets");

Samples/USDViewer/src/USDViewer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class USDViewer final : public SampleBase
7474
private:
7575
void UpdateUI();
7676
void LoadStage();
77+
void LoadEnvironmentMap(const char* Path);
7778
void PopulateSceneTree(const pxr::UsdPrim& Prim);
7879
void SetSelectedPrim(const pxr::SdfPath& SelectedPrimId);
7980
void EditSelectedPrimTransform();

Tutorials/Tutorial27_PostProcessing/assets/shaders/ComputeLighting.fx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ float3 FresnelSchlickRoughness(float CosTheta, float3 F0, float roughness)
4949

5050
float3 SampleEnvironmentMap(float3 Coord)
5151
{
52-
return g_PBRRendererAttibs.IBLScale * g_TextureEnvironmentMap.SampleLevel(g_TextureEnvironmentMap_sampler, float3(+1.0, -1.0, +1.0) * Coord, 0.5);
52+
return g_PBRRendererAttibs.IBLScale * g_TextureEnvironmentMap.SampleLevel(g_TextureEnvironmentMap_sampler, float3(+1.0, -1.0, +1.0) * Coord, 0.0);
5353
}
5454

5555
float3 SampleIrradianceMap(float3 Coord)

Tutorials/Tutorial27_PostProcessing/src/Tutorial27_PostProcessing.cpp

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -191,17 +191,7 @@ void Tutorial27_PostProcessing::Initialize(const SampleInitInfo& InitInfo)
191191

192192
// Create necessary textures for IBL
193193
{
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");
205195
}
206196

207197
m_PostFXContext = std::make_unique<PostFXContext>(m_pDevice);
@@ -616,10 +606,10 @@ void Tutorial27_PostProcessing::ComputeLighting()
616606
.AddVariable(SHADER_TYPE_PIXEL, "g_TextureDepth", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
617607
.AddVariable(SHADER_TYPE_PIXEL, "g_TextureSSR", SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC)
618608
.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);
623613

624614
ResourceLayout
625615
.AddImmutableSampler(SHADER_TYPE_PIXEL, "g_TextureEnvironmentMap", Sam_Aniso16xClamp)
@@ -637,15 +627,16 @@ void Tutorial27_PostProcessing::ComputeLighting()
637627
DSS_DisableDepth, BS_Default, false);
638628
ShaderResourceVariableX{RenderTech.PSO, SHADER_TYPE_PIXEL, "cbCameraAttribs"}.Set(m_Resources[RESOURCE_IDENTIFIER_CAMERA_CONSTANT_BUFFER].AsBuffer());
639629
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());
644630
RenderTech.InitializeSRB(true);
645631
}
646632

647633
const Uint32 CurrFrameIdx = (m_CurrentFrameNumber + 0x0) & 0x1;
648634

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+
649640
ShaderResourceVariableX{RenderTech.SRB, SHADER_TYPE_PIXEL, "g_TextureBaseColor"}.Set(m_GBuffer->GetBuffer(GBUFFER_RT_BASE_COLOR)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
650641
ShaderResourceVariableX{RenderTech.SRB, SHADER_TYPE_PIXEL, "g_TextureMaterialData"}.Set(m_GBuffer->GetBuffer(GBUFFER_RT_MATERIAL_DATA)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
651642
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()
758749
ImGui::SetNextItemOpen(true, ImGuiCond_FirstUseEver);
759750
ImGui::Text("FPS: %f", m_fSmoothFPS);
760751

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;\0All files\0*.*\0\0";
758+
auto FileName = FileSystem::FileDialog(OpenDialogAttribs);
759+
if (!FileName.empty())
760+
LoadEnvironmentMap(FileName.data());
761+
}
762+
#endif
763+
761764
if (ImGui::TreeNode("Rendering"))
762765
{
763766
ImGui::SliderFloat("Screen Space Reflection Strength", &m_ShaderSettings->SSRStrength, 0.0f, 1.0f);
@@ -823,4 +826,24 @@ void Tutorial27_PostProcessing::ModifyEngineInitInfo(const ModifyEngineInitInfoA
823826
}
824827
}
825828

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+
826849
} // namespace Diligent

Tutorials/Tutorial27_PostProcessing/src/Tutorial27_PostProcessing.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class ScreenSpaceAmbientOcclusion;
5252
class TemporalAntiAliasing;
5353
class Bloom;
5454
class GBuffer;
55+
class PBR_Renderer;
5556

5657
class Tutorial27_PostProcessing final : public SampleBase
5758
{
@@ -91,6 +92,8 @@ class Tutorial27_PostProcessing final : public SampleBase
9192

9293
void ModifyEngineInitInfo(const ModifyEngineInitInfoAttribs& Attribs) override;
9394

95+
void LoadEnvironmentMap(const char* FileName);
96+
9497
private:
9598
using RenderTechnique = PostFXRenderTechnique;
9699
using ResourceInternal = RefCntAutoPtr<IDeviceObject>;
@@ -129,6 +132,7 @@ class Tutorial27_PostProcessing final : public SampleBase
129132
ResourceRegistry m_Resources{};
130133

131134
std::unique_ptr<GBuffer> m_GBuffer;
135+
std::unique_ptr<PBR_Renderer> m_IBLBacker;
132136
std::unique_ptr<EnvMapRenderer> m_EnvironmentMapRenderer;
133137
std::unique_ptr<PostFXContext> m_PostFXContext;
134138
std::unique_ptr<ScreenSpaceReflection> m_ScreenSpaceReflection;

0 commit comments

Comments
 (0)