Vulkan编程指南翻译 第四章 队列和命令 第3节 清空和填充图像

99 篇文章 54 订阅
81 篇文章 2 订阅

4.3 清空和填充图像

缓冲区一样,也可以把数据直接复制到图像,或使用一个值填充。图像是更大、复杂不透明的数据结构,所以原生的偏移量和数据通常应用程序来说不可见的。[2]

2. Of course, it’s possible to map the memory that is used for backing an image. In particular, when linear tiling is used for an image, this is standard practice. However, in general, this is not recommended.

通过vkCmdClearColorImage()函数调用,可清楚图像数据并填充,原型如下:

void vkCmdClearColorImage (

VkCommandBuffer commandBuffer,

VkImage image,

VkImageLayout imageLayout,

const VkClearColorValue* pColor,

uint32_t rangeCount,

const VkImageSubresourceRange* pRanges);

清除命令提交到的命令缓冲区通过commandBuffer参数指定需要被清除数据的图像通过image参数指定,执行清除操作时图像可选布局通过imageLayout参数指定。

imageLayout接受的布局e VK_IMAGE_LAYOUT_GENERAL VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL。清除不同布局的图像,执行清除命令之前,必要使用管线屏障把它们转移到这两个布局某一个。

清除图像数据并填充的数据是VkClearColorValue类型的实例,定义如下:

typedef union VkClearColorValue {

float float32[4];

int32_t int32[4];

uint32_t uint32[4];

} VkClearColorValue;VkClearColorValue一个简单的union类型,有三个可选值,每个都是含有四个元素的数组。一个是浮点类型,一个是带符号整型,一个是无符号Vulkan将会按照图像格式所明确的类型去读数据。应用程序可以可以按照既定数据类型写入数据vkCmdClearColorImage()不会执行任何的数据转换,需要应用程序负责正确的填充VkClearColorValue类型的数据。

单次调用vkCmdClearColorImage()可以清除目标图像的任意大小的区域虽然所有被清除的内存都会被填充相同的内容。如果你需要清除多个区域并填充不同的颜色值,你需要多次调用该函数。然而,如果你想要清除所有区域并填充同样颜色,通过rangeCount指定区域的数量,传入一个指针pRanges,指向大小rangeCount类型为VkImageSubresourceRange数组VkImageSubresourceRange定义如下:

typedef struct VkImageSubresourceRange {

VkImageAspectFlags aspectMask;

uint32_t baseMipLevel;

uint32_t levelCount;

uint32_t baseArrayLayer;

uint32_t layerCount;

} VkImageSubresourceRange;这个数据结构在第二章内存和资源有所介绍,讨论图像视图的创建小节。这里被用来定义图像里你清空并填充数据的区域。因为我们正在清空颜色图像,aspectMask置为VK_IMAGE_ASPECT_COLOR_BITbaseMipLevel  levelCount用来指定mipmap起始层和需要被清空数据的层数如果图像是array imagebaseArrayLayer  layerCount用来指定起始层和需要被清空的层数。如果图像不是array image这些域应置为01

清空depth-stencil图像清空颜色图像相似,除了一个VkClearDepthStencilValue类型数据用来指定填充的数据。vkCmdClearDepthStencilImage()原型vkCmdClearColorImage()原型类似,其原型如下:

void vkCmdClearDepthStencilImage (

VkCommandBuffer commandBuffer,

VkImage image,

VkImageLayout imageLayout,

const VkClearDepthStencilValue* pDepthStencil,

uint32_t rangeCount,

const VkImageSubresourceRange * pRanges);

同样执行清除操作的命令缓冲区通过commandBuffer参数指定,需要被清空的图像image参数指定,清空操作执行时期待的图像布局通过imageLayout参数指定。和vkCmdClearColorImage()一样,imageLayout值为VK_IMAGE_LAYOUT_GENERAL 

VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL二者其一。对于清空操作没有其他的有效可选。

清空后填充的数据通过一个VkClearDepthStencilValue类型的数据传递,它包含深度和stencil数值。它的定义如下:

typedef struct VkClearDepthStencilValue {

float depth;

uint32_t stencil;

} VkClearDepthStencilValue;

vkCmdClearColorImage()一样一次vkCmdClearDepthStencilImage()调用可以清空多个图像可以清空的数量通过rangeCount指定pRanges参数指向了一个大小为rangeCount类型为VkImageSubresourceRange数组数组定义可以清空的范围

因为depth-stencil图像包含深度和stencil aspectpRanges的每一个成员的aspectMask可包含VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_STENCIL_BIT一个或者两个。如果aspectMask包含VK_IMAGE_ASPECT_DEPTH_BIT那么存储在VkClearDepthStencilValue结构深度域将会被用来填充深度aspect的那块区域。同样,如果aspectMask包含VK_IMAGE_ASPECT_STENCIL_BIT那么深度aspect的那块区域将会被清空并填充VkClearDepthStencilValue类型数据stencil的数据。

注意通常给单个区域指定VK_IMAGE_ASPECT_DEPTH_BIT  VK_IMAGE_ASPECT_STENCIL_BIT属性,回避单独指定一个属性要高效率多。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值