文字画面渲染:我们如何用文字画出一整座城
《字里乾坤》里的每一片屋顶、每一棵树、每一辆车和每一盏灯笼,都是由文字字符构成的。这不是事后把3D场景转成ASCII的着色器,而是一个字符一个字符手敲出来的图。本文讲讲这套文字画面渲染如何让它们变成一座有光、有影、有夜晚的活城市。

一张图就是两行文字
游戏中的每张图,都是一组成对的等宽文本行。第一行是图本身,也就是你在文本编辑器里会看到的字符。第二行是颜色图:每个字符对应一个字母,指向这张图调色板中的一项,给出字形的颜色和底色。颜色图里的空格表示透明;颜色下方文本里的空格,表示填满底色。
格式就这么多。带顶棚和井绳的水井、一座粮仓、城墙上的城门,全都是这样敲出来的;每张图在进入游戏之前,都要经过测试检查宽度和高度是否正确。
16×8的网格
一个地块宽16个字符、高8个字符,2:1的比例正适合3/4视角。一座占w×h格的建筑,宽度正好是16·w个字符。最下面的8·h行是底座,铺在它占的地块上;再往上的部分,比如屋顶、旗帜或炊烟,会探到后一格的上方。正是这种探出让街道有了纵深:一排房子的屋顶会遮住后面的一部分道路,就像经典的等距视角城市建造游戏那样。网格为什么长到这个尺寸,见从10×5到16×8。
从文字到光影
字符用WebGL2画在画布上。屏幕上出现的每个字形都会进入一张纹理图集,每一帧都从这张图集一次绘制完成。着色器补上了纯文本不可能有的东西:表面纹理、体积、光照,以及建筑和行人投在路面上的影子。没有WebGL2的地方,会由普通的Canvas渲染器把同一座城画得简单一些。
- 「密集」风格中的每个字符都会拆成更细的笔触,连小细节也有纹理
- 地面、道路和水面只画一次,存进缓存层;只有会动的东西才重画
- 夜里窗户、灯笼和火光会发亮,黄昏时灯笼一波波亮起
- 镜头拉远,招牌融成漆底上的一点金色;镜头拉近,上面的字清晰锐利
招牌上的真汉字
在招牌上,文字成了字面意义上的文字。二十八种建筑挂着真正的汉字招牌,用的是秦汉时期通行的繁体字形,漆底金字:集市上方是「市」,粮仓上方是「倉」,水井上是「井」,道观上是「廟」,盐铁官是「鹽鐵」,未央宫是「未央」。这些字来自一套只收录游戏所需汉字的小字库,大约14 KB。
为什么不直接用滤镜
把3D渲染转换成ASCII是个广为人知的技巧,效果也很抢眼。但按亮度挑出来的字符只是噪点,由人挑出来的字符才是画。一排瓦之所以看着像瓦,是因为有人把它当瓦来敲。把图保留成文字,还意味着城市随时都能以文字的形式呈现:按住`键「显示符号」,或者把画面存成.txt文件。
而且依然轻量
文字很紧凑。图很小,字库很小;低画质设置会退回较粗的10×5图样,并跳过夜景和特效,让游戏在老笔记本上也能玩。动起来的渲染效果可以在游戏短片里看到,它所属的游戏类型见类似《法老王》《凯撒大帝3》的游戏。
《字里乾坤》即将登陆Steam,支持Windows、macOS和Linux。欢迎观看游戏短片,关注开发历程,或查看媒体资料包。