把颜色匹配到 Minecraft 方块,比看上去难得多
两个方块在 RGB 上可能一模一样,砌到墙上却截然不同,因为游戏会为每一个渲染的面加上明暗。
挑一个平均颜色最接近目标颜色的方块,你多半会挑错。Minecraft 并不是用材质贴图的平均颜色来绘制方块的——它会先把贴图乘以每个面的亮度,再乘以该位置的光照等级。你从截图里取到的颜色,已经是这层明暗处理之后的结果,所以直接拿它去做最近颜色搜索,比对的是一个任何方块都不会真正显示出来的值。
为什么平均 RGB 会失效
平均 RGB 把三个通道看得同等重要,还假定它们是线性变化的。这两点都不成立。人眼对绿色的差异远比蓝色敏感,而同样数值大小的色差,在暗部看起来要比在亮部大得多。两个方块与目标色的 RGB 距离可以完全相同,砌到墙上却毫无相似之处。
CIELAB 正是为解决这个问题而设计的:在 Lab 空间中相等的数值距离,大致对应相等的感知差异。在 Lab 里做匹配,调色工具才能推荐出真正看起来颜色对的方块,而不是仅仅共享同一个十六进制色码的方块。
贴图不止一种颜色
方块贴图是一整块像素方格,而且大多数并不平整。一张 16×16 的贴图有 256 个像素,一块斑驳的石头或一片杂色的树叶贴图会覆盖很宽的色调范围。把它压缩成一个平均值,就丢掉了方差——而方差恰恰决定了拼出来的图案看起来是平滑还是满是斑点。调色匹配器是拿真实的贴图文件来测量的,所以它给出的距离反映的是方块实际包含的内容。
Java 与 Bedrock 在这里并不一致
两个版本发布的贴图并不相同,明暗处理方式也不一样。Java 通过自己的渲染管线施加方向性面亮度和生物群系着色;Bedrock 对着色和部分方块颜色的处理方式不同。在一个版本里匹配得天衣无缝的调色方案,换到另一个版本可能明显偏色,草、树叶和水尤其如此。请在你真正要摆放方块的版本里构建调色方案。
从图片到马赛克
马赛克是一张网格,每个格子对应一个方块。由此可以推出两件事。第一,图片必须在匹配之前先降采样到网格尺寸,而不是之后——按全分辨率匹配再缩小,得到的调色方案是为早已不存在的细节挑选的。第二,输出是一串 .mcfunction,所以整个建筑是用命令放置的,而不是手工搭建。命令数量随格子数量增长,与图片的像素数量无关。
透明度的陷阱
带有部分 alpha 的像素没有对应的单一方块。要事先决定它们变成空气、某种玻璃变体,还是最接近的不透明方块,因为匹配器猜不出你的意图,否则它只会把它们归入最接近的某种纯色。
用现成的 .mcfunction 把图片变成方块马赛克,或者找出与任意颜色最接近的原版方块,尽在 像素画与方块调色板。