基於SDF渲染字體

18號字體html

18號字體.png

18號字體放大15倍算法

位圖字體_放大15倍.png

基於sdf渲染字體放大15倍緩存

矢量字體_放大15倍.png

相比常規的渲染方式,基於SDF渲染文字可無限放大並保持清晰,幾乎沒有開銷就可實現描邊,發光,抗鋸齒等效果.且它只須要很小的紋理緩存SDF信息便可.工具

所謂SDF(Signed-distance-field),就是將每一個像素存儲的顏色值換成距離文字輪廓最短距離,當像素在文字內,則用正數距離,在文字外則用負數距離,文字輪廓距離則是零,所以只要判斷像素若是是正數,就輸出顏色,不然丟棄顏色便可.字體

該技術由Valve開發半條命2時提出,當時主要用於渲染圖片,以後被普遍用於其餘技術中,用於渲染字體僅是其中一項.3d

相對比常規的渲染方式,除了片斷着色器的差異外,主要差異在於生成的紋理緩存.調試

常規渲染方式的紋理緩存大體以下:htm

一個紋理只存一個字號blog

fnt36.png

一個紋理存儲多個字號圖片

fnt_atlas.png

它們都有一個共同點:每一個像素存儲的信息都是顏色.而sdf每一個像素存儲的是距離,所以它能提供矢量信息.(怎麼存儲多個字體, 可查看合併圖集)

SDF紋理

sdf.png

SDF渲染字體在網上有不少資料,但我翻遍了百度,只找到一個可運行的文字SDF生成工具,在我反覆調試後,發現這個工具生成的SDF是錯的,無可奈何我只好花20分鐘重寫了一個,算法也簡單,無非就是暴搜+閥值控制,生成4096*4096的SDF,i7 7700k大概須要1分鐘.

描邊

描邊.png

內發光

內發光.png

外發光

外發光.png

效果

動態圖.gif

相關文章
相關標籤/搜索