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

EkB*_*mYe 12 image framebuffer vulkan

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

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

krO*_*oze 27

  • VkFramebuffer+ VkRenderPass定义渲染目标.

  • 渲染过程定义将使用颜色写入哪个附件.

  • VkFramebuffer定义VkImageView哪个附件.

  • VkImageView定义VkImage要使用的部分.

  • VkImage定义使用哪个VkMemory和texel的格式.


或者可能是相反的顺序:

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

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

  • VkImageViewobject帮助选择部分VkImage(如stringView,arrayView或whathaveyou)也可以帮助匹配某些不兼容的接口(通过动态转换格式).

  • VkFramebufferVkImageView附件绑定a .

  • VkRenderpass定义将绘制哪个附件

所以它不像你不使用图像.你通过Vulkan Framebuffer做到了.

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

为了缓冲和提前渲染,有(通常)更多的交换链图像.AFAIK你需要VkFramebuffer为每张图片单独拍摄(这烦人,但更适合下面的实际情况).

(这里肯定有一个漂亮的图表.也许以后......)

  • 还在等那个图 (5认同)
  • 很好的解释.提供漂亮的图表. (2认同)
  • 只是为了逗弄你,我尝试了一个图表 (2认同)
  • @DavidDiGioia 主要是 UML,带有一点 BS。钻石是聚合体。VkDM 绑定到 VkI,VkI 绑定到 VkIV,VkIV 绑定到 VkF 的附件,而所有对象仍然保留自己的独立性。带点的箭头是指针\数组。渲染通道的附件通过数组索引 int 在 Subpass(Description) 中引用。图中存储器部分中的箭头是“同一性”(即,它是同一存储器,只是解释或寻址不同)。 (2认同)

Kar*_*ltz 8

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

在VkFramebuffer对象中指定了将用于附件的特定图像视图及其尺寸。

是的,VkFramebuffer交换链中的每个图像都需要一个对象,但是通常只需要VkMemory为一个深度缓冲区分配一个对象VkImage,然后VkImageView将该单个深度缓冲区的对象添加VkImage到所有帧缓冲区中。