@@ -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
225226void 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+
398443static 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 :
0 commit comments