Sua pergunta parece confundir certos conceitos, então vamos pegar as coisas de cima. Esta é a definição da função glTexImage2D
:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Há duas coisas que você pode chamar de "formatos de textura". O primeiro é o internalformat
parâmetro Este é o formato real da imagem quando o OpenGL a armazena. O format
parâmetro descreve parte do formato dos dados de pixel que você está fornecendo com o data
parâmetro
Em outras palavras, format
e type
defina a aparência dos seus dados. internalformat
é assim que você está dizendo ao OpenGL para armazenar seus dados. Vamos chamar format
e type
o "formato de transferência de pixels", enquanto internalformat
será o "formato de imagem".
O formato da imagem de uma textura nunca pode ser "bgr8". Não há enumerador de formato de imagem GL_BGR8. Não é um enum GL_BGR, mas isso é para o formato de transferência de pixel, não o formato de imagem.
Ou, dito de outra forma, os dados de pixel que você fornece ao OpenGL podem ser armazenados na ordem BGR. Mas a implementação do OpenGL decide por si própria como realmente armazenar esses dados de pixel. Talvez o armazene em ordem little-endian. Talvez ele armazene big-endian. Talvez apenas reorganize arbitrariamente os bytes. Você não sabe, e o OpenGL não fornece uma maneira de descobrir.
Não há como saber se um conjunto específico de parâmetros do formato de transferência de pixels corresponde a como a implementação do OpenGL os armazenará, dado o formato da imagem.
Existe uma maneira de dizer agora. E por "agora", quero dizer no OpenGL 4.3 e / ou ARB_internalformat_query2. Chegando a uma placa gráfica perto de você:
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
agora tenha a implementação preferida format
e type
para usar glTex(Sub)Image
chamadas para GL_RGBA8
imagens. Existem consultas format
e downloads separados .type
glReadPixels
Existem outras consultas que você pode fazer .
Se você não tiver acesso a eles, poderá usar algumas regras gerais que a maioria dos hardwares seguirá:
- armazenará dados de pixel para dados de 8 bits por canal na ordem BGRA. Portanto, se você deseja combinar o formato com os dados de pixel, para carregar mais rapidamente os dados de textura, você deseja usar
GL_BGRA
para format
e / GL_UNSIGNED_INT_8888
ou GL_UNSIGNED_BYTE
para type
.
- na verdade, não armazenará cores de 24 bits como 24 bits. Ele sempre aumentará para 32 bits; o alfa será ignorado apenas quando ler os dados. Portanto, se você deseja combinar formatos, sempre use
GL_BGRA
format
com GL_RGB8
formatos de imagem, mesmo que seja necessário inserir dados fictícios no componente alfa.