@@ -98,7 +98,7 @@ namespace rev::gfx
9898
9999 // Update render passes
100100 m_gBufferPass->setDepthTarget (*m_zBuffer);
101- m_gBufferPass->setColorTargets ({ m_hdrLightBuffer .get () });
101+ m_gBufferPass->setColorTargets ({ m_emissiveBuffer. get (), m_baseColorMetalnessBuffer. get (), m_normalPBRBuffer .get () });
102102
103103 gfx::DescriptorSetUpdate renderBufferUpdates (*m_postProDescriptors, 0 );
104104 renderBufferUpdates.addImage (" HDR Light" , m_hdrLightBuffer);
@@ -201,6 +201,45 @@ namespace rev::gfx
201201 m_gBufferPass->end (cmd);
202202 }
203203
204+ // ---------------------------------------------------------------------------------------------------------------------
205+ void DeferredRenderer::renderLightingPass ()
206+ {
207+ m_lightingConstants.windowSize = math::Vec2f ((float )m_windowSize.x (), (float )m_windowSize.y ());
208+ m_lightingConstants.lightDir = m_frameConstants.lightDir ;
209+ m_lightingConstants.lightColor = m_frameConstants.lightColor ;
210+
211+ auto cmd = m_ctxt->getNewRenderCmdBuffer ();
212+ cmd.begin (vk::CommandBufferBeginInfo (vk::CommandBufferUsageFlagBits::eOneTimeSubmit));
213+
214+ m_ctxt->allocator ().transitionImageLayout (cmd, m_emissiveBuffer->image (), vk::ImageLayout::eGeneral, vk::ImageLayout::eShaderReadOnlyOptimal, false );
215+ m_ctxt->allocator ().transitionImageLayout (cmd, m_baseColorMetalnessBuffer->image (), vk::ImageLayout::eGeneral, vk::ImageLayout::eShaderReadOnlyOptimal, false );
216+ m_ctxt->allocator ().transitionImageLayout (cmd, m_normalPBRBuffer->image (), vk::ImageLayout::eGeneral, vk::ImageLayout::eShaderReadOnlyOptimal, false );
217+ m_lightingPass->begin (
218+ cmd,
219+ m_windowSize,
220+ *m_hdrLightBuffer,
221+ nullptr ,
222+ m_lightingDescriptors->getDescriptor (0 ));
223+
224+ m_lightingPass->pushConstants (cmd, m_lightingConstants);
225+ m_lightingPass->render (cmd);
226+
227+ m_lightingPass->end (cmd);
228+
229+ m_ctxt->allocator ().transitionImageLayout (cmd, m_emissiveBuffer->image (), vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eGeneral, false );
230+ m_ctxt->allocator ().transitionImageLayout (cmd, m_baseColorMetalnessBuffer->image (), vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eGeneral, false );
231+ m_ctxt->allocator ().transitionImageLayout (cmd, m_normalPBRBuffer->image (), vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eGeneral, false );
232+
233+ cmd.end ();
234+
235+ vk::PipelineStageFlags waitFlags = {};
236+ vk::SubmitInfo submitInfo (
237+ 0 , nullptr , &waitFlags, // wait
238+ 1 , &cmd, // commands
239+ 0 , nullptr ); // signal
240+ static_cast <VulkanCommandQueue&>(m_ctxt->GfxQueue ()).nativeQueue ().submit (submitInfo);
241+ }
242+
204243 // ---------------------------------------------------------------------------------------------------------------------
205244 void DeferredRenderer::renderPostProPass ()
206245 {
@@ -219,7 +258,7 @@ namespace rev::gfx
219258 cmd,
220259 m_windowSize,
221260 swapchainImage,
222- m_postProConstants.ambientColor ,
261+ & m_postProConstants.ambientColor ,
223262 m_postProDescriptors->getDescriptor (0 ));
224263
225264 m_postPass->pushConstants (cmd, m_postProConstants);
@@ -426,12 +465,20 @@ namespace rev::gfx
426465 auto windowSize = m_ctxt->windowSize ();
427466 auto & alloc = m_ctxt->allocator ();
428467
468+ m_emissiveBuffer = alloc.createImageBuffer (
469+ " HDR light" ,
470+ windowSize,
471+ m_HDRFormat,
472+ vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eStorage,
473+ m_ctxt->graphicsQueueFamily ());
474+
429475 m_hdrLightBuffer = alloc.createImageBuffer (
430476 " HDR light" ,
431477 windowSize,
432478 m_HDRFormat,
433479 vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eStorage,
434480 m_ctxt->graphicsQueueFamily ());
481+
435482 m_zBuffer = alloc.createDepthBuffer (
436483 " Depth" ,
437484 windowSize,
@@ -462,6 +509,7 @@ namespace rev::gfx
462509 void DeferredRenderer::destroyRenderTargets ()
463510 {
464511 m_hdrLightBuffer = nullptr ;
512+ m_emissiveBuffer = nullptr ;
465513 m_zBuffer = nullptr ;
466514 m_normalPBRBuffer = nullptr ;
467515 m_normalPBRBuffer = nullptr ;
0 commit comments