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 internalformatparametro. Questo è il vero formato dell'immagine mentre OpenGL la memorizza. Il formatparametro descrive parte del formato dei dati pixel forniti con il dataparametro.
Per dirla in un altro modo formate typedefinire l' aspetto dei dati. internalformatè come stai dicendo a OpenGL di archiviare i tuoi dati. Chiamiamo formate typeil "formato di trasferimento pixel", mentre internalformatsarà 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);
formate typeora hanno l'implementazione preferita formate typeper l'utilizzo di glTex(Sub)Imagechiamate alle GL_RGBA8immagini. Ci sono separati formate typequery per i glReadPixelsdownload.
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_BGRAper format, e GL_UNSIGNED_INT_8888o GL_UNSIGNED_BYTEper 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 formatcon i GL_RGB8formati di immagine, anche se è necessario inserire dati fittizi nel componente alfa.