SFML C ++ Как раскрасить спрайты 12 различными цветами - PullRequest
0 голосов
/ 09 июня 2018

Итак, я пытаюсь создать клон Warcraft II RTS с SFML.Я закончил свое меню сейчас, меню, которое должно поддерживать 12 разных проигрывателей, то есть 12 разных цветов, однако у меня проблемы с раскрашиванием разных спрайтов, которые я скачал из интернета, и, вероятно, создание 12 разных файлов png для загрузки для каждого юнита / здания будетогромная трата времени и памяти.

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

Вот некоторые примеры спрайтов, которые я получил

Footman png Team Colors png

enter image description here

Также здесь есть ссылкадля всего проекта (однако это не включает полезную информацию об этих спрайтах, потому что только меню сделано): https://github.com/lori2001/Warcraft-II---clone/tree/master

Любые предложения приветствуются!:)

1 Ответ

0 голосов
/ 09 июня 2018

На втором изображении, которое вы разместили, указан ключ: символы идентичны, за исключением четырех цветовых оттенков, указанных внизу.Таким образом, вы можете предварительно обработать свои листы спрайтов и разделить их на биты с палитрой и биты без палитры.

Что вы будете делать потом, решать только вам;простейшим, вероятно, является создание одного нового листа спрайта для каждого цвета и использование правильного листа спрайта при рендеринге единицы для данного цвета.В терминах OpenGL я бы подумал о трехмерной текстуре, где первое измерение - это цвет.

В качестве альтернативы, вы можете использовать текстуру RGBA и отмечать биты палитры, используя альфа-канал;рендеринг будет выглядеть примерно так:

if (pixel.a == 1.0) {
    outputColor = vec4(pixel.rgb, 1.0);
} else {
    int idx = pixel.r / 0.25;
    outputColor = vec4(palette[idx].rgb, 1.0);
}

, где pixel - это пиксель в вашем листе спрайта, а palette - это шейдерная униформа, содержащая четыре значения RGB.Альфа-значение 1 будет сохранять входной пиксель, в то время как любой из [0, 0,25, 0,50, 0,75] будет использовать соответствующий индекс палитры.

...