Su pregunta parece confundir ciertos conceptos, así que tomemos las cosas desde arriba. Esta es la definición de la función glTexImage2D:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Hay dos cosas que podría llamar "formatos de textura". El primero es el internalformatparámetro. Este es el formato real de la imagen a medida que OpenGL la almacena. El formatparámetro describe parte del formato de los datos de píxeles que proporciona con el dataparámetro.
Para decirlo de otra manera, formaty typedefinir cómo se ven sus datos. internalformatasí es como le estás diciendo a OpenGL que almacene tus datos. Llamemos formaty typeel "formato de transferencia de píxeles", mientras internalformatque será el "formato de imagen".
El formato de imagen de una textura nunca puede ser "bgr8". No hay un enumerador de formato de imagen GL_BGR8. No es una enumeración GL_BGR, pero eso es para el formato de transferencia de píxeles, no el formato de imagen.
O para decirlo de otra manera, sus datos de píxeles que le da a OpenGL pueden almacenarse en orden BGR. Pero la implementación de OpenGL decide por sí misma cómo almacenar esos datos de píxeles. Tal vez lo almacena en orden little-endian. Tal vez lo almacena big-endian. Tal vez solo reorganiza arbitrariamente los bytes. No lo sabe, y OpenGL no proporciona una forma de averiguarlo.
No hay forma de saber si un conjunto particular de parámetros de formato de transferencia de píxeles coincide con cómo la implementación de OpenGL los almacenará dado el formato de imagen.
Hay una manera de saberlo ahora. Y por "ahora", quiero decir en OpenGL 4.3 y / o ARB_internalformat_query2. Llegando a una tarjeta gráfica cerca de usted:
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);
formaty typeahora tiene la implementación preferida formaty typepara usar glTex(Sub)Imagellamadas a GL_RGBA8imágenes. Hay consultas separadas formaty typepara glReadPixelsdescargas.
Hay otras consultas que puede hacer .
Si no tiene acceso a estos, puede usar algunas reglas generales a las que se adherirá la mayoría del hardware:
- almacenará datos de píxeles para datos de 8 bits por canal en orden BGRA. Por lo tanto, si desea hacer coincidir el formato con sus datos de píxeles, a fin de cargar más rápidamente los datos de textura, desea usarlos
GL_BGRApara format, GL_UNSIGNED_INT_8888o GL_UNSIGNED_BYTEpara type.
- en realidad no almacenará colores de 24 bits como 24 bits. Siempre los rellenará a 32 bits; el alfa solo será ignorado cuando lea los datos. Por lo tanto, si desea hacer coincidir formatos, use siempre
GL_BGRA formatcon GL_RGB8formatos de imagen, incluso si tiene que poner datos ficticios en el componente alfa.