3

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

いつものように、ドキュメンテーションはあまり役に立ちません。フォーマットがパックされているだけで、それが何を意味するのかは説明されていません。

4

1 に答える 1

7

PACK フィールドは、仕様が意味することを正確に意味します。

個々のコンポーネントが 1 つのデータ要素を占有するのではなく、全体のテクセルまたは属性が 1 つのデータ要素に格納されます。

わかりにくい場合は、実際のフォーマットの説明を参照してください。Vulkan は、それらについての耐え難いほどの詳細を、不必要に繰り返すところまで説明します。

との違いは、 aと a の違いVK_FORMAT_B8G8R8A8_RGBVK_FORMAT_B8G8R8A8_RGB_PACK32同じです。1 つは配列 (「個々のコンポーネント」) で、もう 1 つはより小さい値で構成される単一の値 (「単一のデータ要素」) です。uint8_t[4]uint32_t

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

uint32_t colorを格納する値がある場合はB8G8R8A8(color & 0xFF000000) >> 24青色のコンポーネントを取得します。最上位のバイトが最初で、次に上位のバイトが続きます。

パックされたものとパックされていないものの区別が重要な理由は、エンディアンの問題によるものです。バイト配列にはエンディアンの問題はありません。ただし、16 ビットまたは 32 ビットにパックされた値には、エンディアンの問題があります。パック形式のエンディアンは、常にホストのネイティブ エンディアンであると見なされます。

于 2016-03-19T14:00:18.863 に答える