我知道帧缓冲区是渲染管道的最终目的地,交换链包含许多图像。那么这两件事之间是什么关系呢?哪个是实际的渲染目标?并且framebuffer稍后会在image view上附加当前帧的最终图片吗?如果是,它将如何转移?
通过油漆或图表来描述这一点会很高兴。
最佳答案
VkFramebuffer
+ VkRenderPass
定义渲染目标。 VkFramebuffer
定义哪个 VkImageView
是要成为哪个依恋。 VkImageView
定义 VkImage
的哪一部分使用。 VkImage
定义哪个 VkMemory
使用和纹素的格式。 或者可能以相反的顺序:
VkMemory
只是内存中 N 个字节的序列。 VkImage
对象添加到它,例如有关格式的信息(因此您可以通过纹素而不是字节来寻址)。 VkImageView
object 有助于仅选择 VkImage
的一部分(数组或 mip) (如 stringView、arrayView 或你所做的)。还可以帮助匹配一些不兼容的接口(interface)(通过类型转换格式)。 VkFramebuffer
绑定(bind)一个 VkImageView
带附件。 VkRenderpass
定义将被绘制到 所以这不像你不使用图像。你可以通过 Vulkan Framebuffer 做到这一点。
交换链图像与任何其他图像没有什么不同。除了司机是图像的所有者。您不能直接销毁它或自己分配它。您只需在获取和当前操作之间的持续时间内从驱动程序中借用它。
出于缓冲和提前渲染的目的,(通常)有更多的交换链图像。 AFAIK 你需要一个单独的
VkFramebuffer
对于每个图像( 是 烦人,但更符合下面实际发生的情况)。关于image - Vulkan 中的帧缓冲区和图像有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557141/