跳到主要内容

:material-chevron-right-circle: vkCmdClearAttachments

函数原型

void vkCmdClearAttachments(
VkCommandBuffer commandBuffer,
uint32_t attachmentCount,
const VkClearAttachment* pAttachments,
uint32_t rectCount,
const VkClearRect* pRects);

描述

清除颜色、深度或模板附件的部分区域。

参数

  • commandBuffer : 录制指令的命令缓冲区。
  • attachmentCount : 清除的附件个数。
  • pAttachments : 清除的附件信息。
  • rectCount : 清除的区域数量。
  • pRects : 清除的区域。

补充

VkClearAttachment 结构体定义:

typedef struct VkClearAttachment {
VkImageAspectFlags aspectMask; // COLOR/DEPTH/STENCIL
uint32_t colorAttachment; // 哪个颜色attachment
VkClearValue clearValue; // 清除颜色 or 深度模板值
} VkClearAttachment;

VkClearRect 结构体定义:

typedef struct VkClearRect {
VkRect2D rect; // 清除矩形区域
uint32_t baseArrayLayer; // 起始层(适用于 array 图像)
uint32_t layerCount; // 清除多少层
} VkClearRect;

返回值

代码示例

// 清除颜色 attachment 0 的一块绿色矩形区域
VkClearAttachment clearAttachment = {};
clearAttachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
clearAttachment.colorAttachment = 0; // 第0个颜色attachment
clearAttachment.clearValue.color = {{0.0f, 1.0f, 0.0f, 1.0f}}; // 绿色

VkClearRect clearRect = {};
clearRect.rect.offset = {100, 100}; // 起点位置
clearRect.rect.extent = {200, 200}; // 清除宽高
clearRect.baseArrayLayer = 0;
clearRect.layerCount = 1;

vkCmdClearAttachments(
commandBuffer,
1, &clearAttachment,
1, &clearRect);


// 清除深度和模板缓冲
VkClearAttachment clearAttachment = {};
clearAttachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
clearAttachment.clearValue.depthStencil = {1.0f, 0}; // 深度 = 1.0,模板 = 0

VkClearRect clearRect = {};
clearRect.rect.offset = {0, 0};
clearRect.rect.extent = {width, height}; // 清除整个屏幕
clearRect.baseArrayLayer = 0;
clearRect.layerCount = 1;

vkCmdClearAttachments(
commandBuffer,
1, &clearAttachment,
1, &clearRect);