我正在尝试理解VkFormat
枚举中项目的名称,到目前为止,我认为我得到了所有(非块)格式名称的所有结构,但我可以当他们的后缀为PACK8
,PACK16
,PACK32
时,要弄明白这意味着什么。如果我将通道大小加起来,它们总是加起来为8,16或32,没有任何不规则,所以我不明白这些值的比特打包是什么意思,因为它们似乎100%有效,使用所有的一切。
像往常一样,the documentation并不是很有帮助,只是说这种格式没有说明这意味着什么。
答案 0 :(得分:3)
PACK字段完全符合规范所说的含义:
整个纹素或属性存储在单个数据元素中,而不是单个组件占用单个数据元素
虽然如果你觉得太混乱,你可以看看实际的格式描述。 Vulkan对他们进行了极其痛苦的细节,直到不必要的重复。
VK_FORMAT_B8G8R8A8_RGB
和VK_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始终假定为主机的本机端。