Unity Anti-aliasing shader (SDF)

分享下最近通过论文研究基于SDF的Anti-aliasing。
  • 什么是SDF?

    SDF=signed distance field,其实就是判断一个点是否在区域内。 (通过signed distance function)

  • Signed Distance Field=distance(target,targetNearestForeground)-distance(target,targetNearestBackground)
    SDF只做介绍,详细可以Google。

shader SDFAnti-aliasing原理(参考于https://www.zhihu.com/question/267382412/answer/338371372):

  • 利用的是 uv值做的SDF,多边形中心点,uv值为(0,0),边上的点uv值为(1,0)。这时候,从中心到边缘,uv的x值边缘为1,非边缘在0~1之间。这时候只要利用 uv.x在x和y方向上的偏导数来取出 几个像素做下边缘alpha模糊即可。

首先在构建mesh uv的时候,uv是从本身中心点(0,0)到各边缘(1,0)。(也就是此shader的适用范围,需要使用到可以让美术,或者自己修改uv值)
如下图:


image.png

shader 实现:Alpha Blend+Smoothstep实现半透明渐变

image.png
  • 计算当前像素点在x,y方向上的偏导值,其值等于临近像素上的变化率,因为纹理坐标的梯度可以用来确定纹理当前被缩放的程度,作为需要渐变像素的offset(DX11 上,fwidth())。

原理:


image.png
  • ddx=p(x+1,y)-p(x,y) p点像素与它x方向上相邻像素颜色的差。
  • ddy=p(x+1,y)-p(x,y) p点像素与它y方向上相邻像素颜色的差。
  • delta=|ddx|+|ddy|

由于uv coordinate [0,1] rgba 也是[0,1]。 则所求的delta是以uv coordinate内与目标有颜色差异的单个像素的宽度(从颜色到uv的mapping过程)。 而_Delta则是需要参与计算的像素个数(uv变化是线性的,所以每个像素之间的差异都是一样的)。

简单的偏移计算 : float u = i.uv.x+delta
y=x+a;
x=y-a;


image.png

i.uv.x=u-delta (在i.uv.x位置时,距离u点的delta距离内的范围)
(也就是当u为1时,i.uv.x等于为1-delta)

所求范围的像素,需要进行接下来的alpha 渐变。

接着通过smoothstep实现非线性的渐变递增。(alpha渐变)

image.png
  • 从uv coordinate 的[1-delta,1]区间向[0,1]区间的线性映射(用于插值计算)。
image.png

原理:线性插值


image.png

“(u-1)/delta ” 线性映射(方便插值运算,插值一般都是0-1):

目的为了将由上图的 [1-delta,1]的区间映射到[0,1]的区间用于插值运算。

公式变换:
image.png

则:
由于:u=i.uv.x+delta则:

线性映射为:(u-1)/delta
通过 (u-1)/delta 完成线性映射:


image.png
最后进行smoothstep插值计算(非线性的渐变):
  • smoothstep 函数将用于在一段时间范围内逐渐但非线性地增加属性,例如,“不透明度”(Opacity)从 0 增加到 1。
image.png
  • a=smoothstep(a,0.0f,smoothValue)
  • 由于我们是向0插值,则函数曲线大概是这样(随便画的):


    image.png
Smoothstep函数原型:
image.png

最终效果:

  • 抗锯齿前:


    image.png
  • 抗锯齿后:


    image.png

相关文献地址:
An introduction to shader derivative functions(fwidth()):
http://www.aclockworkberry.com/shader-derivative-functions/

signed distance function:
https://en.wikipedia.org/wiki/Signed_distance_function

smoothstep:
https://en.wikipedia.org/wiki/Smoothstep

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 渲染管线概念:也被称为可编程流水线,渲染管线指的是在给定的3D场景中,根据一架给定的摄像机的视角生成2D图像的一系...
    诸子百家谁的天下阅读 742评论 0 0
  • 我有一只娃娃, 披着红帽 垂着长发, 洁白如雪的脸 一点红润的小嘴, 她望着我 我望着她, 湛着蓝光的黑眸里 她在...
    木秀丶阅读 238评论 0 0
  • 今天,是军训生活的第二天,我们今天又新学了原地踏步走和敬礼礼毕。今天晚上,我们教官还把我们带到其他连队,一起坐了游...
    WMY王明阳阅读 86评论 0 1
  • 配置环境在我的电脑,高级系统配置中,添加path路径,指定到mysql文件的bin文件夹下 修改my_defult...
    MC_Honva阅读 118评论 0 0
  • 我有一壶酒,足以慰风尘。 邀约一知己,共饮百花樽。 酩酊尘世客,忘却世间人。 忍期碧岩畔,诚笃酬瑶神。
    Oak水木阅读 138评论 0 0