Skip to content

Commit c473cee

Browse files
GLTF Viewer: enabled screen-space reflections
1 parent da75792 commit c473cee

File tree

3 files changed

+67
-10
lines changed

3 files changed

+67
-10
lines changed

Samples/GLTFViewer/assets/shaders/ApplyPostEffects.psh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ cbuffer cbFrameAttribs
1212
}
1313

1414
Texture2D<float4> g_tex2DColor;
15+
Texture2D<float4> g_tex2DSSR;
16+
1517

1618
float4 main(in FullScreenTriangleVSOutput VSOut) : SV_Target
1719
{
1820
float4 Color = g_tex2DColor.Load(int3(VSOut.f4PixelPos.xy, 0));
21+
float4 SSR = g_tex2DSSR.Load(int3(VSOut.f4PixelPos.xy, 0));
22+
Color.rgb += SSR.rgb * SSR.w;
1923

2024
{
2125
// Perform tone mapping

Samples/GLTFViewer/src/GLTFViewer.cpp

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "GraphicsAccessories.hpp"
4545
#include "EnvMapRenderer.hpp"
4646
#include "VectorFieldRenderer.hpp"
47+
#include "ScreenSpaceReflection.hpp"
4748
#include "Utilities/include/DiligentFXShaderSourceStreamFactory.hpp"
4849
#include "ShaderSourceFactoryUtils.h"
4950

@@ -360,7 +361,7 @@ struct PSOutput
360361
#endif
361362
362363
PSOut.Normal = float4(Shading.BaseLayer.Normal, 1.0);
363-
PSOut.MaterialData = float4(Shading.BaseLayer.Metallic, Shading.BaseLayer.Srf.PerceptualRoughness, 0.0, 1.0);
364+
PSOut.MaterialData = float4(Shading.BaseLayer.Srf.PerceptualRoughness, Shading.BaseLayer.Metallic, 0.0, 1.0);
364365
365366
# if ENABLE_CLEAR_COAT
366367
{
@@ -546,6 +547,7 @@ void GLTFViewer::Initialize(const SampleInitInfo& InitInfo)
546547
CreateGLTFRenderer();
547548
CrateEnvMapRenderer();
548549
CreateVectorFieldRenderer();
550+
m_SSR = std::make_unique<ScreenSpaceReflection>(m_pDevice);
549551

550552
RefCntAutoPtr<IRenderStateNotationParser> pRSNParser;
551553
{
@@ -644,6 +646,8 @@ void GLTFViewer::ApplyPosteffects::Initialize(IRenderDevice* pDevice, TEXTURE_FO
644646
pPSO->CreateShaderResourceBinding(&pSRB, true);
645647
ptex2DColorVar = pSRB->GetVariableByName(SHADER_TYPE_PIXEL, "g_tex2DColor");
646648
VERIFY_EXPR(ptex2DColorVar != nullptr);
649+
ptex2DSSR = pSRB->GetVariableByName(SHADER_TYPE_PIXEL, "g_tex2DSSR");
650+
VERIFY_EXPR(ptex2DSSR != nullptr);
647651
}
648652

649653
void GLTFViewer::UpdateUI()
@@ -962,6 +966,8 @@ void GLTFViewer::Render()
962966
m_ApplyPostFX.Initialize(m_pDevice, m_pSwapChain->GetDesc().ColorBufferFormat, m_FrameAttribsCB);
963967
}
964968

969+
m_SSR->SetBackBufferSize(m_pDevice, m_pImmediateContext, SCDesc.Width, SCDesc.Height);
970+
965971
m_GBuffer->Resize(m_pDevice, SCDesc.Width, SCDesc.Height);
966972
m_GBuffer->Bind(m_pImmediateContext, GBUFFER_RT_FLAG_ALL, nullptr, GBUFFER_RT_FLAG_ALL);
967973
}
@@ -974,11 +980,15 @@ void GLTFViewer::Render()
974980
}
975981

976982

983+
const auto& CurrCamAttribs = m_CameraAttribs[m_CurrentFrameNumber & 0x01];
984+
const auto& PrevCamAttribs = m_CameraAttribs[(m_CurrentFrameNumber + 1) & 0x01];
985+
const auto& CurrTransforms = m_Transforms[m_CurrentFrameNumber & 0x01];
986+
const auto& PrevTransforms = m_Transforms[(m_CurrentFrameNumber + 1) & 0x01];
977987

978988
{
979989
MapHelper<HLSL::PBRFrameAttribs> FrameAttribs{m_pImmediateContext, m_FrameAttribsCB, MAP_WRITE, MAP_FLAG_DISCARD};
980-
FrameAttribs->Camera = m_CameraAttribs[m_CurrentFrameNumber & 0x01];
981-
FrameAttribs->PrevCamera = m_CameraAttribs[(m_CurrentFrameNumber + 1) & 0x01];
990+
FrameAttribs->Camera = CurrCamAttribs;
991+
FrameAttribs->PrevCamera = PrevCamAttribs;
982992

983993
{
984994
if (m_BoundBoxMode != BoundBoxMode::None)
@@ -1029,12 +1039,12 @@ void GLTFViewer::Render()
10291039
if (m_pResourceMgr)
10301040
{
10311041
m_GLTFRenderer->Begin(m_pDevice, m_pImmediateContext, m_CacheUseInfo, m_CacheBindings, m_FrameAttribsCB);
1032-
m_GLTFRenderer->Render(m_pImmediateContext, *m_Model, m_Transforms[m_CurrentFrameNumber & 0x01], &m_Transforms[(m_CurrentFrameNumber + 1) & 0x01], m_RenderParams, nullptr, &m_CacheBindings);
1042+
m_GLTFRenderer->Render(m_pImmediateContext, *m_Model, CurrTransforms, &PrevTransforms, m_RenderParams, nullptr, &m_CacheBindings);
10331043
}
10341044
else
10351045
{
10361046
m_GLTFRenderer->Begin(m_pImmediateContext);
1037-
m_GLTFRenderer->Render(m_pImmediateContext, *m_Model, m_Transforms[m_CurrentFrameNumber & 0x01], &m_Transforms[(m_CurrentFrameNumber + 1) & 0x01], m_RenderParams, &m_ModelResourceBindings);
1047+
m_GLTFRenderer->Render(m_pImmediateContext, *m_Model, CurrTransforms, &PrevTransforms, m_RenderParams, &m_ModelResourceBindings);
10381048
}
10391049

10401050
if (m_BoundBoxMode != BoundBoxMode::None)
@@ -1086,13 +1096,54 @@ void GLTFViewer::Render()
10861096

10871097
if (m_bEnablePostProcessing)
10881098
{
1099+
{
1100+
m_pImmediateContext->SetRenderTargets(0, nullptr, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1101+
1102+
StateTransitionDesc Barriers[GBUFFER_RT_COUNT];
1103+
for (Uint32 i = 0; i < GBUFFER_RT_COUNT; ++i)
1104+
Barriers[i] = StateTransitionDesc{m_GBuffer->GetBuffer(i), RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE};
1105+
m_pImmediateContext->TransitionResourceStates(GBUFFER_RT_COUNT, Barriers);
1106+
}
1107+
1108+
{
1109+
ScreenSpaceReflection::RenderAttributes SSRRenderAttribs{};
1110+
SSRRenderAttribs.pDevice = m_pDevice;
1111+
SSRRenderAttribs.pDeviceContext = m_pImmediateContext;
1112+
SSRRenderAttribs.pColorBufferSRV = m_GBuffer->GetBuffer(GBUFFER_RT_COLOR)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
1113+
SSRRenderAttribs.pDepthBufferSRV = m_GBuffer->GetBuffer(GBUFFER_RT_DEPTH)->GetDefaultView(TEXTURE_VIEW_DEPTH_STENCIL);
1114+
SSRRenderAttribs.pNormalBufferSRV = m_GBuffer->GetBuffer(GBUFFER_RT_NORMAL)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
1115+
SSRRenderAttribs.pMaterialBufferSRV = m_GBuffer->GetBuffer(GBUFFER_RT_MATERIAL_DATA)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
1116+
SSRRenderAttribs.pMotionVectorsSRV = m_GBuffer->GetBuffer(GBUFFER_RT_MOTION_VECTORS)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
1117+
1118+
SSRRenderAttribs.SSRAttribs.ProjMatrix = CurrCamAttribs.mProjT;
1119+
SSRRenderAttribs.SSRAttribs.ViewMatrix = CurrCamAttribs.mViewT;
1120+
SSRRenderAttribs.SSRAttribs.ViewProjMatrix = CurrCamAttribs.mViewProjT;
1121+
SSRRenderAttribs.SSRAttribs.InvProjMatrix = CurrCamAttribs.mProjInvT;
1122+
SSRRenderAttribs.SSRAttribs.InvViewMatrix = CurrCamAttribs.mViewInvT;
1123+
SSRRenderAttribs.SSRAttribs.InvViewProjMatrix = CurrCamAttribs.mViewProjInvT;
1124+
SSRRenderAttribs.SSRAttribs.PrevViewProjMatrix = PrevCamAttribs.mViewProjT;
1125+
SSRRenderAttribs.SSRAttribs.InvPrevViewProjMatrix = PrevCamAttribs.mViewProjInvT;
1126+
SSRRenderAttribs.SSRAttribs.CameraPosition = CurrCamAttribs.f4Position;
1127+
1128+
SSRRenderAttribs.SSRAttribs.RenderSize.x = SCDesc.Width;
1129+
SSRRenderAttribs.SSRAttribs.RenderSize.y = SCDesc.Height;
1130+
SSRRenderAttribs.SSRAttribs.InverseRenderSize.x = 1.0f / static_cast<float>(SCDesc.Width);
1131+
SSRRenderAttribs.SSRAttribs.InverseRenderSize.y = 1.0f / static_cast<float>(SCDesc.Height);
1132+
SSRRenderAttribs.SSRAttribs.FrameIndex = m_CurrentFrameNumber;
1133+
SSRRenderAttribs.SSRAttribs.IBLFactor = m_ShaderAttribs.IBLScale;
1134+
SSRRenderAttribs.SSRAttribs.RoughnessChannel = 0;
1135+
SSRRenderAttribs.SSRAttribs.IsRoughnessPerceptual = true;
1136+
m_SSR->Execute(SSRRenderAttribs);
1137+
}
1138+
10891139
m_pImmediateContext->SetRenderTargets(1, &pRTV, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
10901140
// Clear the back buffer
10911141
const float ClearColor[] = {0.032f, 0.032f, 0.032f, 1.0f};
10921142
m_pImmediateContext->ClearRenderTarget(pRTV, ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
10931143

10941144
m_pImmediateContext->SetPipelineState(m_ApplyPostFX.pPSO);
10951145
m_ApplyPostFX.ptex2DColorVar->Set(m_GBuffer->GetBuffer(GBUFFER_RT_COLOR)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE));
1146+
m_ApplyPostFX.ptex2DSSR->Set(m_SSR->GetSSRRadianceSRV());
10961147
m_pImmediateContext->CommitShaderResources(m_ApplyPostFX.pSRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
10971148
m_pImmediateContext->Draw({3, DRAW_FLAG_VERIFY_ALL});
10981149

@@ -1109,9 +1160,6 @@ void GLTFViewer::Render()
11091160
Attribs.EndColor = float4{0.5};
11101161
Attribs.ConvertOutputToSRGB = (SCDesc.ColorBufferFormat == TEX_FORMAT_RGBA8_UNORM || SCDesc.ColorBufferFormat == TEX_FORMAT_BGRA8_UNORM);
11111162

1112-
StateTransitionDesc Barrier{m_GBuffer->GetBuffer(GBUFFER_RT_MOTION_VECTORS), RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_SHADER_RESOURCE, STATE_TRANSITION_FLAG_UPDATE_STATE};
1113-
m_pImmediateContext->TransitionResourceStates(1, &Barrier);
1114-
11151163
Attribs.pVectorField = m_GBuffer->GetBuffer(GBUFFER_RT_MOTION_VECTORS)->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
11161164
m_VectorFieldRenderer->Render(Attribs);
11171165
}
@@ -1182,6 +1230,8 @@ void GLTFViewer::Update(double CurrTime, double ElapsedTime)
11821230
CurrCamAttribs.mViewT = CameraView.Transpose();
11831231
CurrCamAttribs.mProjT = CameraProj.Transpose();
11841232
CurrCamAttribs.mViewProjT = CameraViewProj.Transpose();
1233+
CurrCamAttribs.mViewInvT = CameraView.Inverse().Transpose();
1234+
CurrCamAttribs.mProjInvT = CameraProj.Inverse().Transpose();
11851235
CurrCamAttribs.mViewProjInvT = CameraViewProj.Inverse().Transpose();
11861236
CurrCamAttribs.f4Position = float4(CameraWorldPos, 1);
11871237

Samples/GLTFViewer/src/GLTFViewer.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct CameraAttribs;
4949

5050
class EnvMapRenderer;
5151
class VectorFieldRenderer;
52+
class ScreenSpaceReflection;
5253

5354
class GLTFViewer final : public SampleBase
5455
{
@@ -148,14 +149,16 @@ class GLTFViewer final : public SampleBase
148149
RefCntAutoPtr<IShaderResourceBinding> pSRB;
149150

150151
IShaderResourceVariable* ptex2DColorVar = nullptr;
152+
IShaderResourceVariable* ptex2DSSR = nullptr;
151153

152154
void Initialize(IRenderDevice* pDevice, TEXTURE_FORMAT RTVFormat, IBuffer* pFrameAttribsCB);
153155
operator bool() const { return pPSO != nullptr; }
154156
};
155157
ApplyPosteffects m_ApplyPostFX;
156158

157-
std::unique_ptr<EnvMapRenderer> m_EnvMapRenderer;
158-
std::unique_ptr<VectorFieldRenderer> m_VectorFieldRenderer;
159+
std::unique_ptr<EnvMapRenderer> m_EnvMapRenderer;
160+
std::unique_ptr<VectorFieldRenderer> m_VectorFieldRenderer;
161+
std::unique_ptr<ScreenSpaceReflection> m_SSR;
159162

160163
bool m_bUseResourceCache = false;
161164
RefCntAutoPtr<GLTF::ResourceManager> m_pResourceMgr;

0 commit comments

Comments
 (0)