2016-03-19 8 views
1

Ich versuche, die Namen der Elemente in der VkFormat Enum zu verstehen, und bis jetzt denke ich, ich bekomme alle die Struktur der Namen aller (Nicht-Block-) Formate, aber ich kann nicht herausfinden, was es bedeutet, wenn sie ein Suffix von PACK8, PACK16, PACK32 haben. Wenn ich die Kanalgrößen addiere, addieren sie immer 8, 16 oder 32, nichts unregelmäßiges, also verstehe ich nicht, was es bedeuten würde, diese Werte zu packen, da sie scheinbar 100% effizient sind alle ihre Bits.Was bedeutet PACK8/16/32 in VkFormat-Namen?

Wie üblich the documentation ist nicht sehr hilfreich, nur sagen, das Format ist gepackt ohne zu sagen, was das bedeutet.

Antwort

2

Das PACK Felder bedeuten, genau das, was die Spezifikation sagt sie bedeutet:

ganze Texeln oder Attribute werden in einem einzigen Datenelement gespeichert, anstatt einzelne Komponenten ein einzelnes Datenelement

Obwohl besetzen Wenn Sie das zu verwirrend finden, können Sie sich einfach die eigentlichen Formatbeschreibungen ansehen. Vulkan geht bis ins Unermessliche über sie hinweg, bis zur unnötigen Wiederholung.

Der Unterschied zwischen VK_FORMAT_B8G8R8A8_RGB und VK_FORMAT_B8G8R8A8_RGB_PACK32 ist der gleiche Unterschied zwischen einem uint8_t[4] und einem uint32_t. Einer ist ein Array ("einzelne Komponenten"), während der andere ein einzelner Wert ("einzelnes Datenelement") ist, der aus kleineren Werten besteht. Wenn Sie ein uint8_t color[4] Array haben, das B8G8R8A8 speichert, dann speichert color[0] die blaue Komponente. Die Reihenfolge der Komponenten im Array wird durch die Reihenfolge der Komponenten im Formatnamen festgelegt. Wenn Sie einen uint32_t color Wert haben, der B8G8R8A8 speichert, wird (color & 0xFF000000) >> 24 die blaue Komponente abrufen. Das höchste Byte ist das erste, gefolgt vom nächsthöheren und so weiter.

Der Grund, warum die Unterscheidung zwischen gepackt und nicht gepackt wichtig ist, liegt an endian issues. Arrays von Bytes haben keine Endian-Probleme. Aber Werte, die in 16 oder 32 Bits gepackt sind, haben Endian-Probleme. Der Endian der gepackten Formate wird immer als der native Endian des Hosts angenommen.