vulkanrender-to-texture

Vulkan render to texture


In an existing renderer which draws geometry in the swapchain, I need to render some parts of this geometry in a texture, others parts must remain on screen. All the geometry is recorded into one command buffer. I won't need to render this texture every time. I created destination image, image view and framebuffer, but I don't know what to do now. I dont think I need a specific pipeline, nor a new specific descriptor set, as everything is correctly rendered on screen. Do I need another render pass, or a subpass, or anything else?


Solution

  • Exactly, you need a separate renderpass that fills your destination images. As the renderpass stores a reference to the images (as attachments) a separate one is required.

    Within that renderpass you then can use subpass dependencies to transition the destination images to the proper layout. Your first transition should be VK_ACCESS_SHADER_READ_BIT to VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT for writing to the destination image and once that's done you transition back from VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT to VK_ACCESS_SHADER_READ_BIT so you can e.g. render your destination images in the visual pass. An alternative would be blitting them to the swap chain if the device supports that.

    If you need a reference, you can check out my offscreen rendering sample.