@@ -67,7 +67,7 @@ void ScreenQuad::D3D12Init(D3D12* renderer) {
6767
6868 Descriptor albedoDesc = renderer->m_cbvSrvHeap ->GetDescriptor (0 );
6969 Descriptor normalDesc = renderer->m_cbvSrvHeap ->GetDescriptor (1 );
70- Descriptor positionDesc = renderer->m_cbvSrvHeap ->GetDescriptor (2 );
70+ Descriptor depthDesc = renderer->m_cbvSrvHeap ->GetDescriptor (2 );
7171 Descriptor ORMDesc = renderer->m_cbvSrvHeap ->GetDescriptor (3 );
7272
7373 D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = { };
@@ -76,38 +76,44 @@ void ScreenQuad::D3D12Init(D3D12* renderer) {
7676 srvDesc.Texture2D .MipLevels = 1 ;
7777 srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
7878
79+ D3D12_SHADER_RESOURCE_VIEW_DESC dsvSrvDesc = { };
80+ dsvSrvDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
81+ dsvSrvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS;
82+ dsvSrvDesc.Texture2D .MipLevels = 1 ;
83+ dsvSrvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
84+
7985 this ->m_dev ->CreateShaderResourceView (renderer->m_albedoBuff .Get (), &srvDesc, albedoDesc.cpuHandle );
8086 this ->m_dev ->CreateShaderResourceView (renderer->m_uvBuff .Get (), &srvDesc, normalDesc.cpuHandle );
81- this ->m_dev ->CreateShaderResourceView (renderer->m_positionBuff .Get (), &srvDesc, positionDesc .cpuHandle );
87+ this ->m_dev ->CreateShaderResourceView (renderer->m_depthBuffer .Get (), &dsvSrvDesc, depthDesc .cpuHandle );
8288 this ->m_dev ->CreateShaderResourceView (renderer->m_ORMBuff .Get (), &srvDesc, ORMDesc.cpuHandle );
8389
8490 CD3DX12_DESCRIPTOR_RANGE albedoRange;
8591 CD3DX12_DESCRIPTOR_RANGE normalRange;
86- CD3DX12_DESCRIPTOR_RANGE positionRange ;
92+ CD3DX12_DESCRIPTOR_RANGE depthRange ;
8793 CD3DX12_DESCRIPTOR_RANGE ORMRange;
8894 CD3DX12_DESCRIPTOR_RANGE cbuffRange;
8995
9096 albedoRange.Init (D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1 , 0 );
9197 normalRange.Init (D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1 , 1 );
92- positionRange .Init (D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1 , 2 );
98+ depthRange .Init (D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1 , 2 );
9399 ORMRange.Init (D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1 , 3 );
94100 cbuffRange.Init (D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1 , 0 );
95101
96102 CD3DX12_ROOT_PARAMETER albedoParam;
97103 CD3DX12_ROOT_PARAMETER normalParam;
98- CD3DX12_ROOT_PARAMETER positionParam ;
104+ CD3DX12_ROOT_PARAMETER depthParam ;
99105 CD3DX12_ROOT_PARAMETER ORMParam;
100106 CD3DX12_ROOT_PARAMETER cbuffParam;
101107 albedoParam.InitAsDescriptorTable (1 , &albedoRange, D3D12_SHADER_VISIBILITY_PIXEL);
102108 normalParam.InitAsDescriptorTable (1 , &normalRange, D3D12_SHADER_VISIBILITY_PIXEL);
103- positionParam .InitAsDescriptorTable (1 , &positionRange , D3D12_SHADER_VISIBILITY_PIXEL);
109+ depthParam .InitAsDescriptorTable (1 , &depthRange , D3D12_SHADER_VISIBILITY_PIXEL);
104110 ORMParam.InitAsDescriptorTable (1 , &ORMRange, D3D12_SHADER_VISIBILITY_PIXEL);
105111 cbuffParam.InitAsDescriptorTable (1 , &cbuffRange, D3D12_SHADER_VISIBILITY_PIXEL);
106112
107113 D3D12_ROOT_PARAMETER rootParams[] = {
108114 albedoParam,
109115 normalParam,
110- positionParam ,
116+ depthParam ,
111117 ORMParam,
112118 cbuffParam
113119 };
@@ -177,6 +183,23 @@ void ScreenQuad::InitConstantBuffer() {
177183 if (D3D12* renderer = dynamic_cast <D3D12*>(this ->m_renderer )) {
178184 Camera* currentCamera = this ->m_sceneMgr ->GetCurrentScene ()->GetCurrentCamera ();
179185
186+ Transform cameraTransform = this ->m_sceneMgr ->GetCurrentScene ()->GetCurrentCamera ()->transform ;
187+ this ->m_sqCBuffData .InverseView = XMMatrixTranspose (XMMatrixIdentity ());
188+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixRotationX (XMConvertToRadians (currentCamera->transform .rotation .x )));
189+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixRotationY (XMConvertToRadians (currentCamera->transform .rotation .y )));
190+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixRotationZ (XMConvertToRadians (currentCamera->transform .rotation .z )));
191+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixTranslation (
192+ currentCamera->transform .location .x ,
193+ currentCamera->transform .location .y ,
194+ currentCamera->transform .location .z ));
195+
196+ this ->m_sqCBuffData .InverseProjection = XMMatrixTranspose (XMMatrixPerspectiveFovRH (
197+ XMConvertToRadians (70 .f ),
198+ static_cast <float >(renderer->m_nWidth ) / static_cast <float >(renderer->m_nHeight ),
199+ 0 .01f ,
200+ 3000 .f ));
201+
202+
180203 this ->m_sqCBuffData .cameraPosition = XMFLOAT3 (
181204 currentCamera->transform .location .x ,
182205 currentCamera->transform .location .y ,
@@ -198,27 +221,49 @@ void ScreenQuad::InitConstantBuffer() {
198221}
199222
200223void ScreenQuad::UpdateConstantBuffer () {
201- Camera* currentCamera = this ->m_sceneMgr ->GetCurrentScene ()->GetCurrentCamera ();
224+ if (D3D12* renderer = dynamic_cast <D3D12*>(this ->m_renderer )) {
225+ Camera* currentCamera = this ->m_sceneMgr ->GetCurrentScene ()->GetCurrentCamera ();
226+
227+ Transform cameraTransform = this ->m_sceneMgr ->GetCurrentScene ()->GetCurrentCamera ()->transform ;
228+ this ->m_sqCBuffData .InverseView = XMMatrixTranspose (XMMatrixIdentity ());
229+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixRotationX (XMConvertToRadians (currentCamera->transform .rotation .x )));
230+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixRotationY (XMConvertToRadians (currentCamera->transform .rotation .y )));
231+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixRotationZ (XMConvertToRadians (currentCamera->transform .rotation .z )));
232+ this ->m_sqCBuffData .InverseView *= XMMatrixTranspose (XMMatrixTranslation (
233+ currentCamera->transform .location .x ,
234+ currentCamera->transform .location .y ,
235+ currentCamera->transform .location .z ));
236+ this ->m_sqCBuffData .InverseView = (XMMatrixInverse (nullptr , this ->m_sqCBuffData .InverseView ));
202237
203- this ->m_sqCBuffData .cameraPosition = XMFLOAT3 (
204- currentCamera->transform .location .x ,
205- currentCamera->transform .location .y ,
206- currentCamera->transform .location .z
207- );
238+ this ->m_sqCBuffData .InverseProjection = XMMatrixTranspose (XMMatrixPerspectiveFovRH (
239+ XMConvertToRadians (70 .f ),
240+ static_cast <float >(renderer->m_nWidth ) / static_cast <float >(renderer->m_nHeight ),
241+ 0 .01f ,
242+ 3000 .f ));
243+ this ->m_sqCBuffData .InverseProjection = XMMatrixInverse (nullptr , this ->m_sqCBuffData .InverseProjection );
244+ this ->m_sqCBuffData .screenSize = XMFLOAT2 (renderer->m_nWidth , renderer->m_nHeight );
208245
209- UINT nConstantBufferSize = (sizeof (this ->m_sqCBuffData ) + 255 ) & ~255 ;
210246
211- PVOID pData;
212- ThrowIfFailed (this ->m_sqCBuffer ->Map (0 , nullptr , &pData));
213- memcpy (pData, &this ->m_sqCBuffData , nConstantBufferSize);
214- this ->m_sqCBuffer ->Unmap (0 , nullptr );
247+ this ->m_sqCBuffData .cameraPosition = XMFLOAT3 (
248+ currentCamera->transform .location .x ,
249+ currentCamera->transform .location .y ,
250+ currentCamera->transform .location .z
251+ );
252+
253+ UINT nConstantBufferSize = (sizeof (this ->m_sqCBuffData ) + 255 ) & ~255 ;
254+
255+ PVOID pData;
256+ ThrowIfFailed (this ->m_sqCBuffer ->Map (0 , nullptr , &pData));
257+ memcpy (pData, &this ->m_sqCBuffData , nConstantBufferSize);
258+ this ->m_sqCBuffer ->Unmap (0 , nullptr );
259+ }
215260}
216261
217262void ScreenQuad::D3D12Render (D3D12* renderer) {
218263 this ->UpdateConstantBuffer ();
219264 Descriptor albedoDesc = renderer->m_cbvSrvHeap ->GetDescriptor (0 );
220265 Descriptor normalDesc = renderer->m_cbvSrvHeap ->GetDescriptor (1 );
221- Descriptor positionDesc = renderer->m_cbvSrvHeap ->GetDescriptor (2 );
266+ Descriptor depthParam = renderer->m_cbvSrvHeap ->GetDescriptor (2 );
222267 Descriptor materialDesc = renderer->m_cbvSrvHeap ->GetDescriptor (3 );
223268 Descriptor sqBuffDesc = renderer->m_cbvSrvHeap ->GetDescriptor (this ->m_nSqCBuffIndex );
224269 this ->m_list ->OMSetRenderTargets (1 , &this ->m_rtvDescriptor .cpuHandle , FALSE , nullptr );
@@ -232,8 +277,7 @@ void ScreenQuad::D3D12Render(D3D12* renderer) {
232277
233278 this ->m_list ->SetGraphicsRootDescriptorTable (0 , albedoDesc.gpuHandle );
234279 this ->m_list ->SetGraphicsRootDescriptorTable (1 , normalDesc.gpuHandle );
235- this ->m_list ->SetGraphicsRootDescriptorTable (2 , positionDesc.gpuHandle );
236- this ->m_list ->SetGraphicsRootDescriptorTable (3 , materialDesc.gpuHandle );
280+ this ->m_list ->SetGraphicsRootDescriptorTable (2 , depthParam.gpuHandle );
237281 this ->m_list ->SetGraphicsRootDescriptorTable (3 , materialDesc.gpuHandle );
238282 this ->m_list ->SetGraphicsRootDescriptorTable (4 , sqBuffDesc.gpuHandle );
239283
0 commit comments