概念页
文本渲染
Text Rendering
文本中一个像素的变化就可能把 "l" 变成 "1",因此字形渲染格外讲究。主要路线有:按字号预生成字形位图纹理(配合微调和子像素渲染)、有符号距离场纹理(可在三维表面任意缩放旋转)、以及在 GPU 上直接求值字形曲线。
子像素渲染(15.5 节)
- 人眼对亮度差异比对颜色差异更敏感。LCD 每个像素由红、绿、蓝三个竖直子像素组成,忽略颜色时横向分辨率是像素数的三倍;用不同色调点亮不同子像素即子像素渲染,眼睛会把红蓝色边融合掉。
- 典型代表是微软 ClearType(1998 年发布,对大尺寸低 DPI 显示器帮助很大)。Word 2013 停用,显然是因为文字与不同背景色混合时出现问题;Excel、多个浏览器、Adobe CoolType、Apple Quartz 2D、FreeType、SubLCD 等仍在使用。
字形位图纹理与微调
- 字形 (glyph) 通常由线段和二次或三次 Bézier 曲线描述。FreeType、Anti-Grain Geometry 为每个字形生成小纹理并复用,每种字号和粗斜体各一套。
- 这些系统假设纹理与像素对齐(一纹素一像素)。贴到三维表面、缩放或旋转都会破坏这一假设;即使屏幕对齐也可能没考虑微调 (hinting)——调整字形轮廓以对齐像素格,例如一纹素宽的 "I" 竖笔最好正好覆盖一列像素而不是各覆盖两列一半。因此位图纹理可能模糊或混叠。Rougier 展示了在 OpenGL 字形系统中使用 FreeType 微调。
- Pathfinder 库用 GPU 生成字形:设置时间短、内存少,性能超过 CPU 引擎;用曲面细分和计算着色器累加曲线对每个像素的影响,能力较弱的 GPU 回退到几何着色器或 OpenCL,字形同样缓存复用。高质量抗锯齿加上高密度屏幕让微调几乎过时。
有符号距离场字体
- Green 提出、首先用于 Valve《军团要塞 2》的方法:基于 Frisken 等的采样距离场,每个纹素存到字形最近边的有符号距离,双线性插值即可很好地近似每个采样点的 alpha 覆盖率,能在任意表面、任意大小与朝向下渲染文字,且无需复杂 GPU 支持。
- 把某个距离区间映射到描边颜色即可得到文字外框。
- 坑:双线性插值会磨圆尖角,可在四个通道中编码更多距离值保留尖角;距离场纹理生成耗时,必须预计算存储。许多字体库基于此技术,在移动设备上也适用。Reshetov 与 Luebke 给出在放大时调整采样纹理坐标的方案。
直接求值字形曲线
- 中文等语言需要成千上万个字形,高质量大字需要更大纹理,斜视时还要各向异性过滤。直接用边和曲线描述渲染可避免任意大的纹理和采样网格伪影。
- Loop-Blinn 方法在像素着色器中直接求值 Bézier 曲线,但需要曲面细分步骤,加载时开销可能较大;Dobbie 为每个字符画一个包围盒矩形,在一遍中求值全部轮廓;Lengyel 给出稳健的"点是否在字形内"判定(避免伪影的关键),并讨论优化及辉光、投影、多色(如 emoji)等效果。
| 方案 | 优点 | 缺点 |
|---|---|---|
| 字形位图纹理 | 简单、流行,可配合微调与子像素渲染 | 假设一纹素一像素,缩放旋转后模糊或混叠;大字库占内存 |
| 有符号距离场 | 任意缩放旋转仍抗锯齿,易做描边 | 尖角变圆,需预计算 |
| GPU 曲线求值 | 无纹理尺寸限制,无采样伪影 | 实现复杂,需稳健的内外判定或细分 |
GEA 的视角:游戏引擎的文字与字体系统(卷 II 12.8.0.1)
- 文字系统通常实现为一种特殊的二维(有时三维)覆盖层,核心是按各种朝向在屏幕上显示与字符串对应的字形序列(卷 II 12.8.0.1,覆盖层见 覆盖层与用户界面渲染)。
- 字形图集 (glyph atlas):字体常实现为一张包含所需字形的纹理,通常只有 alpha 通道,每个像素存被字形内部覆盖的比例。字体描述文件给出每个字形在纹理中的包围盒,以及字距 (kerning)、基线偏移等排版信息。画一个字形就是画一个四边形, 对应图集中该字形的包围盒;alpha 来自纹理,颜色单独指定,所以同一张图集能画任意颜色的字。
- FreeType:能读取 TrueType (TTF)、OpenType (OTF) 等多种格式,按任意字号用字形的 Bézier 轮廓把字形渲染到内存像素图,结果很精确。实时游戏通常用它预先把需要的字形渲染进图集,每帧当作纹理画四边形;把 FreeType 或类似库嵌进引擎,还可以按需在运行时往图集里补字形,这对中文、韩文这类字形数量极大的语言很有用。本页「字形位图纹理与微调」一节的 RTR4 视角提到同样的复用机制,并指出它假设一纹素一像素。
- 有符号距离场:像素存从像素中心到字形最近边的有符号距离,像素着色器用距离算出精确的 alpha,在任意距离和视角下都平滑。最新版 FreeType 支持把字形光栅化为有符号距离场。GEA 推荐 Konstantin Käfer 的 "Drawing Text with Signed Distance Fields in Mapbox GL" 和 Valve Chris Green 的 "Improved Alpha-Tested Magnification for Vector Textures and Special Effects"。
- 注意:GEA 说 SDF 字体"在任意距离和视角下都平滑",但单通道 SDF 在高倍放大时会把尖角磨圆(Green 2007 原文即提到需要额外通道保持锐角;Viktor Chlumský 2015 硕士论文《Shape Decomposition for Multi-channel Distance Fields》/msdfgen 用多通道 SDF 解决),所以"任意距离"应理解为一定放大范围内。
- 符号约定:GEA 明确规定字形内部距离为负、外部为正;本页上文 RTR4 部分只说"有符号距离",没有规定正负号。
- 直接渲染轮廓:Terathon Software 的 Slug 库在 GPU 上基于 Bézier 轮廓渲染字形,使这种做法能用于实时游戏,对应本页「直接求值字形曲线」一节。
- 排版 (shaping):好的文字系统要考虑不同语言的字符集和书写方向。排列字符串中的字符叫 shaping:按语言从左到右或从右到左排列、对齐到共同基线;字距一部分来自字体作者存进字体文件的度量,一部分来自上下文相关的 kerning 规则(本地化见 游戏本地化与 Unicode)。
- 文字动画等"好玩的功能"只在游戏真正需要时才实现。
出处
- realtime_rendering_4ed.pdf 第 15 章 Non-Photorealistic Rendering
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.8.0.1 节
相关页面
图形学抗锯齿Antialiasing渲染本质上是采样,采样频率不足就会混叠(锯齿、闪烁的"萤火虫"、车轮倒转)。屏幕空间抗锯齿在每个像素取多个样本并加权求和:超采样最直接但最贵,MSAA 每像素只着色一次,时间抗锯齿 (TAA) 把样本分散到多帧,形态学方法 (FXAA/SMAA) 作为后处理重建边缘。没有一种方法在所有方面最好。图形学纹理过滤与 MipmapTexture Filtering & Mipmap纹理在屏幕上被放大时需要插值,被缩小时一个像素覆盖许多纹素,必须预先滤波才能避免混叠。放大用最近邻、双线性或双三次;缩小的主流方案是 mipmap + 三线性插值,斜视角下用各向异性过滤减少过度模糊。注意:过滤纹理值只在输入与着色结果线性相关时等价于过滤最终颜色。图形学计算着色器Compute Shader计算着色器是 DirectX 11 引入的一种 GPU 计算方式:它不固定在图形管线的某个位置,但由图形 API 调用,和其他着色器共用统一着色器核心。它暴露了线程组和组内共享内存,最大的优势是能直接处理 GPU 上生成的数据,不用来回传给 CPU。图形学公告板Billboarding公告板是根据视线方向调整朝向的带纹理矩形。配合 alpha 纹理和动画,它能表现草、烟、火、雾、爆炸、能量护盾、尾迹、云等没有光滑实体表面的现象。各类公告板的区别只在于固定哪个向量(法线或上方向);软粒子、球形公告板解决与实体相交和穿过近平面的问题,轴向公告板用于树木、激光等柱对称物体(RTR4 13.6–13.6.3 节)。游戏数学贝塞尔曲线Bézier Curves参数曲线 \mathbf{p}(t) 用参数 t 生成连续的点,实时图形中常用于让相机或物体沿预定路径移动(与帧率无关),也用于渲染头发和字体。贝塞尔曲线由反复线性插值(de Casteljau 算法)得到,等价于 Bernstein 多项式加权控制点;多段拼接时要关注 C^n / G^n 连续性。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。图形学隐式曲面与有符号距离函数Implicit Surfaces & Signed Distance Functions隐式曲面用 f(\mathbf{p})=0 定义:代入点结果为零即在曲面上。返回到最近表面有符号距离的 f 称为有符号距离函数 (SDF)。它们便于做光线求交、构造实体几何 (CSG)、混合与变形,通常用光线步进可视化,也可用移动立方体等方法转为三角形。游戏开发 · UE5本地化LocalizationUE 的本地化以 FText 类型为中心,国际化(数字、日期、复数规则、文化回退)依赖 ICU 库。可本地化的文本由命名空间、键、源字符串三部分标识;本地化管线按目标 (Localization Target) 依次收集 (Gather) 到 manifest、翻译进各文化的 archive(通常经 PO 文件导出导入)、编译成运行时加载的 .locres。Localization Dashboard 是管理这条管线的推荐工具。游戏开发游戏本地化与 UnicodeGame Localization & Unicode本地化(国际化,I18N)是把软件改编为其他语言版本,最好从第一天起规划并贯穿每个开发步骤。GEA 介绍了 Unicode 与 UTF-32/UTF-8/UTF-16/UCS-2 编码、char 与 wchart、Windows 的字符串 API 约定、主机上的选择,字符串之外的本地化问题,以及核心基础设施——字符串数据库 + 按 ID 查找当前语言字符串的运行时函数,并以 Naughty Dog 的本地化工具为例。图形学覆盖层与用户界面渲染Overlays & User Interface RenderingHUD、武器选择界面、各种菜单等图形用户界面,加上调试绘制,都在主 3D 场景渲染完之后才画,所以统称覆盖层 (overlay)。它们一般关闭深度测试、用屏幕空间四边形和正交投影绘制,由文字、位图、嵌入视频和矢量图形几类二维图元组成(GEA4 卷 II 12.8)。