На втором изображении, которое вы разместили, указан ключ: символы идентичны, за исключением четырех цветовых оттенков, указанных внизу.Таким образом, вы можете предварительно обработать свои листы спрайтов и разделить их на биты с палитрой и биты без палитры.
Что вы будете делать потом, решать только вам;простейшим, вероятно, является создание одного нового листа спрайта для каждого цвета и использование правильного листа спрайта при рендеринге единицы для данного цвета.В терминах 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] будет использовать соответствующий индекс палитры.