如何将延迟渲染和前向渲染结合在一起?
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 中复制任何内容。
我正在尝试同时使用延迟渲染和正向渲染。我有来自 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 renderpasscolorAttachment.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 中复制任何内容。