La tua domanda sembra confondere alcuni concetti, quindi prendiamo le cose dall'alto. Questa è la definizione della funzione glTexImage2D
:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Ci sono due cose che potresti chiamare "formati di trama". Il primo è il internalformat
parametro. Questo è il vero formato dell'immagine mentre OpenGL la memorizza. Il format
parametro descrive parte del formato dei dati pixel forniti con il data
parametro.
Per dirla in un altro modo format
e type
definire l' aspetto dei dati. internalformat
è come stai dicendo a OpenGL di archiviare i tuoi dati. Chiamiamo format
e type
il "formato di trasferimento pixel", mentre internalformat
sarà il "formato immagine".
Il formato dell'immagine di una trama non può mai essere "bgr8". Non esiste un enumeratore del formato immagine GL_BGR8. V'è un enum GL_BGR, ma che è per il formato di trasferimento dei pixel, non il formato di immagine.
O, per dirla in altro modo, i dati dei pixel forniti a OpenGL possono essere archiviati in ordine BGR. Ma l'implementazione OpenGL decide autonomamente come archiviare effettivamente quei dati pixel. Forse lo memorizza in ordine little-endian. Forse lo memorizza big-endian. Forse riorganizza arbitrariamente i byte. Non lo sai e OpenGL non fornisce un modo per scoprirlo.
Non è possibile stabilire se un determinato set di parametri del formato di trasferimento dei pixel corrisponda al modo in cui l'implementazione OpenGL li memorizzerà in base al formato dell'immagine.
C'è un modo per dirlo ora. E per "ora" intendo in OpenGL 4.3 e / o ARB_internalformat_query2. Venendo a una scheda grafica vicino a te:
GLenum format, type;
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &format);
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &type);
format
e type
ora hanno l'implementazione preferita format
e type
per l'utilizzo di glTex(Sub)Image
chiamate alle GL_RGBA8
immagini. Ci sono separati format
e type
query per i glReadPixels
download.
Ci sono altre domande che puoi fare .
Se non hai accesso a questi, puoi utilizzare alcune regole generali a cui la maggior parte dell'hardware aderirà:
- memorizzerà i dati pixel per i dati a 8 bit per canale nell'ordine BGRA. Quindi, se si desidera abbinare il formato con i dati dei pixel, in modo da caricare più rapidamente i dati delle trame, si desidera utilizzare
GL_BGRA
per format
, e GL_UNSIGNED_INT_8888
o GL_UNSIGNED_BYTE
per type
.
- in realtà non memorizzerà i colori a 24 bit come 24 bit. Li riempirà sempre a 32 bit; l'alfa verrà semplicemente ignorato quando legge i dati. Quindi, se si desidera abbinare i formati, utilizzare sempre
GL_BGRA
format
con i GL_RGB8
formati di immagine, anche se è necessario inserire dati fittizi nel componente alfa.