44
44
#include " GraphicsAccessories.hpp"
45
45
#include " EnvMapRenderer.hpp"
46
46
#include " VectorFieldRenderer.hpp"
47
+ #include " ScreenSpaceReflection.hpp"
47
48
#include " Utilities/include/DiligentFXShaderSourceStreamFactory.hpp"
48
49
#include " ShaderSourceFactoryUtils.h"
49
50
@@ -360,7 +361,7 @@ struct PSOutput
360
361
#endif
361
362
362
363
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);
364
365
365
366
# if ENABLE_CLEAR_COAT
366
367
{
@@ -546,6 +547,7 @@ void GLTFViewer::Initialize(const SampleInitInfo& InitInfo)
546
547
CreateGLTFRenderer ();
547
548
CrateEnvMapRenderer ();
548
549
CreateVectorFieldRenderer ();
550
+ m_SSR = std::make_unique<ScreenSpaceReflection>(m_pDevice);
549
551
550
552
RefCntAutoPtr<IRenderStateNotationParser> pRSNParser;
551
553
{
@@ -644,6 +646,8 @@ void GLTFViewer::ApplyPosteffects::Initialize(IRenderDevice* pDevice, TEXTURE_FO
644
646
pPSO->CreateShaderResourceBinding (&pSRB, true );
645
647
ptex2DColorVar = pSRB->GetVariableByName (SHADER_TYPE_PIXEL, " g_tex2DColor" );
646
648
VERIFY_EXPR (ptex2DColorVar != nullptr );
649
+ ptex2DSSR = pSRB->GetVariableByName (SHADER_TYPE_PIXEL, " g_tex2DSSR" );
650
+ VERIFY_EXPR (ptex2DSSR != nullptr );
647
651
}
648
652
649
653
void GLTFViewer::UpdateUI ()
@@ -962,6 +966,8 @@ void GLTFViewer::Render()
962
966
m_ApplyPostFX.Initialize (m_pDevice, m_pSwapChain->GetDesc ().ColorBufferFormat , m_FrameAttribsCB);
963
967
}
964
968
969
+ m_SSR->SetBackBufferSize (m_pDevice, m_pImmediateContext, SCDesc.Width , SCDesc.Height );
970
+
965
971
m_GBuffer->Resize (m_pDevice, SCDesc.Width , SCDesc.Height );
966
972
m_GBuffer->Bind (m_pImmediateContext, GBUFFER_RT_FLAG_ALL, nullptr , GBUFFER_RT_FLAG_ALL);
967
973
}
@@ -974,11 +980,15 @@ void GLTFViewer::Render()
974
980
}
975
981
976
982
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 ];
977
987
978
988
{
979
989
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 ;
982
992
983
993
{
984
994
if (m_BoundBoxMode != BoundBoxMode::None)
@@ -1029,12 +1039,12 @@ void GLTFViewer::Render()
1029
1039
if (m_pResourceMgr)
1030
1040
{
1031
1041
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);
1033
1043
}
1034
1044
else
1035
1045
{
1036
1046
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);
1038
1048
}
1039
1049
1040
1050
if (m_BoundBoxMode != BoundBoxMode::None)
@@ -1086,13 +1096,54 @@ void GLTFViewer::Render()
1086
1096
1087
1097
if (m_bEnablePostProcessing)
1088
1098
{
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
+
1089
1139
m_pImmediateContext->SetRenderTargets (1 , &pRTV, nullptr , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1090
1140
// Clear the back buffer
1091
1141
const float ClearColor[] = {0 .032f , 0 .032f , 0 .032f , 1 .0f };
1092
1142
m_pImmediateContext->ClearRenderTarget (pRTV, ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1093
1143
1094
1144
m_pImmediateContext->SetPipelineState (m_ApplyPostFX.pPSO );
1095
1145
m_ApplyPostFX.ptex2DColorVar ->Set (m_GBuffer->GetBuffer (GBUFFER_RT_COLOR)->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE));
1146
+ m_ApplyPostFX.ptex2DSSR ->Set (m_SSR->GetSSRRadianceSRV ());
1096
1147
m_pImmediateContext->CommitShaderResources (m_ApplyPostFX.pSRB , RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
1097
1148
m_pImmediateContext->Draw ({3 , DRAW_FLAG_VERIFY_ALL});
1098
1149
@@ -1109,9 +1160,6 @@ void GLTFViewer::Render()
1109
1160
Attribs.EndColor = float4{0.5 };
1110
1161
Attribs.ConvertOutputToSRGB = (SCDesc.ColorBufferFormat == TEX_FORMAT_RGBA8_UNORM || SCDesc.ColorBufferFormat == TEX_FORMAT_BGRA8_UNORM);
1111
1162
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
-
1115
1163
Attribs.pVectorField = m_GBuffer->GetBuffer (GBUFFER_RT_MOTION_VECTORS)->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE);
1116
1164
m_VectorFieldRenderer->Render (Attribs);
1117
1165
}
@@ -1182,6 +1230,8 @@ void GLTFViewer::Update(double CurrTime, double ElapsedTime)
1182
1230
CurrCamAttribs.mViewT = CameraView.Transpose ();
1183
1231
CurrCamAttribs.mProjT = CameraProj.Transpose ();
1184
1232
CurrCamAttribs.mViewProjT = CameraViewProj.Transpose ();
1233
+ CurrCamAttribs.mViewInvT = CameraView.Inverse ().Transpose ();
1234
+ CurrCamAttribs.mProjInvT = CameraProj.Inverse ().Transpose ();
1185
1235
CurrCamAttribs.mViewProjInvT = CameraViewProj.Inverse ().Transpose ();
1186
1236
CurrCamAttribs.f4Position = float4 (CameraWorldPos, 1 );
1187
1237
0 commit comments