Изменение цвета определенных пикселей на текстуре с помощью SDL2 - PullRequest
0 голосов
/ 19 сентября 2019

Я делаю игру с SDL2.У меня есть спрайт-лист, который я загружаю как текстуру, и я рисую спрайты из него в окне игры, например:

SDL_RenderCopy(renderer, sprite_sheet_texture, &src_rect, &dst_rect);
SDL_RenderPresent(renderer);

Я хочу специально изменить цвет каждого черного пикселя.каждого спрайта в текстуре во время игры.По сути, я хочу создать эффект непрерывного свечения от черного до белого и снова черного.

Вот пример того, как спрайт выглядит в игре

Вот как выглядит эффект, который я надеюсь достичь

Единственный способ, который я смог найти, - это прочитать данные пикселей из текстуры листа спрайта и вручную обновитьцвет каждого черного пикселя до более светлого оттенка.Затем сделайте это снова и обновите этот более светлый цвет пикселя до более светлого, пока не будет достигнут самый светлый, и повторите процесс в обратном порядке.

Код (только для первого шага черных пикселей -> более светлый оттенок приминимум) будет выглядеть примерно так:

Uint32* pixels;
int pitch;

SDL_LockTexture(sprite_sheet_texture, NULL, &pixels, &pitch);
SDL_RenderReadPixels(renderer, NULL, SDL_PIXELFORMAT_RGBA8888, pixels, pitch);

// Get pixel count
SDL_PixelFormat* mapping_format = SDL_AllocFormat(SDL_PIXELFORMAT_RGBA8888);
int pixel_count = (pitch / mapping_format->BytesPerPixel) * sprite_sheet_height;

// Swap every black pixel to a lighter shade
Uint32 from_pixel = SDL_MapRGBA(0, 0, 0, 255);
Uint32 to_pixel   = SDL_MapRGBA(24, 24, 24, 255);

for (int i = 0; i < pixel_count; i++) {
    if (pixels[i] == from_pixel} {
        pixels[i] = to_pixel;
    }
}

SDL_FreeFormat(mapping_format);
SDL_UnlockTexture(streaming_texture);

У этого метода есть пара проблем:

  1. Это медленно.Я еще не тестировал его, но документация SDL предостерегает от частого использования SDL_RenderReadPixels, поскольку это «очень медленная операция».Мне пришлось бы запускать приведенный выше код несколько раз в секунду.

  2. Мой спрайт-лист не смог бы иметь определенные значения пикселей в нем.Например, если я обновляю пиксели с «0, 0, 0» до «24, 24, 24», а затем до «48, 48, 48», я должен убедиться, что спрайт-лист не имеетодин пиксель со значениями «24, 24, 24» или «48, 48, 48», поскольку вышеуказанная функция также обновляет эти пиксели, а я просто хочу обновить те, которые изначально были черными.

Есть ли лучший способ сделать это?

...