Shader

Unity Anti-aliasing shader (SDF)

2018-05-24  本文已影响123人  Levi_Wan
分享下最近通过论文研究基于SDF的Anti-aliasing。

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

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


image.png

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

image.png

原理:


image.png

由于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 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插值计算(非线性的渐变):
image.png
Smoothstep函数原型:
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

上一篇 下一篇

猜你喜欢

热点阅读