Поместите SDL_Surface на другой SDL_Surface и примените цветовой ключ - PullRequest
2 голосов
/ 02 марта 2012

Я хочу загрузить 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 задано альфа-ноль, что вызывает первую проблему, о которой я говорил, но я не могу понять, как это сделать. Должен ли я просто зациклить пиксели и установить соответствующие цвета, чтобы иметь альфа-ноль?

ЧАСТИЧНОЕ РЕШЕНИЕ:

  1. Создать paddedImage, как указано выше
  2. SDL_FillОткрыть дополненное изображение с помощью цветовой клавиши
  3. Генерация текстуры "как обычно"
  4. Вручную скопировать пиксели изображения (SDL_Surface *) в paddedImage (текстура OGL)

Это работает почти всегда, если в некоторых случаях изображение имеет 3 цветовых компонента (то есть без альфа-канала). Я пытаюсь исправить это сейчас, преобразовав их в 4 цветовых компонента

1 Ответ

1 голос
/ 02 апреля 2012

Я думаю, что его можно использовать вместе с OpenGL, если вы можете конвертировать SDL_Surface s в текстуры OGL, а затем вы можете использовать функцию blit для объединения ваших текстур и манипулирования вещами с использованием рабочего процесса SDL.Я не знаю, чего ты хочешь достичь.Вы хотите перенести одну поверхность в текстуру OGL и сохранить цветовой ключ или просто хотите применить поверхность с цветным ключом к другой поверхности, которую затем преобразуете в текстуру OGL.Кроме того, вам не нужно использовать альфа-пиксельные данные, так как SDL дает вам возможность использовать альфа-каналы для каждой поверхности, но это довольно сложно из-за того, что альфа и цветовые клавиши могут комбинироваться и использоваться вместе.

сложная вещь, пожалуйста, обратитесь к справочнику по SDL, и этот урок также может быть полезен (хотя он не обрабатывает OGL): http://www.sdltutorials.com/the-ins-and-outs-and-overlays-of-alpha-blending

...