2016-04-06 16 views
1

Unter OS X habe ich eine Textur in OpenGL unter Verwendung der SDL_Image-Bibliothek geladen (unter Verwendung von IMG_LOAD(), die SDL_Surface* zurückgibt). Es hat sich gezeigt, dass die Farbkanäle ausgetauscht wurden, d. H. Ich musste GL_BGRA als Pixelformatparameter in glTexImage2D() einstellen.Identifizieren des Pixeldatenformats in SDL

Gibt es eine Möglichkeit, das richtige Datenformat (BGRA oder RGBA oder etc ...) zu ermitteln, ohne einfach die Textur zu kompilieren und zu überprüfen? Und warum tauscht SDL diese Farbkanäle aus?

+1

Ich wollte eine Antwort posten, aber mir wurde klar, dass ich einen großen Teil der Lösung vermisse. Grundsätzlich wird BGRA für unsignierte 8-Bit-normalisierte Texturen auf vielen Systemen bevorzugt, wo andere Typen dazu neigen, RGBA zu verwenden. Ich war jedoch nicht in der Lage, SDL_Image zu fragen, welches Format es ausgegeben hat. Dies ist ziemlich wichtig, um sicherzustellen, dass es dem entspricht, was Sie OpenGL sagen. Heutzutage wird wahrscheinlich jedes Bild, das Sie in ein vernünftiges System laden, von BGRA bestellt. RGBA oder ARGB können für HDR-Dateien angezeigt werden. –

Antwort

1

Ja. Der Link hat Code Beispiele dafür, wie die Kanalverschiebung für jede Komponente zu bestimmen: http://wiki.libsdl.org/SDL_PixelFormat#Code_Examples

Von der Website:

SDL_PixelFormat *fmt; 
SDL_Surface *surface; 
Uint32 temp, pixel; 
Uint8 red, green, blue, alpha; 
. 
. 
. 
fmt = surface->format; 
SDL_LockSurface(surface); 
pixel = *((Uint32*)surface->pixels); 
SDL_UnlockSurface(surface); 

/* Get Red component */ 
temp = pixel & fmt->Rmask; /* Isolate red component */ 
temp = temp >> fmt->Rshift; /* Shift it down to 8-bit */ 
temp = temp << fmt->Rloss; /* Expand to a full 8-bit number */ 
red = (Uint8)temp; 

Sie sollten den Xmasks nach Wert sortiert werden können. Dann können Sie bestimmen, ob RGBA oder BGRA. Wenn Xmask == 0 ist der Farbkanal nicht vorhanden.

Ich habe keine Ahnung, warum die Swaps auftreten.

Bearbeiten: Von Xshift nach Xmask geändert, da letzteres zur Bestimmung der Position UND der Existenz von Farbkanälen verwendet werden kann.

+1

_ "Ich habe keine Ahnung, warum die Swaps auftreten." _ Byte-Reihenfolge sehr wahrscheinlich. Keine Ahnung, welche Version von OS X oder sogar welche Prozessorarchitektur hier involviert ist, aber das ist ein häufigeres Problem auf dieser Plattform als andere. –