Хобрук: Ваш путь к мастерству в программировании

Как использовать индексированное изображение PNG в качестве текстуры для SDL2/OpenGL

Мой код для загрузки изображений работает для 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 произошли изменения, о которых я не знаю.

28.01.2015

  • Если есть вариант конвертации, используйте его. Если нет, вы всегда можете вернуться к использованию new_surface = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_RGBA888, 0). Не забудьте освободить старый сёрф. 28.01.2015

Ответы:


1

Просто преобразуйте его в нужный формат, используя SDL_ConvertSurfaceFormat()...

SDL_Surface *image = ...;
SDL_Surface *converted = SDL_ConvertSurfaceFormat(
    image, SDL_PIXELFORMAT_ARGB8888, 0);
28.01.2015

2

Вы можете заставить ImageMagick создать 32-битное изображение (т. е. 8 бит на канал плюс альфа-канал) следующим образом:

convert image.png PNG32:image.png
28.01.2015

3

Согласно причудливому языку ImageMagick, проиндексированное изображение — это всего лишь одно с «цветовым типом» номер 3 (палитра).

Итак, чтобы сгенерировать png без палитры с помощью команды convert, необходимо:

convert -type TrueColorAlpha image_in.png image_out.png
28.01.2015
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..