【问题标题】:What is the difference between framebuffer and image in Vulkan?Vulkan 中的帧缓冲区和图像有什么区别?
【发布时间】:2017-01-26 04:43:47
【问题描述】:

我知道帧缓冲区是渲染管道的最终目的地,而交换链包含许多图像。那么这两件事之间有什么关系呢?哪个是实际的渲染目标?并且framebuffer稍后会在image view上附加当前帧的最终图片吗?如果是,它将如何转移?

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

【问题讨论】:

  • "我知道帧缓冲区是渲染管道的最终目的地" VkFramebuffer 不是任何东西的“最终目的地”。您渲染的内容由您的子通道定义,这些通道引用 VkFramebuffer 中的图像。但是VkFramebuffer 本身并没有真正做任何事情。听起来你在谈论更多像 OpenGL 的默认帧缓冲区这样的东西。
  • 好吧,也许我只是习惯了 OpenGL。那么哪一个收集图像?我认为交换链收集它们。我是不是误会了什么?

标签: image framebuffer vulkan


【解决方案1】:
  • VkFramebuffer + VkRenderPass 定义渲染目标。

  • 渲染通道定义了将用颜色写入的附件

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

  • VkImageView 定义要使用VkImage 的哪一部分。

  • VkImage 定义了使用哪个VkMemory 以及纹素的格式。


或者可能是相反的顺序:

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

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

  • VkImageView 对象有助于仅选择VkImage 的一部分(数组或mip)(如stringView、arrayView 或你所做的)。也可以帮助匹配一些不兼容的接口(通过类型转换格式)。

  • VkFramebufferVkImageView附件绑定。

  • VkRenderpass 定义将被绘制到的附件

所以这并不是说您不使用图像。您可以通过 Vulkan 帧缓冲区进行操作。

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

为了缓冲和提前渲染,(通常)有更多的交换链图像。 AFAIK 您需要为每张图片单独设置一个 VkFramebuffer(这烦人,但更符合下面实际发生的情况)。

【讨论】:

  • 很好的解释。也提供那个漂亮的图表。
  • 还在等那个图,
  • 只是为了骗你,我尝试了一个图表
  • 我们在哪里可以了解图中关系的含义?我的最佳猜测如下:白色菱形 = 包含在,黑色箭头 = 是,虚线 = 注释,线箭头 = 参考。
  • @DavidDiGioia 主要是 UML,带有一点 BS。钻石是聚合。 VkDM 与 VkI 绑定,VkI 与 VkIV 绑定,VkIV 与 VkF 绑定,而所有对象仍然保持自己的独立性。带点的箭头是指针\数组。渲染通道的附件通过数组索引 int 在 Subpass(Description) 中引用。图中内存部分的箭头是“同一性”(即,它是相同的内存,只是解释或寻址方式不同)。
【解决方案2】:

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

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

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

【讨论】:

  • 你不是 LunarG 的一员吗?嘿,感谢您花时间在这里回答我们这些凡人的问题 =)
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多