Мой код для загрузки изображений работает для 24- и 32-битных изображений. Я загружаю изображение с помощью SDL2_image:
// Snip cruft above
if((surface = IMG_Load(filename.c_str())) == NULL) {
error = "Unable to load file: " + filename;
throw error.c_str();
}
// get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4) { // contains an alpha channel
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
} else if (nOfColors == 3) { // no alpha channel
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
} else {
error = "error: the image is not truecolor.. this will probably break (" + filename + " contains " + std::to_string(nOfColors) + " bytes per pixel)";
throw error.c_str();
}
// snip OpenGL stuff below
nOfColors содержит только значение 1, потому что PNG сохраняется как индексированное цветовое пространство. GIMP нормально открывает файл, включая альфа-канал.
Как я могу преобразовать поверхность в текстуру истинного цвета, чтобы использовать ее для рендеринга на четырехугольнике OpenGL?
Если это невозможно (или нецелесообразно), как сохранить PNG как изображение в истинном цвете с альфа-каналом. Я пробовал ImageMagick:
convert image.png -depth 32 image.png
Но изображение по-прежнему сохраняется как индексированное цветное изображение.
В качестве дополнительной информации - программа работала с SDL1.2, но перестала работать после переноса на SDL2. Я обновил все остальное до SDL2, но, возможно, в работе SDL2_image произошли изменения, о которых я не знаю.