文字看似簡單,直到你必須自己繪製它。字母不是圖片,而是一組輪廓:由封閉的直線和貝茲曲線組成的閉合環,根據繞行規則填充。用 CPU 將其繪製成位圖是已解決的問題,但在 GPU 上以清晰、任意大小、任意 3D 變換下繪製,且文字每幀都在變化,則是挑戰。大多數引擎透過預先將字形烘焙到紋理中來迴避困難,並接受妥協。

2017 年,Eric Lengyel 發表了名為 Slug 的演算法,直接在片段著色器中從字形輪廓渲染字形,無需紋理圖集或每幀細分。Lengyel 於 2019 年申請專利,並於 2026 年 3 月 17 日將該專利釋出至公有領域。因此,我們開發了 Slughorn,一個基於 Slug 技術的 C++20 實作,並開始公開討論其運作原理與優勢。

本文將帶你了解 GPU 文字渲染的各種方法,從位圖圖集到 Slug,並說明每種方法的適用範圍。

每個可縮放字型都將字形以向量輪廓儲存。TrueType 使用二次貝茲曲線,OpenType(CFF)使用三次曲線,兩者皆混合直線段。字母內部由填充規則決定,通常是非零繞行規則:從像素射出一條射線,計算輪廓穿越次數,繞行數非零即表示該像素在字形內部。

字形是一組輪廓,而非像素:實心點為曲線上的點,空心圓為貝茲控制點。

渲染器必須同時快速完成三件事:正確填充內部、產生乾淨的抗鋸齒邊緣,並保持銳利,不論字形是菜單中 8 像素高,還是填滿螢幕的透視廣告牌。在 CPU 上,你只需在目標大小下光柵化一次字形即可完成;但在 GPU 上,你希望每幀繪製數千字形,且可任意縮放,理想狀況是不需重新光柵化。這正是以下各技術取捨的關鍵。

最古老且仍最常見的方法是:將每個字形在固定大小下光柵化到共享紋理圖集,然後以紋理四邊形繪製螢幕上的字元,從對應圖集區塊取樣。

此法快速、易移植,且可在任何有紋理單元的硬體上運行,因此廣泛使用。

問題在於縮放時顯現。放大超過烘焙大小會模糊或像素化,因為放大的是位圖;縮小則會產生閃爍和斷裂,除非烘焙多層級細節(mipmaps)。每個清晰尺寸都需一個圖集。每種語言也是問題:拉丁字母圖集小,但中文、日文、韓文有數萬字形,烘焙多尺寸圖集會造成記憶體災難。且位圖無法感知透視,文字貼在 3D 表面時會顯得模糊。

Valve 提出解決方案,成為業界十年標準。Chris Green 於 2007 年 SIGGRAPH 發表的「改良的向量紋理與特效的 alpha 測試放大」方法,儲存的是簽名距離場(SDF):每個像素儲存到最近邊緣的距離,內部為正,外部為負。著色器取樣該場並以零為閾值。距離場平滑插值,故可大幅放大小尺寸 SDF 紋理仍保持邊緣清晰,並可透過軟化閾值實現廉價抗鋸齒。

一個小紋理,解析度在合理範圍內獨立,一個廉價著色器。長期以來是清晰 UI 文字與遊戲 HUD 的預設,且仍適用於資源有限硬體。

但 SDF 仍是固定解析度的烘焙紋理,且在銳角處表現不佳。銳角是距離場的不連續點,雙線性插值會使其圓滑。字母的每個尖角,如「A」的尖端、「K」的缺口,都會被軟化。放大過度或字形過小,距離場寬度僅數像素時,細線會斷裂,細節模糊。

Viktor Chlumsky 於 2015 年論文及 2018 年「多通道簽名距離場改良銳角」中提出解決方案。MSDF 不只一個距離通道,而是三個通道(紅、綠、藍),分別編碼到不同邊緣子集的距離,確保銳角得以保留。著色器取三通道中位數,重建銳角幾乎完美,故 MSDF 字形在放大時仍保持銳利,而 SDF 則會模糊。

MSDF 是許多團隊的現行最佳選擇,且 Chlumsky 的 msdfgen 採用 MIT 授權,廣泛使用。若需清晰可縮放文字且願意烘焙圖集,MSDF 是極佳方案。

但它仍是圖集,帶來相應成本。每個字形需預先烘焙指定解析度,動態或用戶輸入文字,以及龐大字形集(如 CJK)仍需烘焙流程與記憶體預算。生成成本高於單通道 SDF。極小尺寸下仍取樣不足,極端縮小時仍有鋸齒。三通道取樣比單通道耗費更多頻寬。MSDF 提升品質上限,但仍受限於圖集。

另一類方法完全跳過紋理,將輪廓轉成 GPU 可光柵化的幾何圖形。

此類方法真正解析度獨立,對動畫向量圖形常是最佳選擇。Rive 專為可動藝術品設計。缺點是細分成本高,複雜字形幾何體積大,難以實現乾淨的解析抗鋸齒,且有時依賴特定硬體功能或擴充。

細分方法將輪廓轉為 GPU 光柵化的三角形。

Slug 跳過圖集與每幀細分,將字形以二次貝茲曲線與線段列表存於小型 GPU 緩衝區。並建立輕量級加速結構,將字形分割為水平帶,讓每像素只需考慮附近少數曲線,非整個輪廓。

接著在片段著色器中直接計算覆蓋率。對每像素射出射線,找出與附近貝茲曲線的交點,計算繞行數以得覆蓋率。關鍵是 Lengyel 所稱的「根資格」測試:精確判定哪些曲線與射線交點應計入,確保在曲線端點處繞行數精確,避免裂縫或重複計數。著色器解析曲線方程式而非取樣烘焙場,故能在任意比例產生精確覆蓋與乾淨抗鋸齒。

Slug 核心理念:每像素射出射線,計算穿越輪廓次數。

無烘焙解析度限制,同一字形在 6 像素或 6000 像素下皆銳利,且在任意 2D、3D 變換(含透視)下保持銳利,因為覆蓋率在變換後逐像素計算。無圖集,故數十萬 CJK 字形只需字型大小的輪廓資料,而非巨大多尺寸圖集。文字可每幀變化,無需烘焙,適合即時資料、用戶輸入與本地化內容。且全在單次繪製與普通片段著色器中完成,無需廠商擴充。

此法對無法預測文字觀看方式的場景至關重要。圖集、SDF、MSDF 須預先烘焙固定解析度,隱含螢幕尺寸與視角範圍有限。當文字平面與相機關係未知,如自由 3D 攝影機、任意縮放、特寫或斜視角,烘焙近似失效:放大超過烘焙解析度時,圖集模糊,SDF 與 MSDF 圓滑模糊,斜視角取樣場會產生鋸齒。無法預先配置足夠解析度以涵蓋所有視角,否則儲存爆炸。Slug 於變換後逐像素解析覆蓋率,無論距離、角度皆精確,無烘焙限制。細分方法亦具此特性,但成本高且抗鋸齒難。故 Slughorn 適用於互動 3D、AR/VR、飛行穿越、動態 HUD、CAD 與數位雙胞胎導航等場景,無法預先決定觀看距離與角度。

我們用 Slughorn(osgSlug 整合)與其他方法比較同一大寫 R 字形:單通道 SDF、MSDF、Rive 渲染器、osgText 位圖及其衍生 SDF。所有紋理面板均用 64 像素/em 預算,差異在技術非解析度。

正視烘焙大小時,六者中五者幾乎相同:Slughorn、Rive 與 MSDF 完美重現輪廓,單通道 SDF 僅在腳部角落略圓滑。例外是 osgText 位圖,64 px/em 放大約四倍,細節無法恢復。

傾斜透視時,情況改變。

斜視角下,Slughorn 與三個距離場面板保持 R 字清晰,因為覆蓋率在字形平面內逐像素計算,投影不影響。osgText 位圖隨距離模糊。Rive R 字形狀錯誤:其渲染器僅接受 2D 仿射變換,透視非仿射,故只能近似中心正確,邊緣偏移。

極端放大時,僅曲線基渲染器 Slughorn 與 Rive 仍產生直且清晰邊緣,因為兩者皆從實際輪廓渲染(Rive 每幀重新細分)。距離場面板出現缺口,因插值不符真實曲線。osgText 位圖已溶解成灰色漸層,因每像素覆蓋大面積。

公平說明:所有紋理方法均用 64 像素/em,增加解析度可減輕瑕疵但無法消除。SDF 與 MSDF 使用預設烘焙設定,MSDF 的錯誤修正可軟化最後圖像缺口。Rive 以最佳狀態呈現,透過攝影機每幀渲染,比常見嵌入 3D 場景中先渲染至紋理再貼圖更優,後者避免變形但模糊如位圖。

淡綠色標記 Slug 為最佳或並列最佳選擇。

沒有單一贏家,每種工具各有適用。

我們持續稱之為文字,因 Slug 以文字聞名,但 Slughorn 可繪製任何填充與描邊的向量幾何,來自任一後端。這意味著完整 SVG,含漸層、分層著色器及動畫,且可在地圖製圖尺度下保持清晰度與解析度,超越預烘焙方法。更多功能將陸續展示。未提及功能請參考 Slughorn GitHub 倉庫。

Slughorn 是我們基於現代 C++20 的 Slug 技術實作。它在建置時完成繁重工作,無需執行時細分:輪廓資料與帶狀結構預先準備,著色器僅評估覆蓋率。雖以文字聞名,Slughorn 不特別對待字形:字形只是常用形狀。任何向量路徑皆透過相同管線渲染,品質一致。支援常用格式,包括 SVG、FreeType 字型及 Blend2D、Cairo、Skia 路徑,並提供原生 Canvas 風格 API 供直接創建形狀,填充、描邊與漸層合成單一 GPU 就緒輪廓資料圖集。目標平台涵蓋 OpenGL、Vulkan、WebGPU 與 DirectX,並附帶 Python 綁定,適用於嵌入式 HUD 到完整 3D 場景。

功歸原主:Slug 演算法由 Eric Lengyel 發表於《計算機圖形技術期刊》,自 2026 年 3 月起免費實作。我們認為它是 GPU 上正確、解析度獨立文字的正確基礎,Slughorn 則是我們讓其易用的實現。

紋理圖集將字形烘焙成位圖,放大超過烘焙大小即模糊。SDF 儲存到邊緣距離,縮放較佳但銳角圓滑。MSDF 增加通道保銳角,但仍是固定解析度烘焙圖集。Slug 不用圖集,直接在著色器中從字形貝茲輪廓計算覆蓋率,任意大小角度皆精確。

大多數引擎使用預烘焙位圖圖集繪製文字。放大超過烘焙解析度、透視傾斜或貼附曲面時,固定像素網格被拉伸,邊緣變軟。基於輪廓的方法如 Slug 避免此問題,因為覆蓋率在變換後逐像素計算。

Slug 是 Eric Lengyel 於 2017 年發表的技術,直接從二次貝茲輪廓在 GPU 上渲染字形,無需紋理圖集與每幀細分。片段著色器每像素射出射線,計算曲線交點數以獲得精確覆蓋率,使用 Lengyel 的「根資格」測試確保曲線端點處正確。

是的,Lengyel 於 2026 年 3 月將 Slug 專利釋出公有領域,任何人皆可實作。AlphaPixel 的 Slughorn 是其 C++20、MIT 授權實作。

若可預先烘焙圖集,文字較靜態,且需一個廉價著色器跨多硬體,MSDF 是遊戲 HUD 與應用 UI 的強力預設。Slug 適合文字需任意比例與角度保持銳利、字形集龐大或動態,或攝影機關係無界限時。

是的,且無圖集記憶體爆炸。Slug 儲存輪廓資料而非烘焙位圖,數萬 CJK 字形只需字型大小的曲線資料,非巨大多尺寸紋理。Slughorn 中每字形帶狀結構增加中等開銷,仍遠低於 CJK 圖集。

Slug 是演算法(Lengyel 的);Slughorn 是 AlphaPixel 實作。Slughorn 支援任何 GPU API(OpenGL、Vulkan、WebGPU、Direct3D),繪製任意填充與描邊向量幾何,不只文字。

告訴我們你正在開發什麼、卡在哪裡,我們會直言是否能協助及建議方案。

SDF、MSDF 與 Slug:GPU 文字渲染技術解析SDF、MSDF 與 Slug:GPU 文字渲染技術解析SDF、MSDF 與 Slug:GPU 文字渲染技術解析SDF、MSDF 與 Slug:GPU 文字渲染技術解析SDF、MSDF 與 Slug:GPU 文字渲染技術解析SDF、MSDF 與 Slug:GPU 文字渲染技術解析