(摘要:這是一篇關於撰寫我的 SDF 字體指南過程的部落格文章。)

早在2024年,我開始接觸 SDF(簽名距離場)字體渲染技術。當時我嘗試在單次渲染中實現字體描邊和陰影效果,而不是多次以不同樣式重疊繪製文字。我計劃將這些字體用於兩個不同的專案:一款遊戲和一個地圖生成器。雖然我成功讓功能運作,但並未完全理解為何某些方法有效或失效。我在網站上寫下一些嘗試的筆記。最後,由於停止開發遊戲字體和地圖生成器,這些工作也暫時擱置。

時間快轉到2025年底,我那份不完整的筆記偶爾會出現在「sdf fonts」搜尋結果的首頁!這顯然不是該主題最好的頁面。理應指向函式庫文件或相關研究論文才對,而我的頁面並不優秀。

起初我以為「搜尋引擎正在衰退」,但後來決定「這是個機會」。我決心打造一個值得成為搜尋結果首位的頁面。

我先檢視自己所有的筆記。原本已開始撰寫一個「概覽」頁面,但進度不多。此外,我還有22篇以日記形式記錄的頁面,內容偏向我做了什麼,而非讀者應該知道什麼。

概覽頁涵蓋如何使用各種 SDF 字體函式庫(如 msdfgen、stb_truetype、tiny-sdf 等)。我為多個函式庫撰寫程式碼,繪製了多張概念圖,並截取各函式庫輸出結果的螢幕截圖。

某時我意識到範圍太大了。我花最多時間在 msdfgen 上,對其他函式庫了解不足,無法寫出完整指南。它們的運作方式各異,讓我屢屢卡關。於是我縮小範圍。在第二次重設計中,我決定只使用 msdfgen,並展示各種取捨(如圖集大小、抗鋸齒寬度、著色器導數、平滑函數)。

我製作了多張概念圖,並開始進行測試。我想比較圖集大小的影響,拍了大量截圖並仔細觀察,希望能提出具體尺寸建議,也想對其他參數提出建議,並展示所有執行的指令。

後來我發現測試可以無止盡地進行,而我去年已做過類似測試並寫成兩篇部落格文章(第一篇與第二篇)。在此重複似乎價值不大。於是我轉向撰寫「如何做」的頁面。在第三次重設計中,我決定先介紹概念,再用 JavaScript 實作 CPU 渲染,最後展示 GPU 渲染實作。我也重新繪製了概念圖。

雖然頁面有進展,但感覺不像 Red Blob Games 的風格。頁面一開始充滿大量 shell 指令與程式碼,看起來只有我自己會覺得有用。於是我重新開始,設計一個「概念」頁面。在第四次重設計中,我專注於想要達成的效果、SDF 的運作原理,以及如何利用它來創造這些效果。我再次縮小範圍,移除實作細節,將已寫內容移至另一個未完善的頁面,且未撰寫原本想做的獨立可下載專案。

有時候,我需要花很長時間才能釐清真正想寫什麼,然後一切才會順利展開:

我終於對這個頁面感到滿意。歡迎大家看看!希望搜尋引擎未來能將它列為首選。