我试图理解VkFormat
枚举中项目的名称,到目前为止,我想我得到了所有(非块)格式名称的所有结构,但我不知道什么时候它们的后缀为PACK8
, PACK16
, PACK32
。如果我将通道大小加起来,它们总是加起来 8、16 或 32,没有什么不规则的,所以我不明白对这些值进行位打包意味着什么,因为它们似乎是 100% 有效的,使用他们所有的位。
像往常一样,文档不是很有帮助,只是说格式是打包的,而没有说明这意味着什么。
PACK 字段的含义与规范所说的完全相同:
整个纹素或属性存储在单个数据元素中,而不是单个组件占用单个数据元素
虽然如果你觉得这太令人困惑,你可以看看实际的格式描述。Vulkan 详细介绍了它们,以至于不必要的重复。
VK_FORMAT_B8G8R8A8_RGB
和之间的区别VK_FORMAT_B8G8R8A8_RGB_PACK32
与 auint8_t[4]
和 a之间的区别相同uint32_t
。一个是数组(“单个组件”),而另一个是由较小值组成的单个值(“单个数据元素”)。
如果你有一个uint8_t color[4]
数组,它存储B8G8R8A8
,然后color[0]
存储蓝色组件。数组中组件的顺序由格式名称中组件的顺序定义。
如果您有一个uint32_t color
存储 的值,B8G8R8A8
则将(color & 0xFF000000) >> 24
检索蓝色组件。最高字节是第一个,其次是下一个最高字节,依此类推。
打包与未打包的区别之所以重要,是因为字节序问题。字节数组没有字节序问题。但是打包成 16 位或 32 位的值确实存在字节序问题。打包格式的字节序始终假定为主机的本机字节序。