Table of Contents

精灵字体

中级

**精灵字体(Sprite fonts)**以 TrueType 字体作为输入(系统字体或你指定的文件),然后为游戏创建字符(字形)的所有图像(精灵)。

直接渲染字体通常效率低下。我们一般希望只创建(光栅化)一次字体,之后每次需要时只渲染某个字母字符(例如 A、a、B、C 等)的图像。这需要创建该字符的精灵(面向摄像机的矩形图像),然后像普通图像一样显示在屏幕上。一个文本块就是一组以四边形渲染的精灵,使所有字符正确对齐和排列。

离线光栅化精灵字体

**离线光栅化(Offline-rasterized)**精灵字体在构建游戏资产时,创建(光栅化)特定大小的固定数量字符(字形),并将它们烘焙到图集纹理中。

在游戏中,它们只能以该大小绘制。只有你指定的字符可以显示。

何时使用离线光栅化字体

在以下情况使用离线光栅化字体:

  • 你在游戏中使用已知大小、已知字符集的字体

  • 你需要字体的抗锯齿效果

  • 你的 UI 仅在全屏模式下使用

在以下情况不要使用离线光栅化字体:

  • 你的 UI 作为 3D 世界场景的一部分渲染

  • 你的字体大小和字符集种类繁多或无法确定

离线光栅化精灵字体属性

media/fonts-1.png

属性 说明
Font Source 系统(本机已安装)或来自文件。系统字体还可以选择 Bold 和 Italic 选项。
Font Type Offline Rasterized
Size (in pixels) 字体以此大小烘焙。无法显示其他字体大小。
Character set (可选)包含所有需要烘焙字符的文本文件。
Character regions 需要烘焙的字符区域编码。例如,(32 - 127) 是足以覆盖 ASCII 字符集的区域。
Anti alias None、Grayscale 或 ClearType
Premultiply alpha 是否需要预乘。默认为是,以与引擎其余管线保持一致。
Default character 渲染缺失字符时默认使用的字符。默认代码为 32,即空格。

运行时光栅化精灵字体

运行时光栅化(Runtime-rasterized)精灵字体按需创建(光栅化)任意大小、数量不固定的字符(字形),并将其烘焙到图集纹理中。

当你更改字体大小或请求尚未绘制过的字符时,会在运行时调用此功能。

在底层,运行时光栅化字体使用的图集纹理与离线光栅化字体类似。这意味着如果你有三种不同的字体大小,它们占用的内存大约是单一字体大小的三倍。字体大小也会被纳入考虑。

何时使用运行时光栅化字体

在以下情况使用运行时光栅化字体:

  • 你需要多种字体大小,或不知道需要哪些字符

  • 字体中可能的字符数量远多于运行时需要显示的字符数量(例如日语或中文,使用数千个字符)

  • 你需要字体的抗锯齿效果

  • 你的 UI 仅在全屏模式下使用

在以下情况不要使用运行时光栅化字体:

  • 你的 UI 作为 3D 世界场景的一部分渲染

  • 对于小型字符集,你只需要一两种已知大小

  • 你的文本会缩放(因为运行时光栅化字体会为每一种字体大小重新创建)

运行时光栅化精灵字体属性

media/fonts-2.png

属性 说明
Font Source 系统(本机已安装)或来自文件。系统字体还可以选择 Bold 和 Italic 选项。
Font Type Runtime Rasterized
Default Size (in pixels) 未指定大小时,文本以此大小渲染。
Anti alias None、Grayscale 或 ClearType
Default character 渲染缺失字符时默认使用的字符。默认代码为 32,即空格。

有向距离场精灵字体

**有向距离场(Signed distance field,SDF)**字体使用一种完全不同的技术来渲染字体。它们不是在精灵上光栅化字符的颜色,而是输出当前像素到字形最近边缘的距离。

如果像素在字形边界内部,该距离为正;如果像素在字形外部,该距离为负(因此称为"有向")。

渲染时,检查该距离:若为正或 0 则输出白色像素,若为负则输出黑色像素。这样即使在放大时也能渲染出非常锐利、干净的边缘(而传统精灵在这种情况下会显得有锯齿)。

下图对比了放大时 SDF 字体与离线光栅化字体的效果:

media/fonts-5.png

何时使用 SDF 字体

在以下情况使用 SDF 字体:

  • 你的 UI 作为 3D 世界场景的一部分渲染或全屏渲染(SDF 在两种情况下都表现良好)

  • 你的文本会缩放,或预期用户能够放大查看

  • 你需要多种字体大小

  • 你有非常大的字体大小(SDF 比运行时光栅化字体占用更少内存)

在以下情况不要使用 SDF 字体:

  • 你需要字体的抗锯齿效果(SDF 字体目前不支持)

  • 对于小型字符集,你只需要一两种已知大小(最好使用离线光栅化字体)

  • 字体中可能的字符数量远多于运行时需要显示的字符数量(例如日语或中文,使用数千个字符)。如果运行时光栅化字体不是可行选项(例如因为需要缩放),请确保烘焙所有可能需要的字符,否则它们将无法显示。

SDF 属性

media/fonts-3.png

属性 说明
Font Source 系统(本机已安装)或来自文件。系统字体还可以选择 Bold 和 Italic 选项。
Font Type Signed Distance Field
Size (in pixels) 字体将以此大小烘焙。所有字体大小仍然可以显示。较大的大小通常带来更好的质量,通常建议保持在 20 或更高,以避免视觉故障。
Character set (可选)包含所有需要烘焙字符的文本文件。
Character regions 需要烘焙的字符区域编码。例如,(32 - 127) 是足以覆盖 ASCII 字符集的区域。
Default character 渲染缺失字符时默认使用的字符。默认代码为 32,即空格。

不同精灵字体的纹理图集

离线光栅化

media/fonts-6.png

离线光栅化精灵字体将所有请求的字符一次性烘焙到灰度纹理中。放大后你会发现它们是有锯齿的。字体大小固定,不适合缩放文本。

运行时光栅化

media/fonts-8.png

运行时光栅化精灵字体只烘焙(光栅化)游戏中实际绘制的字符。初始图集纹理特意设置得更大,以便在需要调整大小之前容纳更多可能大小不同的字符。

有向距离场

media/fonts-7.png

与离线光栅化精灵字体一样,有向距离场精灵字体也会一次性烘焙所有请求的字符。主要区别在于它编码的是到字符轮廓的距离而非实际颜色,并且使用了 RGB 三个通道。你仍然可以辨认出每个字符,但需要一个特殊的着色器才能正确渲染它们。好处是即使放大,边缘依然保持锐利。

延伸阅读