Twoje pytanie wydaje się mylić niektóre pojęcia, więc weźmy rzeczy z góry. Oto definicja funkcji glTexImage2D:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Istnieją dwie rzeczy, które możesz nazwać „formatami tekstur”. Pierwszy to internalformatparametr. To jest prawdziwy format obrazu, gdy OpenGL go przechowuje. Ten formatparametr opisuje część formatu danych pikseli, które podajesz z dataparametrem.
Ujmując to w inny sposób, formati typeokreślić, co wasze spojrzenia danych podoba. internalformattak mówisz OpenGL, aby zapisywał twoje dane. Nazwijmy formati type„format transferu piksel”, zaś internalformatbędzie „Format obrazu”.
Format obrazu tekstury nigdy nie może być „bgr8”. Nie ma modułu wyliczającego format obrazu GL_BGR8. Jest to enum GL_BGR, ale to jest na formatce przelewu pikseli, a nie format obrazu.
Innymi słowy, dane w pikselach, które podajesz OpenGL, mogą być przechowywane w kolejności BGR. Ale implementacja OpenGL sama decyduje, jak faktycznie przechowywać dane pikseli. Może przechowuje to w porządku little-endian. Może przechowuje to big-endian. Może po prostu arbitralnie porządkuje bajty. Nie wiesz, a OpenGL nie zapewnia sposobu na sprawdzenie.
Nie ma sposobu, aby stwierdzić, czy określony zestaw parametrów formatu transferu pikseli pasuje do sposobu, w jaki implementacja OpenGL będzie je przechowywać, biorąc pod uwagę format obrazu.
Jest teraz sposób, aby powiedzieć. I przez „teraz” mam na myśli w OpenGL 4.3 i / lub ARB_internalformat_query2. Zbliżasz się do karty graficznej w pobliżu:
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);
formata typeteraz mają preferowaną implementację formati typeużywają glTex(Sub)Imagewywołań GL_RGBA8obrazów. Istnieją osobne formati typezapytania dotyczące glReadPixelspobierania.
Istnieją inne zapytania, które możesz zadać .
Jeśli nie masz do nich dostępu, możesz zastosować ogólne zasady, których będzie przestrzegać większość sprzętu:
- będzie przechowywać dane pikselowe dla danych 8-bit-na kanał w kolejności BGRA. Jeśli więc chcesz dopasować format do danych w pikselach, aby szybciej przesyłać dane tekstur, chcesz użyć
GL_BGRAdla format, i GL_UNSIGNED_INT_8888lub GL_UNSIGNED_BYTEdla type.
- w rzeczywistości nie będzie przechowywać 24-bitowych kolorów jako 24-bitowych. Zawsze będzie je uzupełniał do 32 bitów; alfa zostanie po prostu zignorowane podczas odczytu danych. Więc jeśli chcesz dopasować formatów, zawsze korzystać
GL_BGRA formatz GL_RGB8formatów graficznych, nawet jeśli trzeba umieścić dane manekina w składowej alfa.