Renderpasses
在 Vulkan 中,所有的渲染都发生在 VkRenderPass 内部。在 renderpass 之外不可能执行渲染命令,但是可以在没有 renderpass 的情况下执行计算命令。
VkRenderPass 是一个 Vulkan 对象,它封装了设置渲染“目标”所需的状态,以及您将要渲染到的图像的状态。
Renderpass 是一个仅存在于 Vulkan 中的概念。它的存在是因为它允许驱动程序更多地了解您渲染的图像的状态。
Renderpass 将渲染到帧缓冲区 (Framebuffer) 中。帧缓冲区链接到您将要渲染到的图像,并且在启动 renderpass 时用于设置渲染的目标图像。
在编码命令时,renderpass 的一般用法如下:
vkBeginCommandBuffer(cmd, ...);
vkCmdBeginRenderPass(cmd, ...);
//rendering commands go here
vkCmdEndRenderPass(cmd);
vkEndCommandBuffer(cmd)
当开始一个 renderpass 时,您需要设置目标帧缓冲区和清除颜色(如果可用)。在第一章中,我们将随着时间动态地更改清除颜色。
Subpasses
一个 renderpass 也包含 subpasses,这有点像渲染“步骤”。它们在移动 GPU 中非常有用,因为它们允许驱动程序优化很多事情。在桌面 GPU 中,它们不太重要,所以我们不打算使用它们。在创建 renderpass 时,它将只有一个 subpass,这是渲染所需的最小值。
图像布局
renderpass 做的一件非常重要的事情是,它在进入和退出 renderpass 时执行图像布局更改。
GPU 中的图像不一定采用您期望的格式。出于优化目的,GPU 会对它们进行大量的转换和重新排列,变成内部不透明的格式。例如,一些 GPU 会尽可能压缩纹理,并重新排列像素的排列方式,以便更好地生成 mipmap。在 Vulkan 中,您无法控制这一点,但可以控制图像的布局,这使得驱动程序可以将图像转换为那些优化的内部格式。
在第一章中,我们只打算使用一些图像布局:
VK_IMAGE_LAYOUT_UNDEFINED
: 不关心布局是什么,可以是任何布局。VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
: 图像处于最优布局,可以被渲染命令写入。VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
: 图像处于允许在屏幕上显示的布局。VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
: (稍后使用) 图像处于优化为从着色器读取的格式。
下一步: 设置渲染通道