PACK8 / 16/32在VkFormat名称中的含义是什么?

时间:2016-03-19 05:08:59

标签: vulkan

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

像往常一样,the documentation并不是很有帮助,只是说这种格式没有说明这意味着什么。

1 个答案:

答案 0 :(得分:3)

PACK字段完全符合规范所说的含义:

  

整个纹素或属性存储在单个数据元素中,而不是单个组件占用单个数据元素

虽然如果你觉得太混乱,你可以看看实际的格式描述。 Vulkan对他们进行了极其痛苦的细节,直到不必要的重复。

VK_FORMAT_B8G8R8A8_RGBVK_FORMAT_B8G8R8A8_RGB_PACK32之间的差异是uint8_t[4]uint32_t之间的差异。一个是数组("单个组件"),另一个是由较小值组成的单个值("单个数据元素")。

如果您有一个存储uint8_t color[4]的{​​{1}}数组,则B8G8R8A8会存储蓝色组件。数组中组件的顺序由格式名称中组件的顺序定义。

如果您的color[0]值存储uint32_t color,则B8G8R8A8将检索蓝色组件。最高字节是第一个字节,然后是下一个最高字节,依此类推。

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