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