04 - SDF

近期出现了一个有关软阴影的新技术——基于距离场的软阴影渲染(Signed Distance Field Soft Shadows),本文将简要介绍一下它,并且看看在以后能不能做适当补充。

SDF软阴影

距离函数(Distance Function)

定义:对于空间中任一点,它离最近物体表面的距离。可定义符号,如点在物体内部就是负的。

下图是点在字母A上的SDF,左边是纯黑版,右边是根据距离不同可视化的结果,可见效果很不错。

点在A上的SDF

作用

  • “混合” 运动物体的边界:

如图,物体在A,B时间位于不同的位置,如果直接给它俩进行线性插值,就得不到移动边界。应该用SDF描述点离运动边界的距离,然后进行线性插值,最终得到的结果正好是物体在A,B间运动的结果。

  • “混合”多个DF:

距离场(SDF)

可视化

距离场的可视化如图,可见很好的划分了空间中点与各物体间的关系。

用途

光线步进(Ray Marching)

使用Sphere Tracing 计算光线和最近物体SDF的求交。SDF在此充当“安全距离”作用,让光线知道自己离物体最近的距离。之后光线可以在以距离为半径的球内步进,且不会发生碰撞。当步进距离够长/SDF小于阈值时,光线停止步进。

生成软阴影

使用SDF的“安全距离”,转化为从着色点看向光源的“安全角度”,从而决定是否看到障碍物,决定该点是否被“遮挡”。

如何将“安全距离”转化为“安全角度”?

如图,在Ray Marching的过程中,在视线各个点上求最小”安全距离“,然后就能得到最小”安全角度“了。

如何计算呢?最直观的想法是用 arcsin()计算太复杂了,我们只需近似求出角度即可: 其中,k决定阴影的软硬程度:

生成无限分辨率文字

也能使用SDF生成RTR领域中具有”无限“分辨率的文字,怎么放大都不会有锯齿。

优缺点

优点:很快,没有自遮挡/悬浮等问题,质量高。

缺点:存储占用大,要预计算,不好贴纹理。

参考资料

  • GAMES202: 高质量实时渲染 (ucsb.edu)