04 - SDF
近期出现了一个有关软阴影的新技术——基于距离场的软阴影渲染(Signed Distance Field Soft Shadows),本文将简要介绍一下它,并且看看在以后能不能做适当补充。
距离函数(Distance Function)
定义:对于空间中任一点,它离最近物体表面的距离。可定义符号,如点在物体内部就是负的。
下图是点在字母A上的SDF,左边是纯黑版,右边是根据距离不同可视化的结果,可见效果很不错。
作用
- “混合” 运动物体的边界:
如图,物体在A,B时间位于不同的位置,如果直接给它俩进行线性插值,就得不到移动边界。应该用SDF描述点离运动边界的距离,然后进行线性插值,最终得到的结果正好是物体在A,B间运动的结果。
“混合”多个DF:
距离场(SDF)
可视化
距离场的可视化如图,可见很好的划分了空间中点与各物体间的关系。
用途
光线步进(Ray Marching)
使用Sphere Tracing 计算光线和最近物体SDF的求交。SDF在此充当“安全距离”作用,让光线知道自己离物体最近的距离。之后光线可以在以距离为半径的球内步进,且不会发生碰撞。当步进距离够长/SDF小于阈值时,光线停止步进。
生成软阴影
使用SDF的“安全距离”,转化为从着色点看向光源的“安全角度”,从而决定是否看到障碍物,决定该点是否被“遮挡”。
如何将“安全距离”转化为“安全角度”?
如图,在Ray Marching的过程中,在视线各个点上求最小”安全距离“,然后就能得到最小”安全角度“了。
如何计算呢?最直观的想法是用 arcsin()
计算太复杂了,我们只需近似求出角度即可:
生成无限分辨率文字
也能使用SDF生成RTR领域中具有”无限“分辨率的文字,怎么放大都不会有锯齿。
优缺点
优点:很快,没有自遮挡/悬浮等问题,质量高。
缺点:存储占用大,要预计算,不好贴纹理。
参考资料
- GAMES202: 高质量实时渲染 (ucsb.edu)