Slug 算法:GPU 字体渲染,动态扩张与 MIT 许可开源
2016 年开发的 Slug 算法,支持从贝塞尔曲线直接在 GPU 上渲染字体和矢量图形,无需纹理图集。过去十年,它不断演进,关键升级为动态扩张,其专利现以 MIT 许可免费开放使用。
Slug 算法的演进
Slug 算法解决实时文本渲染的可靠、快速和高品质挑战。可靠意味着无丢失像素或伪影,性能确保即使在 2016 年级别的游戏机上 FPS 稳定,品质则提供任意缩放或视角下的平滑曲线和锐利边缘。
自 2017 年在 JCGT 发表以来,代码经历了多次优化:
- 移除条带分割优化,该优化虽加速大字形渲染,但导致着色器分歧并使数据量翻倍。
- 放弃自适应超采样,因为其优势仅在勉强可读的小文本上显现,而动态扩张能有效处理小尺寸锯齿。
- 重构多色表情渲染:用独立字形的边界多边形替换像素着色器循环,简化代码并提升性能。
这些改动精简了像素着色器,减少数据使用,并提升整体渲染效率。
动态扩张:自动优化
在引入动态扩张前,用户需手动设置固定偏移来扩展字形边界多边形。这会导致小尺寸锯齿伪影和大尺寸 GPU 资源浪费。动态扩张通过在顶点着色器中基于模型-视图-投影(MVP)矩阵和视口尺寸自动计算最优偏移,解决两者问题。
计算确保部分覆盖的像素中心落入多边形内,实现正确栅格化且无多余填充。公式源于视口空间半像素扩张,并以二次方程求解:
d = (s³t + s²√(u² + v²)) / (u² + v² - s²t²)
其中 s = m₃₀p_x + m₃₁p_y + m₃₃,t = m₃₀n̂_x + m₃₁n̂_y,u 和 v 来自 MVP 参数和法线的导数。正号表示沿单位法线向外的偏移。
为保持原始字形尺寸,使用逆 2×2 雅可比矩阵调整 mipmapped 表面的采样坐标,将偏移转换到对象空间。
专利释放与许可
2019 年,作者为 Slug 算法申请专利,但现以 MIT 许可无限制释放。开发者可无法律障碍集成到项目中。Slug 已获 Activision、Adobe 和 Ubisoft 等公司许可,用于游戏、科学可视化、CAD 等,证明其实战价值。
关键要点
- Slug 从贝塞尔曲线直接在 GPU 渲染字体和矢量图形,实现可靠、快速和顶级品质。
- 动态扩张自动优化边界多边形扩张,消除伪影和资源浪费。
- 算法演进:移除条带分割和超采样,简化表情渲染。
- Slug 专利现以 MIT 许可免费用于商业和开源项目。
- 已在游戏、科学可视化、CAD 等领域经受实战考验。
— Editorial Team
暂无评论。