清除命令
在渲染过程实例之外清除图像
颜色和深度/模板图像可以使用 vkCmdClearColorImage 或 vkCmdClearDepthStencilImage 在渲染过程实例之外分别清除。这些命令只允许在渲染过程实例之外使用。
要清除一个或多个颜色图像的子范围,请调用
// Provided by VK_VERSION_1_0
void vkCmdClearColorImage(
VkCommandBuffer commandBuffer,
VkImage image,
VkImageLayout imageLayout,
const VkClearColorValue* pColor,
uint32_t rangeCount,
const VkImageSubresourceRange* pRanges);
-
commandBuffer
是将记录命令的命令缓冲区。 -
image
是要清除的图像。 -
imageLayout
指定要清除的图像子资源范围的当前布局,并且必须是VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
、VK_IMAGE_LAYOUT_GENERAL
或VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
。 -
pColor
是指向包含图像子资源范围将被清除到的值的 VkClearColorValue 结构的指针(请参见下面的清除值)。 -
rangeCount
是pRanges
中图像子资源范围结构的数目。 -
pRanges
是指向 VkImageSubresourceRange 结构的数组的指针,该数组描述了要清除的 mipmap 级别、数组层和方面范围,如 图像视图中所述。
pRanges
中指定的每个范围都会被清除为 pColor
指定的值。
要清除深度/模板图像的一个或多个子范围,请调用
// Provided by VK_VERSION_1_0
void vkCmdClearDepthStencilImage(
VkCommandBuffer commandBuffer,
VkImage image,
VkImageLayout imageLayout,
const VkClearDepthStencilValue* pDepthStencil,
uint32_t rangeCount,
const VkImageSubresourceRange* pRanges);
-
commandBuffer
是将记录命令的命令缓冲区。 -
image
是要清除的图像。 -
imageLayout
指定要清除的图像子资源范围的当前布局,并且必须是VK_IMAGE_LAYOUT_GENERAL
或VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
。 -
pDepthStencil
是指向 VkClearDepthStencilValue 结构的指针,该结构包含深度和模板图像子资源范围将被清除为的值(请参阅下面的清除值)。 -
rangeCount
是pRanges
中图像子资源范围结构的数目。 -
pRanges
是指向 VkImageSubresourceRange 结构的数组的指针,该数组描述了要清除的 mipmap 级别、数组层和方面范围,如 图像视图中所述。
出于内存屏障的目的,渲染通道实例外部的清除操作被视为传输操作。
在渲染通道实例内部清除图像
要在渲染通道实例内部清除一个或多个颜色和深度/模板附件区域,请调用
// Provided by VK_VERSION_1_0
void vkCmdClearAttachments(
VkCommandBuffer commandBuffer,
uint32_t attachmentCount,
const VkClearAttachment* pAttachments,
uint32_t rectCount,
const VkClearRect* pRects);
-
commandBuffer
是将记录命令的命令缓冲区。 -
attachmentCount
是pAttachments
数组中的条目数。 -
pAttachments
是指向 VkClearAttachment 结构数组的指针,该数组定义要清除的附件和要使用的清除值。 -
rectCount
是pRects
数组中的条目数。 -
pRects
是指向 VkClearRect 结构数组的指针,该数组定义每个选定附件内要清除的区域。
如果渲染通道具有片段密度图附件,则清除操作遵循片段密度图的操作,就像每个清除区域都是生成片段的图元一样。清除颜色将应用于每个片段区域内的所有像素,而不管像素是否位于清除区域之外。清除操作可能具有与绘制操作不同的受支持片段区域集。
与其他的清除命令不同,vkCmdClearAttachments 不是传输命令。它以光栅化顺序执行其操作。对于颜色附件,操作作为颜色附件写入执行,由 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
阶段执行。对于深度/模板附件,操作作为深度写入和模板写入执行,由 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
和 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
阶段执行。
vkCmdClearAttachments
不受绑定的管线状态的影响。
通常最好在渲染开始时使用 |
如果任何附件的要清除的 aspectMask
没有图像视图的支持,则清除操作对该方面无效。
如果正在清除的附件引用使用等于 VK_IMAGE_ASPECT_PLANE_0_BIT
、VK_IMAGE_ASPECT_PLANE_1_BIT
或 VK_IMAGE_ASPECT_PLANE_2_BIT
之一的 aspectMask
创建的图像视图,则出于此命令的目的,它将被视为 VK_IMAGE_ASPECT_COLOR_BIT
,并且 必须使用 图像视图创建 指定的 VK_IMAGE_ASPECT_COLOR_BIT
方面进行清除。
VkClearRect
结构定义为
// Provided by VK_VERSION_1_0
typedef struct VkClearRect {
VkRect2D rect;
uint32_t baseArrayLayer;
uint32_t layerCount;
} VkClearRect;
-
rect
是要清除的二维区域。 -
baseArrayLayer
是要清除的第一个图层。 -
layerCount
是要清除的图层数。
从附件图像视图的基础图层开始计数,图层 [baseArrayLayer
, baseArrayLayer
+ layerCount
) 将被清除。
VkClearAttachment
结构定义为
// Provided by VK_VERSION_1_0
typedef struct VkClearAttachment {
VkImageAspectFlags aspectMask;
uint32_t colorAttachment;
VkClearValue clearValue;
} VkClearAttachment;
-
aspectMask
是一个掩码,用于选择要清除的附件的颜色、深度和/或模板方面。 -
colorAttachment
仅当aspectMask
中设置了VK_IMAGE_ASPECT_COLOR_BIT
时才有意义,在这种情况下,它是绑定颜色附件的索引。 -
clearValue
是要将附件清除到的颜色或深度/模板值,如下面的 清除值 中所述。
清除值
VkClearColorValue
结构定义为
// Provided by VK_VERSION_1_0
typedef union VkClearColorValue {
float float32[4];
int32_t int32[4];
uint32_t uint32[4];
} VkClearColorValue;
-
当图像或附件的格式是具有浮点数数值类型的数字格式之一时,
float32
是颜色清除值。浮点值会自动转换为图像的格式,如果图像是 sRGB,则清除值将被视为线性值。 -
当图像或附件的格式具有有符号整数 (
SINT
) 数值类型时,int32
是颜色清除值。有符号整数值通过转换为较小的类型来转换为图像的格式(负的 32 位值映射到较小类型中的负值)。如果整数清除值在目标类型中不可表示(例如,在转换为该类型时会溢出),则清除值是未定义的。 -
当图像或附件的格式具有无符号整数 (
UINT
) 数值类型时,uint32
是颜色清除值。无符号整数值通过转换为具有较少位的整数类型来转换为图像的格式。
清除颜色的四个数组元素按顺序映射到图像格式的 R、G、B 和 A 组件。
如果图像具有多个样本,则对于正在清除的任何像素,会将相同的值写入所有样本。
如果图像或附件格式具有 64 位组件宽度,则上面每个数组的前 2 个数组元素将重新解释为 R 组件的单个 64 位元素。接下来的 2 个数组元素以相同的方式用于 G 组件。换句话说,该联合体的行为就好像它具有以下附加成员一样
double float64[2];
int64_t int64[2];
uint64_t uint64[2];
VkClearDepthStencilValue
结构定义为
// Provided by VK_VERSION_1_0
typedef struct VkClearDepthStencilValue {
float depth;
uint32_t stencil;
} VkClearDepthStencilValue;
-
depth
是深度/模板附件的深度方面的清除值。它是一个浮点值,会自动转换为附件的格式。 -
stencil
是深度/模板附件的模板方面的清除值。它是一个 32 位整数值,通过取适当数量的最低有效位 (LSB) 转换为附件的格式。
VkClearValue
联合体的定义如下:
// Provided by VK_VERSION_1_0
typedef union VkClearValue {
VkClearColorValue color;
VkClearDepthStencilValue depthStencil;
} VkClearValue;
-
color
指定清除颜色图像或附件时要使用的颜色图像清除值。 -
depthStencil
指定清除深度/模板图像或附件时要使用的深度和模板清除值。
此联合体用于 API 的某些部分需要颜色或深度/模板清除值(具体取决于附件)的情况,并在 VkRenderPassBeginInfo 结构中定义初始清除值。
填充缓冲区
要清除缓冲区数据,请调用
// Provided by VK_VERSION_1_0
void vkCmdFillBuffer(
VkCommandBuffer commandBuffer,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize size,
uint32_t data);
-
commandBuffer
是将记录命令的命令缓冲区。 -
dstBuffer
是要填充的缓冲区。 -
dstOffset
是开始填充的缓冲区中的字节偏移量,并且必须是 4 的倍数。 -
size
是要填充的字节数,并且必须是 4 的倍数,或者VK_WHOLE_SIZE
来填充从offset
到缓冲区末尾的范围。如果使用VK_WHOLE_SIZE
,且缓冲区的剩余大小不是 4 的倍数,则会使用最接近的较小倍数。 -
data
是重复写入缓冲区以填充size
字节数据的 4 字节字。数据字按照主机字节序写入内存。
vkCmdFillBuffer
在同步屏障的目的上被视为“传输”操作。为了使缓冲区与 vkCmdFillBuffer
兼容,必须在 VkBufferCreateInfo 的 usage
中指定 VK_BUFFER_USAGE_TRANSFER_DST_BIT
。
更新缓冲区
要在命令缓冲区中内联更新缓冲区数据,请调用
// Provided by VK_VERSION_1_0
void vkCmdUpdateBuffer(
VkCommandBuffer commandBuffer,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dataSize,
const void* pData);
-
commandBuffer
是将记录命令的命令缓冲区。 -
dstBuffer
是要更新的缓冲区的句柄。 -
dstOffset
是开始更新的缓冲区中的字节偏移量,并且必须是 4 的倍数。 -
dataSize
是要更新的字节数,并且必须是 4 的倍数。 -
pData
是指向缓冲区更新的源数据的指针,并且大小必须至少为dataSize
字节。
dataSize
必须小于或等于 65536 字节。对于更大的更新,应用程序可以使用缓冲区到缓冲区 复制。
使用 与缓冲区到缓冲区复制相比,此功能的额外成本意味着它只应用于少量数据,这也是为什么它被限制为最多 65536 字节的原因。应用程序可以通过向同一缓冲区的不同范围发出多个 |
当调用该命令时,源数据将从 pData
复制到命令缓冲区。
vkCmdUpdateBuffer
只允许在渲染通道之外使用。此命令在同步屏障中被视为“传输”操作。为了使缓冲区与 vkCmdUpdateBuffer
兼容,必须在 VkBufferCreateInfo 的 usage
中指定 VK_BUFFER_USAGE_TRANSFER_DST_BIT
。
在规范的 1.0.19 版本和 VK_HEADER_VERSION 19 的 Vulkan 头文件之前, |