本篇文章更新時間:2026/03/18
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持 。
內容目錄
Slug 演算法的十年:從高品質字型渲染到公開專利的重大里程碑
編輯前言:這篇文章出自 Eric Lengyel 的原文 A Decade of Slug。Slug 是近十年最具代表性的 GPU 字型渲染技術之一,這篇十週年回顧不只談演算法的演進,更宣布了一個相當震撼的決定:原始專利正式進入公領域。
核心觀點 (Key Takeaways)
- Slug 演算法自 2016 年問世以來,已成為遊戲與專業圖形軟體的標準解法之一。
- 基礎的 winding number、根判定等核心方法並未大改,但周邊優化經過大量調整與簡化。
- 最大變革是加入 dynamic dilation(動態膨脹),自動解決邊界抗鋸齒與效率問題。
- 作者宣布:Slug 專利已正式捐入公領域,任何人都可以免費實作。
深入解析
原文作者 Eric Lengyel 在 2016 年打造 Slug 演算法,是為了在遊戲引擎中直接從 Bézier 曲線在 GPU 上渲染字型,而不依賴預先生成的貼圖。這件事難度在於:
- 如何避免浮點誤差造成的「掉像素、亮點、破線」等 artifacts
- 如何讓畫面在 PS4、Xbox One 世代的效能下仍保持高速
- 如何維持任意縮放、遠近、角度下的清晰度
原文提到 Slug 使用的核心原理至今仍然穩固。這使得 Slug 能在 Activision、Blizzard、id Software、Adobe 等公司廣泛落地,甚至被應用在科學視覺化、CAD、醫療設備與天文館等領域。
作者說:「Slug turned out to be the most successful software product I’ve ever made.」
接下來的內容則重點回顧 2017 後的重要改動與優化。
- 移除 band split optimization:原本在大字型上能提升性能,但代價是 shader 變複雜,且對小字型反而可能拖慢。移除後資料量也能減半。
- 移除 supersampling:原本用於非常小的文字,但效益有限;加入 dynamic dilation 後更顯多餘,移除後 shader 更簡潔。
- 多色 Emoji 不再使用單個 shader loop:改成每層 glyph 分開畫,雖加大 vertex 資料,但效能更高、邏輯更乾淨。
Dynamic Dilation(動態膨脹):演算法的重大突破
這篇文章的重點無疑是 dynamic dilation。原本 Slug 需要使用者手動選擇一個「膨脹距離」,確保所有部分遮蓋的像素都能被 rasterizer 捕捉到。這造成兩個問題:
- 距離設太小:小字型出現鋸齒或邊界抖動
- 距離設太大:大字型浪費大量 GPU 工作區域
動態膨脹的核心精神是:
- 以目前的 MVP matrix 與 viewport 尺寸
- 讓 shader 自動計算每個頂點「剛好需要往外推多少」才能確保半個像素的安全邊界
- 這個距離每個頂點都可能不同,特別是在透視投影下
作者在文中也首次公開完整推導,從 MVP、透視除法、viewport scaling 一路導出可用於 shader 的二次方程式,最後取得:
- 往外移動多少距離 d
- 如何用逆 Jacobian 調整 em-space
這部分數學細節較長,但我認為象徵著 Slug 從「實務上的最佳解」上升到可被其他開發者完全重現的工程方法。
筆者心得與啟發
讀完這篇文章,我最大的感受是:Slug 的成功不僅因為演算法本身,而是多年來的「持續簡化」。多數渲染技術的演進會越來越複雜,但 Slug 卻反其道而行,不斷移除 supersampling、移除 band split、移除不必要的 shader 迴圈。
動態膨脹的加入更像是將這一切推向極致:
- 手動調整的參數不再需要
- Shader 自動推算最佳值
- 這代表 Slug 的「使用成本」被降到最低
最後,作者宣布專利公開,這點真的非常罕見。對許多想自製矢量字型渲染、希望避免 SDF 缺點、或正在打造 UI 系統的人來說,這幾乎是直接打開了一扇新的大門。
如果你從事遊戲開發、字型技術、UI 系統或需要高品質向量渲染的任何工作,我非常推薦你去看看作者提供的 GitHub shader 參考實作。這或許會成為新一代字型渲染的基礎。
來源:
- 原文:A Decade of Slug
- Journal of Computer Graphics Techniques, 2017.
- Dynamic Glyph Dilation blog post, 2019.
- Slug Algorithm Reference Shaders on GitHub.
