Votre question semble brouiller certains concepts, alors prenons les choses par le haut. Voici la définition de la fonction glTexImage2D
:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Il y a deux choses que vous pourriez appeler des "formats de texture". Le premier est le internalformat
paramètre. Il s'agit du véritable format de l'image telle qu'OpenGL la stocke. Le format
paramètre décrit une partie du format des données de pixels que vous fournissez avec le data
paramètre.
Pour le dire autrement format
et type
définir à quoi ressemblent vos données. internalformat
est la façon dont vous dites à OpenGL de stocker vos données. Appelons format
et type
le "format de transfert de pixels", tandis que internalformat
sera le "format d'image".
Le format d'image d'une texture ne peut jamais être "bgr8". Il n'y a pas d'énumérateur de format d'image GL_BGR8. Il y a une énumération GL_BGR, mais c'est pour le format de transfert de pixels, pas le format d'image.
Ou pour le dire autrement, vos données de pixels que vous donnez à OpenGL peuvent être stockées dans l'ordre BGR. Mais la mise en œuvre d'OpenGL décide seule de la façon de stocker réellement ces données de pixels. Peut-être qu'il le stocke dans un ordre peu endian. Peut-être qu'il le stocke en big-endian. Peut-être qu'il réorganise simplement arbitrairement les octets. Vous ne savez pas, et OpenGL ne fournit aucun moyen de le savoir.
Il n'y a aucun moyen de savoir si un ensemble particulier de paramètres de format de transfert de pixels correspond à la façon dont l'implémentation OpenGL les stockera compte tenu du format d'image.
Il y a un moyen de le dire maintenant. Et par "maintenant", je veux dire dans OpenGL 4.3 et / ou ARB_internalformat_query2. Venir sur une carte graphique près de chez vous:
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
et type
ont maintenant l'implémentation préférée format
et type
pour utiliser les glTex(Sub)Image
appels aux GL_RGBA8
images. Il sont séparés format
et les type
requêtes pour les glReadPixels
téléchargements.
Il existe d' autres requêtes que vous pouvez effectuer .
Si vous n'y avez pas accès, vous pouvez utiliser certaines règles générales que la plupart des matériels respecteront:
- stockera les données de pixels pour les données de 8 bits par canal dans l'ordre BGRA. Donc, si vous souhaitez faire correspondre le format avec vos données de pixels, afin de télécharger plus rapidement les données de texture, vous souhaitez utiliser
GL_BGRA
pour le format
et GL_UNSIGNED_INT_8888
ou GL_UNSIGNED_BYTE
pour le type
.
- ne stockera pas réellement les couleurs 24 bits en 24 bits. Il les remplira toujours en 32 bits; l'alpha sera simplement ignoré lors de la lecture des données. Donc , si vous voulez faire correspondre les formats, utilisez toujours
GL_BGRA
format
avec les GL_RGB8
formats d'image, même si vous devez mettre des données fictives dans le composant alpha.