概述

Vulkan 中的附件 (Attachment) 是指在渲染过程 (render pass) 中使用的图像视图 (image view)。主要有三种类型:

附件类型

颜色附件 (Color Attachment)

// 用于存储渲染的颜色输出
VkAttachmentDescription colorAttachment = {
    .format = swapChainImageFormat,           // 图像格式
    .samples = VK_SAMPLE_COUNT_1_BIT,         // 采样数
    .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,    // 加载操作
    .storeOp = VK_ATTACHMENT_STORE_OP_STORE,  // 存储操作
    .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
    .finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
};

深度附件 (Depth Attachment)

// 用于深度测试
VkAttachmentDescription depthAttachment = {
    .format = findDepthFormat(),
    .samples = VK_SAMPLE_COUNT_1_BIT,
    .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
    .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,  // 不需要保存深度数据
    .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
    .finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
};

模板附件 (Stencil Attachment)

通常与深度附件组合使用,用于模板测试。

附件的主要特点

生命周期

  • 在渲染过程开始时加载
  • 在子过程中使用
  • 在渲染过程结束时存储

布局转换

// 附件可以在渲染过程中改变布局
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,            // 初始布局
.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,       // 最终布局
 
// 子过程也可以指定不同的布局
VkAttachmentReference colorRef = {
    .attachment = 0,
    .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
};

加载/存储操作

// 可以指定如何处理附件的内容
.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,    // 清除原内容
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,  // 保存新内容
 
// 或者
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,     // 保留原内容
.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE  // 不关心新内容

附件的用途

  • 存储渲染结果
  • 进行深度测试
  • 实现模板测试
  • 多重采样
  • 实现后处理效果

理解附件对于设计渲染管线和实现各种渲染技术非常重要。