概述
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 // 不关心新内容附件的用途
- 存储渲染结果
- 进行深度测试
- 实现模板测试
- 多重采样
- 实现后处理效果
理解附件对于设计渲染管线和实现各种渲染技术非常重要。