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