Ваш вопрос, кажется, сбивает с толку определенные концепции, поэтому давайте рассмотрим все с самого начала. Это определение функции 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
форматами изображений, даже если вы должны поместить фиктивные данные в альфа - компоненте.