Skip to content

Commit 4a496c8

Browse files
Samples: manage IBL cubemaps outside PBR renderer
1 parent 30b94f2 commit 4a496c8

3 files changed

Lines changed: 80 additions & 13 deletions

File tree

Samples/GLTFViewer/src/GLTFViewer.cpp

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ void GLTFViewer::LoadModel(const char* Path)
168168
m_Model = std::make_unique<GLTF::Model>(m_pDevice, m_pImmediateContext, ModelCI);
169169

170170
m_ModelResourceBindings = m_GLTFRenderer->CreateResourceBindings(*m_Model, m_FrameAttribsCB);
171+
BindIBLResourceViews();
171172

172173
m_RenderParams.SceneIndex = m_Model->DefaultSceneId;
173174
UpdateScene();
@@ -210,16 +211,16 @@ void GLTFViewer::LoadEnvironmentMap(const char* Path)
210211
CreateTextureFromFile(Path, TextureLoadInfo{"Environment map"}, m_pDevice, &pEnvironmentMap);
211212
VERIFY_EXPR(pEnvironmentMap);
212213

213-
if (m_GLTFRenderer)
214-
m_GLTFRenderer->PrecomputeCubemaps(m_pImmediateContext, pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
215-
216214
StateTransitionDesc Barriers[] = {
217215
{pEnvironmentMap, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE},
218216
};
219217
m_pImmediateContext->TransitionResourceStates(_countof(Barriers), Barriers);
220218

221219
m_EnvironmentMapSRV = pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
222-
m_pCurrentEnvMapSRV = m_EnvironmentMapSRV;
220+
if (m_GLTFRenderer)
221+
SetEnvironmentMap(m_EnvironmentMapSRV);
222+
else
223+
m_pCurrentEnvMapSRV = m_EnvironmentMapSRV;
223224
}
224225

225226
void GLTFViewer::UpdateScene()
@@ -390,11 +391,55 @@ bool GLTFViewer::SetEnvironmentMap(ITextureView* pEnvMap)
390391
return false;
391392

392393
m_pCurrentEnvMapSRV = pEnvMap;
393-
m_GLTFRenderer->PrecomputeCubemaps(m_pImmediateContext, m_pCurrentEnvMapSRV);
394+
PrecomputeIBLCubemaps(m_pCurrentEnvMapSRV);
394395

395396
return true;
396397
}
397398

399+
bool GLTFViewer::CreateIBLCubemaps()
400+
{
401+
if (m_IrradianceCubeSRV != nullptr && m_PrefilteredEnvMapSRV != nullptr)
402+
return true;
403+
404+
m_IrradianceCubeSRV.Release();
405+
m_PrefilteredEnvMapSRV.Release();
406+
407+
RefCntAutoPtr<ITexture> pIrradianceCube = m_GLTFRenderer->CreateIrradianceCube(m_pImmediateContext, "GLTF viewer irradiance cube map");
408+
RefCntAutoPtr<ITexture> pPrefilteredEnvMap = m_GLTFRenderer->CreatePrefilteredEnvMap(m_pImmediateContext, "GLTF viewer prefiltered environment map");
409+
if (pIrradianceCube == nullptr || pPrefilteredEnvMap == nullptr)
410+
return false;
411+
412+
m_IrradianceCubeSRV = pIrradianceCube->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
413+
m_PrefilteredEnvMapSRV = pPrefilteredEnvMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
414+
return m_IrradianceCubeSRV != nullptr && m_PrefilteredEnvMapSRV != nullptr;
415+
}
416+
417+
void GLTFViewer::PrecomputeIBLCubemaps(ITextureView* pEnvironmentMapSRV)
418+
{
419+
if (m_GLTFRenderer == nullptr || pEnvironmentMapSRV == nullptr)
420+
{
421+
return;
422+
}
423+
424+
PBR_Renderer::PrecomputeCubemapsAttribs Attribs;
425+
Attribs.pEnvironmentMapSRV = pEnvironmentMapSRV;
426+
Attribs.pIrradianceCube = m_IrradianceCubeSRV->GetTexture();
427+
Attribs.pPrefilteredEnvMap = m_PrefilteredEnvMapSRV->GetTexture();
428+
m_GLTFRenderer->PrecomputeCubemaps(m_pImmediateContext, Attribs);
429+
}
430+
431+
void GLTFViewer::BindIBLResourceViews()
432+
{
433+
if (m_GLTFRenderer == nullptr)
434+
return;
435+
436+
for (RefCntAutoPtr<IShaderResourceBinding>& pMaterialSRB : m_ModelResourceBindings.MaterialSRB)
437+
{
438+
if (pMaterialSRB != nullptr)
439+
m_GLTFRenderer->SetIBLResourceViews(pMaterialSRB, m_IrradianceCubeSRV, m_PrefilteredEnvMapSRV);
440+
}
441+
}
442+
398443
static PBR_Renderer::CreateInfo::PSMainSourceInfo GetPbrPSMainSource(PBR_Renderer::PSO_FLAGS PSOFlags)
399444
{
400445
PBR_Renderer::CreateInfo::PSMainSourceInfo PSMainInfo;
@@ -565,7 +610,12 @@ void GLTFViewer::CreateGLTFRenderer()
565610
GLTF_PBR_Renderer::CreateInfo::TEX_COLOR_CONVERSION_MODE_NONE :
566611
GLTF_PBR_Renderer::CreateInfo::TEX_COLOR_CONVERSION_MODE_SRGB_TO_LINEAR;
567612

613+
m_CacheBindings.pSRB.Release();
614+
m_CacheBindings.Version = ~0u;
615+
568616
m_GLTFRenderer = std::make_unique<GLTF_PBR_Renderer>(m_pDevice, nullptr, m_pImmediateContext, RendererCI);
617+
if (!CreateIBLCubemaps())
618+
LOG_ERROR_MESSAGE("Failed to create GLTF viewer IBL cubemaps");
569619

570620
if (m_bUseResourceCache)
571621
{
@@ -1229,7 +1279,7 @@ void GLTFViewer::Render()
12291279
}
12301280
{
12311281
HLSL::PBRRendererShaderParameters& Renderer = FrameAttribs->Renderer;
1232-
m_GLTFRenderer->SetInternalShaderParameters(Renderer);
1282+
m_GLTFRenderer->SetInternalShaderParameters(Renderer, m_PrefilteredEnvMapSRV);
12331283

12341284
Renderer.OcclusionStrength = m_ShaderAttribs.OcclusionStrength;
12351285
Renderer.EmissionScale = m_ShaderAttribs.EmissionScale;
@@ -1248,7 +1298,8 @@ void GLTFViewer::Render()
12481298

12491299
if (m_pResourceMgr)
12501300
{
1251-
m_GLTFRenderer->Begin(m_pDevice, m_pImmediateContext, m_CacheUseInfo, m_CacheBindings, m_FrameAttribsCB);
1301+
m_GLTFRenderer->Begin(m_pDevice, m_pImmediateContext, m_CacheUseInfo, m_CacheBindings,
1302+
m_FrameAttribsCB, m_IrradianceCubeSRV, m_PrefilteredEnvMapSRV);
12521303
}
12531304
else
12541305
{
@@ -1285,11 +1336,11 @@ void GLTFViewer::Render()
12851336
break;
12861337

12871338
case BackgroundMode::Irradiance:
1288-
pEnvMapSRV = m_GLTFRenderer->GetIrradianceCubeSRV();
1339+
pEnvMapSRV = m_IrradianceCubeSRV;
12891340
break;
12901341

12911342
case BackgroundMode::PrefilteredEnvMap:
1292-
pEnvMapSRV = m_GLTFRenderer->GetPrefilteredEnvMapSRV();
1343+
pEnvMapSRV = m_PrefilteredEnvMapSRV;
12931344
break;
12941345

12951346
default:

Samples/GLTFViewer/src/GLTFViewer.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ class GLTFViewer final : public SampleBase
7575
void CreateGLTFResourceCache();
7676
void UpdateModelsList(const std::string& Dir, const std::string& Ext);
7777
bool SetEnvironmentMap(ITextureView* pEnvMap);
78+
bool CreateIBLCubemaps();
79+
void PrecomputeIBLCubemaps(ITextureView* pEnvironmentMapSRV);
80+
void BindIBLResourceViews();
7881
void CreateGLTFRenderer();
7982
void CrateEnvMapRenderer();
8083
void CrateBoundBoxRenderer();
@@ -146,6 +149,8 @@ class GLTFViewer final : public SampleBase
146149
RefCntAutoPtr<IBuffer> m_FrameAttribsCB;
147150
RefCntAutoPtr<ITextureView> m_EnvironmentMapSRV;
148151
RefCntAutoPtr<ITextureView> m_WhiteFurnaceEnvMapSRV;
152+
RefCntAutoPtr<ITextureView> m_IrradianceCubeSRV;
153+
RefCntAutoPtr<ITextureView> m_PrefilteredEnvMapSRV;
149154

150155
ITextureView* m_pCurrentEnvMapSRV = nullptr;
151156

Tutorials/Tutorial27_PostProcessing/src/Tutorial27_PostProcessing.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,11 +1190,22 @@ void Tutorial27_PostProcessing::LoadEnvironmentMap(const char* FileName)
11901190
RefCntAutoPtr<ITexture> pEnvironmentMap;
11911191
CreateTextureFromFile(FileName, TextureLoadInfo{"Tutorial27_PostProcessing::EnvironmentMap"}, m_pDevice, &pEnvironmentMap);
11921192
DEV_CHECK_ERR(pEnvironmentMap, "Failed to load environment map");
1193-
m_IBLBacker->PrecomputeCubemaps(m_pImmediateContext, pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
11941193

1195-
m_Resources.Insert(RESOURCE_IDENTIFIER_ENVIRONMENT_MAP, m_IBLBacker->GetPrefilteredEnvMapSRV()->GetTexture());
1196-
m_Resources.Insert(RESOURCE_IDENTIFIER_PREFILTERED_ENVIRONMENT_MAP, m_IBLBacker->GetPrefilteredEnvMapSRV()->GetTexture());
1197-
m_Resources.Insert(RESOURCE_IDENTIFIER_IRRADIANCE_MAP, m_IBLBacker->GetIrradianceCubeSRV()->GetTexture());
1194+
RefCntAutoPtr<ITexture> pIrradianceCube;
1195+
RefCntAutoPtr<ITexture> pPrefilteredEnvMap;
1196+
pIrradianceCube = m_IBLBacker->CreateIrradianceCube(m_pImmediateContext, "Tutorial27 irradiance cube map");
1197+
pPrefilteredEnvMap = m_IBLBacker->CreatePrefilteredEnvMap(m_pImmediateContext, "Tutorial27 prefiltered environment map");
1198+
DEV_CHECK_ERR(pIrradianceCube && pPrefilteredEnvMap, "Failed to create IBL cubemaps");
1199+
1200+
PBR_Renderer::PrecomputeCubemapsAttribs Attribs;
1201+
Attribs.pEnvironmentMapSRV = pEnvironmentMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
1202+
Attribs.pIrradianceCube = pIrradianceCube;
1203+
Attribs.pPrefilteredEnvMap = pPrefilteredEnvMap;
1204+
m_IBLBacker->PrecomputeCubemaps(m_pImmediateContext, Attribs);
1205+
1206+
m_Resources.Insert(RESOURCE_IDENTIFIER_ENVIRONMENT_MAP, pPrefilteredEnvMap);
1207+
m_Resources.Insert(RESOURCE_IDENTIFIER_PREFILTERED_ENVIRONMENT_MAP, pPrefilteredEnvMap);
1208+
m_Resources.Insert(RESOURCE_IDENTIFIER_IRRADIANCE_MAP, pIrradianceCube);
11981209
m_Resources.Insert(RESOURCE_IDENTIFIER_BRDF_INTEGRATION_MAP, m_IBLBacker->GetPreintegratedGGX_SRV()->GetTexture());
11991210
}
12001211

0 commit comments

Comments
 (0)