PACK8/16/32 在 VkFormat 名称中是什么意思?
What does PACK8/16/32 mean in VkFormat names?
我正在尝试理解 VkFormat
枚举中项目的名称,到目前为止,我认为我了解了所有(非块)格式的名称的所有结构,但是当它们有 PACK8
、PACK16
、PACK32
后缀时,我无法弄清楚这意味着什么。如果我将通道大小加起来,它们总是加起来为 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_RGB
和 VK_FORMAT_B8G8R8A8_RGB_PACK32
之间的区别与 uint8_t[4]
和 uint32_t
之间的区别相同。一个是数组 ("individual components"),而另一个是由较小的值组成的单个值 ("single data element")。
如果您有一个 uint8_t color[4]
数组,它存储 B8G8R8A8
,那么 color[0]
存储蓝色分量。数组中组件的顺序由格式名称中组件的顺序定义。
如果您有一个存储 B8G8R8A8
的 uint32_t color
值,那么 (color & 0xFF000000) >> 24
将检索蓝色分量。最高字节是第一个,然后是次高字节,依此类推。
打包与未打包的区别之所以重要是因为 endian issues。字节数组没有字节序问题。但是打包成 16 位或 32 位的值确实存在字节序问题。打包格式的字节序始终假定为主机的本机字节序。
我正在尝试理解 VkFormat
枚举中项目的名称,到目前为止,我认为我了解了所有(非块)格式的名称的所有结构,但是当它们有 PACK8
、PACK16
、PACK32
后缀时,我无法弄清楚这意味着什么。如果我将通道大小加起来,它们总是加起来为 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_RGB
和 VK_FORMAT_B8G8R8A8_RGB_PACK32
之间的区别与 uint8_t[4]
和 uint32_t
之间的区别相同。一个是数组 ("individual components"),而另一个是由较小的值组成的单个值 ("single data element")。
如果您有一个 uint8_t color[4]
数组,它存储 B8G8R8A8
,那么 color[0]
存储蓝色分量。数组中组件的顺序由格式名称中组件的顺序定义。
如果您有一个存储 B8G8R8A8
的 uint32_t color
值,那么 (color & 0xFF000000) >> 24
将检索蓝色分量。最高字节是第一个,然后是次高字节,依此类推。
打包与未打包的区别之所以重要是因为 endian issues。字节数组没有字节序问题。但是打包成 16 位或 32 位的值确实存在字节序问题。打包格式的字节序始终假定为主机的本机字节序。