Ваш вопрос, кажется, сбивает с толку определенные концепции, поэтому давайте рассмотрим все с самого начала. Это определение функции glTexImage2D:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
Есть две вещи, которые вы можете назвать «форматы текстур». Первый internalformatпараметр. Это реальный формат изображения, поскольку OpenGL хранит его. formatПараметр описывает часть формата пиксельных данных вы обеспечиваете с dataпараметром.
Другими словами, formatи typeопределите, как будут выглядеть ваши данные. internalformatэто то, как вы говорите OpenGL для хранения ваших данных. Давайте назовем formatи type«формат передачи пикселей», пока internalformatбудет «формат изображения».
Формат изображения текстуры никогда не может быть "bgr8". Нет перечислителя формата изображения GL_BGR8. Там есть GL_BGR перечисление, но это для формата передачи пикселей, а не формат изображения.
Или, другими словами, ваши данные пикселей, которые вы предоставляете OpenGL, могут храниться в порядке BGR. Но реализация OpenGL сама решает, как на самом деле хранить эти данные пикселей. Возможно это хранит это в порядке с прямым порядком байтов. Может быть, он хранит это в порядке байтов. Может быть, это просто произвольно переставляет байты. Вы не знаете, и OpenGL не предоставляет способ выяснить это.
Невозможно определить, соответствует ли конкретный набор параметров формата передачи пикселей, как реализация OpenGL будет хранить их с учетом формата изображения.
Есть способ сказать сейчас. И под «сейчас» я имею в виду OpenGL 4.3 и / или ARB_internalformat_query2. Подходим к видеокарте рядом с вами:
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и typeтеперь есть предпочтительная реализация formatи typeдля использования glTex(Sub)Imageвызовов к GL_RGBA8изображениям. Есть отдельные formatи typeзапросы на glReadPixelsскачивание.
Есть и другие вопросы, которые вы можете задать .
Если у вас нет доступа к ним, вы можете использовать некоторые общие правила, которых придерживается большинство аппаратных средств:
- будет хранить данные пикселей для данных 8 бит на канал в порядке BGRA. Поэтому, если вы хотите сопоставить формат с вашими пиксельными данными, чтобы быстрее загружать данные текстуры, вы хотите использовать
GL_BGRAдля format, и GL_UNSIGNED_INT_8888или GL_UNSIGNED_BYTEдля type.
- фактически не будет хранить 24-битные цвета как 24-битные. Он всегда будет дополнять их до 32 бит; альфа будет просто игнорироваться при чтении данных. Так что если вы хотите , чтобы соответствовать форматам, всегда использовать
GL_BGRA formatс GL_RGB8форматами изображений, даже если вы должны поместить фиктивные данные в альфа - компоненте.