SFML C++ 如何用 12 种不同的颜色给精灵上色

SFML C++ How to color sprites with 12 different colors

因此,我正在尝试使用 SFML 创建 Warcraft II RTS 克隆。我现在完成了我的菜单,一个菜单应该支持 12 种不同的播放器,因此有 12 种不同的颜色,但是我在为我从互联网下载的不同精灵着色时遇到问题,并且可能为每个 unit/building 加载 12 个不同的 png 文件将是对时间和内存的巨大浪费。

我看到了很多关于这个主题的不同建议,但它们要么不切实际,要么真的很难做到。

这些是我得到的精灵的一些例子

这里还有完整项目的 link(但是这不包括有关这些精灵的有用信息,因为只完成了菜单): https://github.com/lori2001/Warcraft-II---clone/tree/master

欢迎提出任何建议! :)

您发布的第二张图片表明了关键:除了底部指示的四种颜色之外,字符完全相同。 因此,您可以预处理精灵 sheets 并将它们分成调色板位和非调色板位。

之后的事情由你决定;最简单的可能是为每种颜色生成一个新精灵 sheet,并在为给定颜色渲染一个单元时使用正确的精灵 sheet。在 OpenGL 术语中,我会想到第一个维度是颜色的 3D 纹理。

或者,您可以使用 RGBA 纹理并使用 alpha 通道标记调色板位;渲染将类似于

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 是精灵中的像素 sheet,palette 是包含四个 RGB 值的着色器统一。 alpha 值为 1 将保留输入像素,而 [0, 0.25, 0.50, 0.75] 中的任何一个都将使用相应的调色板索引。