基于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

相关文章
相关标签/搜索