PACK8/16/32 在 VkFormat 名称中是什么意思?

What does PACK8/16/32 mean in VkFormat names?

我正在尝试理解 VkFormat 枚举中项目的名称,到目前为止,我认为我了解了所有(非块)格式的名称的所有结构,但是当它们有 PACK8PACK16PACK32 后缀时,我无法弄清楚这意味着什么。如果我将通道大小加起来,它们总是加起来为 8、16 或 32,没有什么不规则的,所以我不明白对这些值进行位打包意味着什么,因为它们似乎是 100% 有效的,使用他们所有的比特。

和往常一样,the documentation不是很有帮助,只是说格式是打包的,并没有说明那是什么意思。

PACK 字段的含义与规范中的含义完全相同:

whole texels or attributes are stored in a single data element, rather than individual components occupying a single data element

不过,如果您觉得这太混乱了,您可以直接查看实际的格式说明。 Vulkan 详细介绍了它们,以至于不必要的重复。

VK_FORMAT_B8G8R8A8_RGBVK_FORMAT_B8G8R8A8_RGB_PACK32 之间的区别与 uint8_t[4]uint32_t 之间的区别相同。一个是数组 ("individual components"),而另一个是由较小的值组成的单个值 ("single data element")。

如果您有一个 uint8_t color[4] 数组,它存储 B8G8R8A8,那么 color[0] 存储蓝色分量。数组中组件的顺序由格式名称中组件的顺序定义。

如果您有一个存储 B8G8R8A8uint32_t color 值,那么 (color & 0xFF000000) >> 24 将检索蓝色分量。最高字节是第一个,然后是次高字节,依此类推。

打包与未打包的区别之所以重要是因为 endian issues。字节数组没有字节序问题。但是打包成 16 位或 32 位的值确实存在字节序问题。打包格式的字节序始终假定为主机的本机字节序。