distance font rendering

使用bitmap font 时有一个缺陷就是在字体缩放时, 会显示出明显的锯齿. 所以, 通常会为某种字体创建诸如 small ,normal ,big 等不同大小的字体以应对不同的缩放区间.

这样会造成巨大的内存开销.  value 的论文 http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf 中提到一种

scale friendly 的方法, 实现的结果如下.

实现方法:

1. 使用freetype,或者windows gdi 创建字符的位图. 这里用了super-sample. 对于基准20高度的字体, 使用20 X SuperSampleScale 的字体来创建位图. 在上图中是以20 X 4 来创建的.

2. 针对每个字符的位图, 转换并down scale 到signed distance field. 这里要注意的是, 通常在bitmap-font 中我们总以字符位图的最小包围盒来存储并渲染字符. 可是对于distance field, 必须

在字符的包围盒外围进行较大的扩展. 比如 ‘A‘ 的位图大小是16X20, 那么对于创建Distance Field而言, 我们得扩展到 (16+PaddingX*2) *(20 +PaddingY*2), 然后将字符位图放入到中间位置后进行

distance 计算. 否则纹理采样中, 会应为线性过滤导致字符的边缘跨入到相邻字符上.

3. 将down scale 后的distance 转换为位图, 打包存储.

基本上现在google出来的文章中提到的都是对一整张打包后的Bitmap进行处理,比如:

  https://github.com/libgdx/libgdx/wiki/Distance-field-fonts

https://crimild.wordpress.com/2013/09/01/improving-text-rendering-with-signed-distance-fields/

  https://www.mapbox.com/blog/text-signed-distance-fields/

这种方式我觉得有问题, 它要求字符在atlas 中排列得非常稀疏, 并且小心地指定一个扫描半径, 以保证在某个字符的区域内, distance 不会受其它字符的影响.

上图中, 由于排列和扫描半径的问题, 导致在A字符包围区的像素, 红线标记区域, 其distance 所计算的最近边缘可能位于G字符上. 在渲染的时候将会出现不正确的结果.

调整扫描半径和padding 后的处理结果.

  • . singed distance field font 在放大的时候具有较好的效果, 但是在字体缩小时会非常难看.
  • 关于smoothstep .
smoothstep(0.5 - SmoothBais, 0.5 + SmoothBais, Distance);

SmoothBais 的值会严重影响最终渲染质量. 我最后选择了 FontHeight / TextureSize . SmoothBais 是一个跟随纹理大小,采样模式较为敏感的数据, 或许用ddx ddy 会更好.

WIP:

  • render quality.
  • glow & shadow.
时间: 2025-01-15 22:24:53

distance font rendering的相关文章

什么是字体渲染(Font Rendering)?

一.概述 理想中的文字指的是使用矢量图形描述出来的形状. 栅格化(Rasterization)指的是将矢量转化为像素. 三种渲染策略(Rendering Strategies) 初代:黑白渲染(black-and-white rendering) 二代:灰度渲染(Grayscale rendering) 三代:亚像素渲染(Subpixel rendering) Windows系统拥有两套图形渲染接口:GDI(图形设备接口Graphics Device Interface)与DirectWrite

Bad font rendering in Linux

Sometimes aliased/jagged fonts still exist after post-installation configuration. Following instructions may help to get them fixed to make characters in your applications looks nicer. 1. Open ~/.fonts.conf (create one if not exists) 2. Add following

Icon Font浅谈

这周继续在弄hybird app 的 UI框架的重构,进行到了编写换肤功能的阶段,而在做换肤之前,我想应该先弄一套框架内置的图标. 而图标无非就是两种做法: 1.图片 使用图片很正常,但是有缺陷的. 1.众多的图标导致了增加了许多HTTP请求 PS:有人会说我把它们弄成一张大图不久行了,可是这样弄了之后,你连大小都无法改变.所以肯定还是一批小图片. 2.放大缩小失真 3.同张图片如果需要不同颜色,又得弄多一套出来. 2.字体 也就是这篇要说得Icon Font.做法就是讲你的图标做成字符,然后用

Icon font font face

font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6: http://www.qianduan.net/zai-shuo-iconfont-he-font-face.html webkit下可以做渐变: margin: 0 0 0 50px; font-size: 50px; font-family: 'HelveticaNeue-Light', 'Hel

字体缩放 SignedDistanceField

Unity中如果使用位图字体,在缩放较大的情况下,字体失真严重,使用矢量字体可能会存在内存过大的情况. Signed Distance Field Font Rendering将字体保存在图片内,但是图片存储的并不是像素,而是距离,再通过特定的shader去还原图片,得到字体. 字体border的像素值接近0.5,Alpha接近0.5,通过对Alpha的操作进行描边等行为. SDF字体的制作可以通过工具转换 http://crazylights.cnblogs.com/

Jquyer相册

点击图片然后弹出相册列表,效果如下: html代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta

@font-face使用

转自http://www.tuicool.com/articles/QVf6nei 一.webfont与@font-face 什么是webfont web font,又称之为 在线字体 或者 网络字体 ,是CSS3中的一个模块,主要是把自定义的特殊字体嵌入到网页中.无需安装,无需下载,直接在线使用. @font-face语法 web font技术需要通过CSS的 @font-face 语句引入在线字体. @font-css是CSS3中的一个模块,通过它可以将自定义的字体嵌入到前端网页中.随着@f

字体图标 iconfont cssfont

  https://icomoon.io/ 图标下载网址  也可以在ai  ps 中制作 font css @font-face { font-family: 'icomoon'; src:url('fonts/icomoon.eot?o31kxg'); src:url('fonts/icomoon.eot?o31kxg#iefix') format('embedded-opentype'), url('fonts/icomoon.ttf?o31kxg') format('truetype'),

Qt5.7.0配置选项(configure非常详细的参数)

configure是一个命令行工具,用于配置Qt编译到指定平台.configure必须运行于Qt源码根目录.当运行configure时,编译源码使用的是所选工具链中的make工具. 一.源码目录.编译目录和安装目录 源码目录就是包含源码的目录.编译目录是包含Makefiles文件.object文件和其他中间文件的目录.安装目录是二进制文件和库文件安装的目录. 当编译目录和源码目录不一样时,称为影子编译(shadow build),比如说,Qt Creator默认是使用影子编译来编译工程的.这里也