3

我试图理解VkFormat枚举中项目的名称,到目前为止,我想我得到了所有(非块)格式名称的所有结构,但我不知道什么时候它们的后缀为PACK8, PACK16, PACK32。如果我将通道大小加起来,它们总是加起来 8、16 或 32,没有什么不规则的,所以我不明白对这些值进行位打包意味着什么,因为它们似乎是 100% 有效的,使用他们所有的位。

像往常一样,文档不是很有帮助,只是说格式是打包的,而没有说明这意味着什么。

4

1 回答 1

7

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 位的值确实存在字节序问题。打包格式的字节序始终假定为主机的本机字节序。

于 2016-03-19T14:00:18.863 回答