【问题标题】:SFML C++ How to color sprites with 12 different colorsSFML C++ 如何用 12 种不同颜色为精灵着色
【发布时间】:2018-06-09 08:16:54
【问题描述】:

所以,我正在尝试使用 SFML 创建魔兽争霸 II RTS 克隆。我现在完成了我的菜单,这个菜单应该支持 12 种不同的播放器,因此有 12 种不同的颜色,但是我在为从 Internet 下载的不同精灵着色时遇到问题,并且可能为每个单元/建筑物加载 12 个不同的 png 文件将是非常浪费时间和内存。

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

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

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

欢迎提出任何建议! :)

【问题讨论】:

  • 取决于你对结果的挑剔程度,但你应该能够在精灵上调用setColor() 来为它们着色。当然,这也会弄乱肤色,但对于第一次通过可能是可行的。否则可能希望将皮肤和衣服分成两种不同的纹理,然后只将衣服的setColor 分开,保持皮肤完好无损。
  • 这是个好主意,对于男仆精灵来说很容易做到这一点,但是对于像编辑中的精灵来说就很难了..

标签: c++ sfml


【解决方案1】:

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

之后做什么取决于你;最简单的可能是为每种颜色生成一个新的精灵表,并在为给定颜色渲染一个单元时使用正确的精灵表。在 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 是精灵表中的像素,palette 是包含四个 RGB 值的着色器统一。 alpha 值为 1 将保留输入像素,而 [0, 0.25, 0.50, 0.75] 中的任何一个都将使用相应的调色板索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多