Frage OpenGL-Textur-Upload: UNSIGNED_BYTE vs UNSIGNED_INT_8_8_8_8


Ich rufe glTexSubImage2D an. Wenn mein Pixelformat ist GL_RGBA, dann sind die Pixeltypen GL_UNSIGNED_BYTE und GL_UNSIGNED_INT_8_8_8_8 völlig gleichwertig?

Sind diese beiden Paare auch gleichwertig?

  • Format = GL_RGBA, Type = GL_UNSIGNED_INT_8_8_8_8
  • Format = GL_BGRA, Type = GL_UNSIGNED_INT_8_8_8_8_REV

Ich habe versucht, die OpenGL-Spezifikation und die GL_EXT_packed_pixels Spezifikation zu lesen, aber ehrlich gesagt kann ich nicht Kopf oder Schwanz von ihnen machen.


9
2017-10-16 17:58


Ursprung


Antworten:


Die Antworten sind Nein und Nein. Sie müssen über die Byte-Reihenfolge in Ihrem Computer nachdenken. Wenn Sie haben GL_RGBA und GL_UNSIGNED_INT_8_8_8_8das bedeutet, dass Pixel in 32-Bit-Ganzzahlen gespeichert sind und die Farben in der logischen Reihenfolge RGBA in einer solchen ganzen Zahl sind, z. das rote ist in dem höherwertigen Byte und das Alpha ist in dem niederwertigen Byte. Aber wenn die Maschine Little-Endian ist (wie bei Intel-CPUs), folgt daraus, dass die tatsächliche Reihenfolge im Speicher ABGR ist. Wohingegen, GL_RGBA mit GL_UNSIGNED_BYTE speichert die Bytes in RGBA-Reihenfolge, unabhängig davon, ob der Computer Little-Endian oder Big-Endian ist.

GL_BGRA mit GL_UNSIGNED_INT_8_8_8_8_REV würde Farben in einer Ganzzahl in der logischen Reihenfolge ARGB speichern, aber dann auf einer Little-Endian-Maschine, erhält man die BGRA-Reihenfolge im Speicher.


18
2017-10-16 18:33