Vulkan编程指南翻译 第四章 队列和命令 第5节 复制压缩图像数据

2017-02-28

4.5  复制压缩图像数据

如在第二章“内存和资源”中讨论过的,Vulkan支持多种压缩图像格式。所有目前定义的压缩格式都是基于固定大小的块的格式。对于其中的许多种,块大小是 4 × 4纹素。对于 ASTC格式,块大小是随图像变动的。

当从缓冲区复制数据到图像时,只有整数大小的块能被复制。因此,每一个图像区域,以纹素为单位,必须是图像所用块大小的整数倍。还有,复制操作的源区域必须是块大小的整数倍。

也可以在两个压缩图像间或者压缩图像与非压缩图像间复制数据,需调用vkCmdCopyImage()命令。当你这么做时,源图像和目标图像格式必须拥有相同的块大小。这就是,如果压缩块的大小是64 bits,那么源格式和目标格式也必须是块大小为64 bits的压缩图像,或者非压缩图像格式须是纹素为64-bit的格式。

当从非压缩图像向压缩图像复制数据时,每一个源纹素被当作一个原生数据,和压缩图像一个块大小。这个值直接被写入压缩数据,即使它是压缩数据。纹素的值并没有被Vulkan压缩。这允许你在应用程序或者shader中创建压缩图像数据,然后把它复制到压缩图像中以供后续处理。Vulkan并不会替你要所原生的图像数据。再有,对于非压缩到压缩的复制,VkImageCopy类型数据的extent域在源图像中以纹素为单位,但是要和目标图像要求的块大小匹配。

当从压缩格式向非压缩格式复制数据时,上述的也相反掉。Vulkan不会解压缩图像数据。相反,它从源图像中获取原生的64-bit或128-bit压缩块的值,并把它们分解到目标图像。这种情况下,目标图像每纹素的大小应该和拥有源图像每块的大小相同。对于压缩到非压缩的复制,VkImageCopy类型数据的extent域在目标图像中以纹素为单元度量,但是必须符合源图像的块大小。

在两个块压缩图像格式之间复制数据是允许的,只要两种图像格式每块拥有的bits数相同。然而,这个值是可以商讨的,因为压缩格式下的图像数据通常以另一种格式解读并解码出来也没有什么意义。不管它的价值如何,当进行这项操作时,被复制的区域依然以纹素为单位,但是所有的偏移量和extents必须是常见的块大小的整数倍。

 

如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)