2016-03-19 11 views
1

私はVkFormat列挙型の項目の名前を理解しようとしています。これまでのところ、(ブロックではない)すべての形式の名前の構造をすべて取得すると思いますが、接尾辞がPACK8,PACK16,PACK32のときを意味します。私がチャンネルのサイズを追加すると、それらは常に8,16、または32になります。不規則なものは何もありません。したがって、これらの値をビットパック化することは、100%すべてのビット。VkFormatの名前でPACK8/16/32の意味は何ですか?

いつものように、the documentationはそれほど役に立ちません。ちょうどそのフォーマットがパックされているということは、それが意味することを言わずにです。

全体のテクセルまたは属性ではなく、単一のデータ要素

けれどもを占めている個々のコンポーネントよりも、単一のデータ要素に格納されています。

答えて

2

PACKフィールドは仕様は、彼らが意味言うまさに意味しますあまりにも混乱していると分かったら、実際の書式の説明を見ることができます。 Vulkanは、不必要な繰り返しの点まで、彼らの悲惨な詳細に行きます。

VK_FORMAT_B8G8R8A8_RGBVK_FORMAT_B8G8R8A8_RGB_PACK32の差がuint8_t[4]uint32_t間の同じ差です。一方は配列(「個別のコンポーネント」)であり、他方は小さな値で構成される単一の値(「単一のデータ要素」)です。

を格納するuint8_t color[4]アレイがある場合、color[0]は青のコンポーネントを格納します。配列内のコンポーネントの順序は、フォーマットの名前のコンポーネントの順序によって定義されます。

uint32_t colorの値があり、B8G8R8A8が格納されている場合は、(color & 0xFF000000) >> 24が青のコンポーネントを取得します。最も高いバイトが1番目に続き、次に2番目に高いバイトなどが続きます。

packed-vs-not-packedの区別が理由は、endian issuesのためです。バイト配列にはエンディアンの問題はありません。しかし、16ビットまたは32ビットにパックされた値には、エンディアンの問題があります。パックされたフォーマットのエンディアンは、常にホストのネイティブエンディアンとみなされます。

関連する問題