2011-10-16 12 views
8

Dzwonię do glTexSubImage2D. Jeśli mój format pikseli to GL_RGBA, to czy typy pikseli GL_UNSIGNED_BYTE i GL_UNSIGNED_INT_8_8_8_8 są w pełni równoważne?Przesyłanie tekstury OpenGL: UNSIGNED_BYTE kontra UNSIGNED_INT_8_8_8_8

Czy te dwie pary są równoważne?

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

Próbowałem czytać specyfikację OpenGL i spec GL_EXT_packed_pixels, ale szczerze mówiąc nie mogę zrobić głowę lub ogon z nich.

Odpowiedz

16

Odpowiedzi brzmią Nie i Nie. Musisz pomyśleć o kolejności bajtów na swoim komputerze. Jeśli masz GL_RGBA i GL_UNSIGNED_INT_8_8_8_8, oznacza to, że piksele są przechowywane w 32-bitowych liczbach całkowitych, a kolory są w logicznej kolejności RGBA w takiej liczbie całkowitej, np. czerwony jest w bajcie wyższego rzędu, a alfa jest w bajdzie niższego rzędu. Ale jeśli maszyna jest mało-endianowa (jak w przypadku procesorów Intela), to faktyczna kolejność w pamięci to ABGR. Natomiast GL_RGBA z GL_UNSIGNED_BYTE będzie przechowywać bajty w kolejności RGBA niezależnie od tego, czy komputer jest mało-endian czy big-endian.

GL_BGRA z GL_UNSIGNED_INT_8_8_8_8_REV będzie przechowywać kolory w całkowitą w logicznej kolejności ARGB, ale potem na ostrokońcej maszynie, masz BGRA porządek w pamięci.

+3

Warto zauważyć, że "GL_UNSIGNED_BYTE" i "GL_UNSIGNED_INT _..." w tym przykładzie to typy transferu pikseli. Nie mówią nic o tym, jak GL przechowuje kolor, tylko o tym, jak "upakowane" kolory są interpretowane przez GL, gdy dane koloru są do niego wysyłane. To ważne wyróżnienie, ponieważ zwykle celem tych bardziej egzotycznych formatów jest dopasowanie formatu klienta (CPU) i serwera (GPU), aby GL nie musiał wykonywać konwersji danych i mógł wykonać prosty transfer blokowy. –

Powiązane problemy