Я хочу загрузить SDL_Surface в текстуру OpenGL с отступом (так, чтобы NPOT-> POT) и потом применить цветную клавишу на поверхности. Я либо заканчиваю цветовую маркировку всех пикселей, независимо от их цвета, либо вообще ничего не использую. Я пробовал много разных вещей, но ни одна из них, похоже, не работает.
Вот рабочий фрагмент моего кода. Я использую собственный цветовой класс для colorkey (диапазон [0-1]):
// Create an empty surface with the same settings as the original image
SDL_Surface* paddedImage = SDL_CreateRGBSurface(image->flags, width, height,
image->format->BitsPerPixel,
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
0xff000000,
0x00ff0000,
0x0000ff00,
0x000000ff
#else
0x000000ff,
0x0000ff00,
0x00ff0000,
0xff000000
#endif
);
// Map RGBA color to pixel format value
Uint32 colorKeyPixelFormat = SDL_MapRGBA(paddedImage->format,
static_cast<Uint8>(colorKey.R * 255),
static_cast<Uint8>(colorKey.G * 255),
static_cast<Uint8>(colorKey.B * 255),
static_cast<Uint8>(colorKey.A * 255));
SDL_FillRect(paddedImage, NULL, colorKeyPixelFormat);
// Blit the image onto the padded image
SDL_BlitSurface(image, NULL, paddedImage, NULL);
SDL_SetColorKey(paddedImage, SDL_SRCCOLORKEY, colorKeyPixelFormat);
После этого я генерирую текстуру OpenGL из paddedImage, используя код, подобный коду загрузки текстуры SDL + OpenGL, найденному онлайн (я опубликую при необходимости). Этот код работает, если я просто хочу текстуру с или без заполнения, и, вероятно, не проблема.
Я понимаю, что для всех пикселей в paddedImage задано альфа-ноль, что вызывает первую проблему, о которой я говорил, но я не могу понять, как это сделать. Должен ли я просто зациклить пиксели и установить соответствующие цвета, чтобы иметь альфа-ноль?
ЧАСТИЧНОЕ РЕШЕНИЕ:
- Создать paddedImage, как указано выше
- SDL_FillОткрыть дополненное изображение с помощью цветовой клавиши
- Генерация текстуры "как обычно"
- Вручную скопировать пиксели изображения (SDL_Surface *) в paddedImage (текстура OGL)
Это работает почти всегда, если в некоторых случаях изображение имеет 3 цветовых компонента (то есть без альфа-канала). Я пытаюсь исправить это сейчас, преобразовав их в 4 цветовых компонента