附着描述

在这里,我们只使用了一个代表交换链图像的颜色缓冲附着。

void createRenderPass() { 
    VkAttachmentDescription colorAttachment = {};
    colorAttachment.format = swapChainImageFormat;
    colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
}

format成员变量用于指定颜色缓冲附着的格式。samples成员变量用于指定采样数,在这里,我们没有使用多重采样,所以将采样数设置为1。

colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;

loadOp和storeOp成员变量用于指定在渲染之前和渲染之后对附着中的数据进行的操作。对于loadOp成员变量,可以设置为下面这些值:

  • VK_ATTACHMENT_LOAD_OP_LOAD:保持附着的现有内容

  • VK_ATTACHMENT_LOAD_OP_CLEAR:使用一个常量值来清除附着的内容

  • VK_ATTACHMENT_LOAD_OP_DONT_CARE:不关心附着现存的内容

在这里,我们设置loadOp成员变量的值为VK_ATTACHMENT_LOAD_OP_CLEAR,在每次渲染新的一帧前使用黑色清除帧缓冲。storeOp成员变量可以设置为下面这些值:

  • VK_ATTACHMENT_STORE_OP_STORE:渲染的内容会被存储起来,以便之后读取

  • VK_ATTACHMENT_STORE_OP_DONT_CARE:渲染后,不会读取帧缓冲的内容

colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;

loadOp和storeOp成员变量的设置会对颜色和深度缓冲起效。stencilLoadOp成员变量和stencilStoreOp成员变量会对模板缓冲起效。在这里,我们没有使用模板缓冲,所以设置对模板缓冲不关心即可。

colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;

Vulkan中的纹理和帧缓冲由特定像素格式的VkImage对象来表示。图像的像素数据在内存中的分布取决于我们要对图像进行的操作。

下面是一些常用的图形内存布局设置:

  • VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:图像被用作颜色附着

  • VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:图像被用在交换链中进行呈现操作

  • VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:图像被用作复制操作的目的图像

我们会在之后的章节对上述设置进行更为详细地说明。在这里,我们需要做的是指定适合我们在之后进行的渲染操作的图像布局即可。

initialLayout成员变量用于指定渲染流程开始前的图像布局方式。finalLayout成员变量用于指定渲染流程结束后的图像布局方式。将initialLayout成员变量设置为VK_IMAGE_LAYOUT_UNDEFINED表示我们不关心之前的图像布局方式。使用这一值后,图像的内容不保证会被保留,但对于我们的应用程序,每次渲染前都要清除图像,所以这样的设置更符合我们的需求。对于finalLayout成员变量,我们设置为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,使得渲染后的图像可以被交换链呈现。