如何将延迟渲染和前向渲染结合在一起?

How to combine deferred and forward rendering together?

我正在尝试同时使用延迟渲染和正向渲染。我有来自 opengl 教程的工作代码,我尝试用同样的方式适应 vulkan。

这种 opengl 方式:

glBindFramebuffer(GL_FRAMEBUFFER, gBuffer_FrameBuffer);
//draw gBuffer

glBindFramebuffer(GL_FRAMEBUFFER, main_FrameBuffer);
//draw deferred

glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer_FrameBuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, main_FrameBuffer); // write to default framebuffer
glBlitFramebuffer(0,0,SCR_WIDTH,SCR_HEIGHT,0,0,SCR_WIDTH,SCR_HEIGHT,GL_DEPTH_BUFFER_BIT,GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, main_FrameBuffer);
//draw forward

在 vulkan 中,我为 manuel clear

设置了这样的 main_FrameBuffer renderpass
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;

并尝试过:

vkBeginCommandBuffer()

vkCmdBeginRenderPass()//with gBuffer_FrameBuffer
//draw gBuffer
vkCmdEndRenderPass()

vkCmdBeginRenderPass()//main_FrameBuffer
vkCmdClearAttachments()// clear manuel
//draw deferred
vkCmdEndRenderPass()

vkCmdPipelineBarrier//src : gBuffer_FrameBuffer depth image
vkCmdPipelineBarrier//dst : main_FrameBuffer depth image
vkCmdBlitImage//copy gBuffer_FrameBuffer depth image to main_FrameBuffer depth image
vkCmdPipelineBarrier//src : gBuffer_FrameBuffer depth image
vkCmdPipelineBarrier//dst : main_FrameBuffer depth image

vkCmdBeginRenderPass()//main_FrameBuffer here i didn't clear manuel but i am taking black screen
//draw forward
vkCmdEndRenderPass()


vkEndCommandBuffer()
vkCmdPipelineBarrier//src : gBuffer_FrameBuffer depth ima/ge
vkCmdPipelineBarrier//dst : main_FrameBuffer depth image/

OpenGL 不是 Vulkan。

在 OpenGL 中,您实际上有 2 个深度图像。你的 gbuffer FBO 有一个深度图像,默认的帧缓冲区有一个深度图像。这是必要的,因为您不能将 gbuffer 的深度图像附加到默认的帧缓冲区;您被迫使用默认帧缓冲区的深度图像。

Vulkan 没有默认帧缓冲区。交换链图像不是帧缓冲区;这只是一个图像。具体来说,一张 color 图像。如果你想渲染成带有深度测试的交换链图像,那么你必须提供深度图像。

可以与您用于延迟渲染的相同。

事实上,绝对没有理由在您的系统中拥有多个渲染通道。你只需要有多个子通道。

渲染过程包含多个图像附件:gbuffer 所需的任何颜色附件、深度附件和要渲染到的交换链图像。 Subpass 0 渲染到 gbuffer 附件和深度附件。 Subpass 1 从 gbuffer&depth 附件中读取作为输入附件,并写入交换链图像。 Subpass 2 写入交换链图像和深度附件。

此处无需在 Vulkan 中复制任何内容。