Я просто изучаю текстуру в OpenGL и немного смущен некоторыми результатами, которые получаю.Неправильные цвета отображаются при загрузке 32-битного png с использованием stb_image и использования GL_UNSIGNED_INT_8_8_8_8 в качестве параметра типа glTexImage2D
Я использую stb_image загрузить следующую Checkerboard PNG изображение:
Когда я сохранил изображение PNG Я явно выбрал, чтобы сохранить его как 32-бит. Это заставило бы меня поверить, что каждый компонент (RGBA) будет храниться как 8 бит в общей сложности 32 бита - размер неподписанного int. Однако, используя следующий код:
unsigned char * texture_data =
stbi_load("resources/graphics-scene/tut/textures/checker.png", &w, &h, nullptr, 4);
// ...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0,
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, texture_data);
выходы:
Если я вместо этого использовать GL_UNSIGNED_BYTE для параметра типа я получаю правильные результаты.
Кроме того, только упаковывают это поможет, я также попробовал следующее изображение:
, который дает
GL_UNSIGNED_BYTE дает правильный результат в этом случае.
Я не уверен, что это случай недопонимания glTexImage2D или stb_image (он преобразует загруженные данные в 8-разрядные, что вряд ли мне понравится).
РЕДАКТИРОВАТЬ: Я, наконец, нашел связанное сообщение (уже искал некоторых, но не повезло). Однако ответ (https://stackoverflow.com/a/4191875/2507444) меня смущает. Если это так, то параметр типа указывает, сколько байтов на компонент - то что именно делают такие вещи, как GL_UNSIGNED_BYTE_3_3_2 и GL_UNSIGNED_INT_8_8_8_8?