Здається, ваше запитання плутає певні поняття, тож давайте взяти речі зверху. Це визначення функції 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
форматами зображень, навіть якщо ви повинні помістити фіктивні дані в альфа - компоненті.