graphics - 帧缓冲区和交换链到底是什么?

标签 graphics 3d vulkan

所以我对帧缓冲区的概念有点困惑。我已经完成了研究,但总能找到不同的定义,通常是这两个:

  • 帧缓冲区是一组多个不同图像。但这个定义,或者至少对我来说,听起来更像是交换链:一系列帧缓冲区

  • 帧缓冲区是形成单个 图像的像素数组,有点像位图(但据我所知,它可以包含比颜色更多的信息,像深度值和东西),当该位图被管道填充时,它会排队等待呈现。这对我来说更有意义,因为这样交换链也有意义:帧缓冲区的集合,因此在双缓冲的情况下,可以有一个用作渲染目标,另一个用于呈现,并且交换链处理以正确的时间交换它们以提高帧率稳定性

以下哪个是正确的?因为每次查找一些信息时,我都厌倦了听到不同的声音。

请记住,我正在学习 Vulkan,完全没有图形经验(我知道不推荐这样做)所以我现在对概念比代码更感兴趣

最佳答案

用 Vulkan 的说法,VkFramebuffer 是一个引用图像的容器,这些图像可用作渲染过程实例中的附件。渲染过程附件是渲染操作的目的地。因此,如果您想要渲染特定图像,在某些时候,您需要将其插入 VkFramebuffer 并调用 vkCmdBeginRenderPass

交换链与帧缓冲区无关(技术上)。交换链是您不拥有的一系列图像。您可以要求显示引擎借用其中一张图像一段时间,在此期间您可以对其进行渲染或交换链允许您对其图像执行的任何其他操作。一段时间后,您可以告诉显示引擎将您使用过的图像显示给特定的显示器,之后您将无法使用该交换链图像,直到您再次借用它。

因此,尽管它们都有“一系列图像”,但它们绝无相似之处。帧缓冲区在渲染操作期间渲染所有图像(根据渲染 channel 的子 channel 附件用法)。您不需要同时借用交换链的所有图像。您一次只能借用它们(每个显示表面一个)。

现在,由于交换链图像只能以显示引擎允许的方式使用,并且显示引擎需要允许您使用它的唯一方式是作为颜色附件,如果如果您实际上想在显示设备中查看结果(Vulkan 不需要),来自交换链的图像将在某个时间点结束在 VkFramebuffer 中。

关于graphics - 帧缓冲区和交换链到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67298942/

相关文章:

c++ - Vulkan 图像布局未在管道屏障中转换

c++ - Allegro 5 在基元上绘制位图

java - 我应该为 Graphics.drawImage() 函数的 ImageObserver 参数使用 null 吗?

Scipy 中的 3d 插值——密度网格

javascript - 在 python 中使用 Bokeh 实现完整的 3d 散点图

synchronization - vkCmdPipelineBarrier 对 renderpass 同步范围的澄清

c++ - 用 C++ 制作一个简单的 3D 图形引擎有多难?

java - 使 JLabel 背景在有背景的框架中透明

c++ - 如何在 C++ 中使用 OpenGL 绘制 3D 超椭圆

c++ - Vulkan 计算着色器只读取部分统一缓冲区