Skip to content

Commit 9248998

Browse files
GLTFViewer: precompute and bind a dedicated sheen environment map
Use Charlie-prefiltered IBL for sheen in both material and resource-cache paths instead of falling back to the GGX map.
1 parent 73b08a7 commit 9248998

2 files changed

Lines changed: 15 additions & 9 deletions

File tree

‎Samples/GLTFViewer/src/GLTFViewer.cpp‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -398,20 +398,23 @@ bool GLTFViewer::SetEnvironmentMap(ITextureView* pEnvMap)
398398

399399
bool GLTFViewer::CreateIBLCubemaps()
400400
{
401-
if (m_IrradianceCubeSRV != nullptr && m_PrefilteredEnvMapSRV != nullptr)
401+
if (m_IrradianceCubeSRV != nullptr && m_PrefilteredEnvMapSRV != nullptr && m_PrefilteredSheenEnvMapSRV != nullptr)
402402
return true;
403403

404404
m_IrradianceCubeSRV.Release();
405405
m_PrefilteredEnvMapSRV.Release();
406+
m_PrefilteredSheenEnvMapSRV.Release();
406407

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)
408+
RefCntAutoPtr<ITexture> pIrradianceCube = m_GLTFRenderer->CreateIrradianceCube(m_pImmediateContext, "GLTF viewer irradiance cube map");
409+
RefCntAutoPtr<ITexture> pPrefilteredEnvMap = m_GLTFRenderer->CreatePrefilteredEnvMap(m_pImmediateContext, "GLTF viewer prefiltered environment map");
410+
RefCntAutoPtr<ITexture> pPrefilteredSheenEnvMap = m_GLTFRenderer->CreatePrefilteredEnvMap(m_pImmediateContext, "GLTF viewer prefiltered sheen environment map");
411+
if (pIrradianceCube == nullptr || pPrefilteredEnvMap == nullptr || pPrefilteredSheenEnvMap == nullptr)
410412
return false;
411413

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;
414+
m_IrradianceCubeSRV = pIrradianceCube->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
415+
m_PrefilteredEnvMapSRV = pPrefilteredEnvMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
416+
m_PrefilteredSheenEnvMapSRV = pPrefilteredSheenEnvMap->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
417+
return m_IrradianceCubeSRV != nullptr && m_PrefilteredEnvMapSRV != nullptr && m_PrefilteredSheenEnvMapSRV != nullptr;
415418
}
416419

417420
void GLTFViewer::PrecomputeIBLCubemaps(ITextureView* pEnvironmentMapSRV)
@@ -425,6 +428,7 @@ void GLTFViewer::PrecomputeIBLCubemaps(ITextureView* pEnvironmentMapSRV)
425428
Attribs.pEnvironmentMapSRV = pEnvironmentMapSRV;
426429
Attribs.pIrradianceCube = m_IrradianceCubeSRV->GetTexture();
427430
Attribs.pPrefilteredEnvMap = m_PrefilteredEnvMapSRV->GetTexture();
431+
Attribs.pPrefilteredSheenEnvMap = m_PrefilteredSheenEnvMapSRV->GetTexture();
428432
Attribs.SphereMapRow0IsNegativeY = true;
429433
m_GLTFRenderer->PrecomputeCubemaps(m_pImmediateContext, Attribs);
430434
}
@@ -437,7 +441,7 @@ void GLTFViewer::BindIBLResourceViews()
437441
for (RefCntAutoPtr<IShaderResourceBinding>& pMaterialSRB : m_ModelResourceBindings.MaterialSRB)
438442
{
439443
if (pMaterialSRB != nullptr)
440-
m_GLTFRenderer->SetIBLResourceViews(pMaterialSRB, m_IrradianceCubeSRV, m_PrefilteredEnvMapSRV);
444+
m_GLTFRenderer->SetIBLResourceViews(pMaterialSRB, m_IrradianceCubeSRV, m_PrefilteredEnvMapSRV, m_PrefilteredSheenEnvMapSRV);
441445
}
442446
}
443447

@@ -1300,7 +1304,7 @@ void GLTFViewer::Render()
13001304
if (m_pResourceMgr)
13011305
{
13021306
m_GLTFRenderer->Begin(m_pDevice, m_pImmediateContext, m_CacheUseInfo, m_CacheBindings,
1303-
m_FrameAttribsCB, m_IrradianceCubeSRV, m_PrefilteredEnvMapSRV);
1307+
m_FrameAttribsCB, m_IrradianceCubeSRV, m_PrefilteredEnvMapSRV, m_PrefilteredSheenEnvMapSRV);
13041308
}
13051309
else
13061310
{

‎Samples/GLTFViewer/src/GLTFViewer.hpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class GLTFViewer final : public SampleBase
151151
RefCntAutoPtr<ITextureView> m_WhiteFurnaceEnvMapSRV;
152152
RefCntAutoPtr<ITextureView> m_IrradianceCubeSRV;
153153
RefCntAutoPtr<ITextureView> m_PrefilteredEnvMapSRV;
154+
RefCntAutoPtr<ITextureView> m_PrefilteredSheenEnvMapSRV;
154155

155156
ITextureView* m_pCurrentEnvMapSRV = nullptr;
156157

@@ -170,6 +171,7 @@ class GLTFViewer final : public SampleBase
170171
IShaderResourceVariable* ptex2DPreintegratedGGXVar = nullptr;
171172

172173
void Initialize(IRenderDevice* pDevice, TEXTURE_FORMAT RTVFormat, IBuffer* pFrameAttribsCB);
174+
173175
operator bool() const { return pPSO != nullptr; }
174176
};
175177
ApplyPosteffects m_ApplyPostFX;

0 commit comments

Comments
 (0)