(仅支持 Linux ,特别地,也支持 Bash On Windows )
Minecraft 渲染 Unicode 文字的思路是把0x00000000到0xFFFFFFFF的每个文字都做成材质贴图,按照高 16 位进行分割,形成assets/minectaft/textures/font/unicode_page_ff.png这样的图片,每个文字都是方格的;
为了解决文字宽度不同的问题,设置了一个文件(assets/minecraft/font/glyph_sizes.bin)来保存对应图像的水平坐标区间,采用一个字节来保存(高 4 位保存 xMin ,低 4 位保存 xMax ,当然精度方面也就只有 4 位了,但是考虑到 mc 的马赛克性质,确实足够用了),这些字节直接按照 Unicode 值作为文件中位置。
这种方法的确不是完美方法,因为 Unicode 中的好多特性都不能实现(比如 RTL ,组合字符等等)——但是,对于一款游戏而言,这种处理可以说是比较好的了。
研究完原理之后,我就直接手撸了一个字体材质生成器——当然不是直接生成.zip形式的字体包,不过也差不多了,只需要指定输出文件(glyph_sizes.bin)和材质输出目录就可以输出,如果需要打包成材质包的话,还需要补全目录结构和pack.mcmeta文件。
- 生成配对的
glyoh_sizes.bin文件,以支持非等宽字体。 - 支持多进程同时生成(-t 参数指定的是产生的子进程,所以是总进程数-1 )。
- 支持 2 种渲染模式( LIGHT 模式和标准模式,名字来源于 FreeType2 的渲染参数。
注意:没有禁止超高分辨率图像的生成,所以可以生成超出 Minecraft 渲染极限的材质——显然大于等于16384x 的材质包是没有意义的(除了用于测试电脑性能)。
效果预览:( Inziu Iosevka SC 字体, 1024x )

PS:显然采用类似技术输出 Unicode 文字的游戏应该挺多的,但是想不通为啥都 2016 年了,还有好多游戏中文显示不了的(不说输入问题了,就说输出的),然后想到 ASCII 总共才 256 个字符,差不多就想通了。。。。。