编写 SDF 字体指南

发布: (2026年2月28日 GMT+8 02:24)
5 分钟阅读

Source: Hacker News

背景

早在 2024 年,我就开始尝试使用带符号距离场(SDF)来渲染字体,目标是在一次渲染中实现描边和阴影。 我为一款游戏和一个地图生成器做了一个原型,但我从未彻底弄清楚为什么有些方法能够成功,而另一些则会失败。 那段时间的笔记后来在 Google 搜索 “sdf fonts” 时位居前列 [1],这促使我决定写一篇系统的指南。

我收集了 22 页日记式的记录,描述了我尝试过的各种方法,还有一页未完成的 “概览” 页面,试图涵盖多个 SDF 字体库(msdfgen、stb_truetype、tiny‑sdf 等)。 该概览包含了代码片段、示意图以及每个库输出的截图。

Sketch of distance fields
Sketch of distance fields, created with Excalidraw [2]

首次概览尝试

原本的范围证明太大。我大部分时间都花在 msdfgen 上,缺乏对其他库的足够了解,无法写出连贯的指南。因此,我决定缩小重点。

重新设计 2 – 聚焦 msdfgen

我将指南限制在 msdfgen,同时仍然讨论诸如图集大小、抗锯齿宽度、着色器导数和平滑函数等权衡。为了说明这些概念,我创建了几张示意图:

字形边界示意图
布局算法示意图
从字体图集读取示意图
重新设计 2 的示意图,使用 Excalidraw 创建 [3]

我还进行了大量测试,以比较不同图集大小的影响,捕获了许多截图并记录了使用的命令。然而,重复我在早期博客文章中已经记录的相同测试工作()感觉有些冗余,于是我转而采用了其他方法。

重新设计 3 – 使用 JavaScript 和 GPU 实现的“操作指南”页面

新的方向是先展示概念,然后提供两种实现方式:

  1. CPU 渲染 使用 JavaScript。
  2. GPU 渲染 使用片段着色器。

我将图表刷新为更简洁的风格:

Cleaned up diagram of glyph bounds
Cleaned up diagram of layout algorithm
Cleaned up diagram of reading from font atlas
来自重新设计 3 的手绘 SVG 图表

虽然页面在推进,但仍显得过于技术化——充斥着 shell 命令和低层代码,只有我自己会觉得有用。

Redesign 4 – 概念聚焦页面

我去掉了实现细节,将指南的重点放在:

  • 使用 SDF 字体可以实现的视觉效果。
  • SDF 在底层是如何工作的。
  • 使用 SDF 创建这些效果的实用建议。

之前写的代码密集内容已移至另一个未完善的页面。我还添加了过去一年我的活动时间线:

我每日活跃度图表
过去一年中的工作,使用 Cal‑heatmap 生成 [4]

最终结果

在经过多次设计迭代后,我终于对页面感到满意。它现在作为一个简明、概念驱动的 SDF 字体指南,配有清晰的示意图和实用的建议,同时为需要的用户保留实现细节。

看看吧!

我希望搜索引擎最终能将用户引导至这个更有价值的资源。

0 浏览
Back to Blog

相关文章

阅读更多 »