Vulkan中帧缓冲和图像有什么区别?

时间:2016-09-18 11:27:27

标签: image framebuffer vulkan

我知道framebuffer是渲染管道的最终目的地,而swapchain包含许多图像。那么这两件事之间的关系是什么?哪一个是实际的渲染目标?帧缓冲区后来是否会在图像视图中附加当前帧的最终图片?如果是这样,它将如何转移?

通过油漆或图表来描述这一点会很高兴。

2 个答案:

答案 0 :(得分:20)

  • VkFramebuffer + VkRenderPass定义渲染目标。

  • 渲染过程定义哪些附件将用颜色书写。

  • VkFramebuffer定义哪个VkImageView是哪个附件

  • VkImageView定义了VkImage的哪个部分。

  • VkImage定义了使用的VkMemory和texel的格式。

或者可能是相反的顺序:

  • VkMemory只是内存中N个字节的序列。

  • VkImage对象添加了它,例如有关格式的信息(因此您可以通过纹素而不是字节来解决)。

  • VkImageView对象帮助选择部分VkImage(如stringView,arrayView或whathaveyou)也可以帮助匹配某些不兼容的界面(通过动态转换格式)。

  • VkFramebufferVkImageView附件绑定。

  • VkRenderpass定义将附件绘制到哪个

所以它不像你不使用图像。你可以通过Vulkan Framebuffer。

交换链图像与任何其他图像没有区别。除了驱动程序是图像的所有者。你不能直接销毁它或自己分配它。您只需在获取和当前操作之间从驱动程序借用它。

为了缓冲和提前渲染,还有(通常)更多的交换链图像。 AFAIK你需要为每张图片单独VkFramebuffer 令人讨厌,但与下面实际发生的事情更加一致)。

(这里肯定是一张漂亮的图表。也许以后......)

答案 1 :(得分:6)

描述帧缓冲区的Vulkan规范中最好的单句可能是:

  

将用于附件的特定图像视图,以及   它们的尺寸在VkFramebuffer对象中指定。

是的,您需要为交换链中的每个图像设置一个VkFramebuffer对象,但通常只需要为深度缓冲区VkMemory分配一个VkImage,然后添加{ {1}}用于所有帧缓冲区的单个深度缓冲区VkImageView