一般来说,无论2d或者3d资产都有隐式(implicit)显式(explicit)两种存储方式,比如3d模型就可以用mesh直接存储模型数据,也可以用sdf、点云(point cloud)、神经网络(nerual rendering)来表示,2d资产(这里指贴图)也是如此。比如贴图一般直接使用rgb、hsv等参数来进行表示,但这样子再放大图片后会出现锯齿,所以想要获取高清的图像就需要较大的存储空间,这时候就需要矢量表示,在2d贴图中sdf就是为了这种需求产生的。

SDF(Signed Distance Field)在3d和2d中都有对应的应用。在3d中光线追踪对于性能的消耗过大,所以sdf常常被用来作为物体的隐式表达,配合ray marching达到接近光线追踪的效果,也有比如deepSDF这种对于模型的隐式表达方面的应用。在2d中,sdf常常被用来表示字体,原神的面部渲染中阴影部分贴图也是基于sdf生成的。

SDF的本质就是存储每个点到图形的最近距离,即将模型划出一个表面,在模型表面外侧的点数值大于0,在模型表面内侧的点数值小于0

对于任意的给定点,距离函数能够给出其到一个物体上最近点的最小距离(这个距离可能是带符号的)。

此外,SDF也具有一些比较好的性质,例如混合一个移动边界时,比如希望得到A、B时刻之间某时刻的边界时,SDF就能取得比较好的结果,如下图所示,试图混合A、B时刻之间的边界,如果直接混合 lerp(A,B) 可能得到如灰色区域所示的结果,但如果将该边界转换成SDF后,即 SDF(A) 、 SDF(B) ,再进行混合 lerp(SDF(A),SDF(B)) ,再将混合后的SDF还原得到最终结果 SDF−1(lerp(SDF(A),SDF(B))) :

或者对两个不同结构的物体进行混合时,可以混合它们的距离函数。

SDF可以被用来做ray marching,来解决光线和SDF的求交问题,这背后有一个key idea:某一点SDF的值等价于其附近的安全距离,从一点出发在每个step沿着ray的方向移动SDF(p)的距离,此处的p指的是当前step时的那个点。该方法对于运动物体(刚体)可行,对于形变物体需要重新计算SDF。

此外,SDF能被用于估计大概的percentage of occlusion,即SDF的值一定程度上反应观察者能够看到的“安全”角度,该角度越小意味着越少的可见性,阴影应该越黑。下图中下方灰点表示shading point,该射线指向面光源中心,通过计算安全角度近似估计可见性。

具体算法流程(在ray marching的过程中,为了得到这个最小“安全”角度,记录下每一个step时对应的角度,并选择其中最小的角度作为最终结果。):

  1. 在ray marching每一步计算安全角度,分别得到p1、p2、p3
  2. 根据p1、p2、p3计算出其中最小的安全角度
  3. 根据该最小安全角度,近似得到可见性

在实时渲染中,为了节约计算量可以把arcsin去掉,因为SDF(p)与p到o距离的比值已经可以反映夹角的大小,最终可以写为:

min{k⋅SDF(p)/|p−o|,1.0} ,其中越大的k,可以得到越接近1.0的值,会使得半影区域的过渡带越小,阴影也会越“硬”。

优缺点

优点:速度快(这里忽略SDF的生成过程,与shadow map相比,该方法更快,基于shadow map的方法时间开销主要使用在生成shadow map,此外当渲染本身使用Ray Marching方法时,使用SDF生成阴影更加方便);高质量。

缺点:需要预计算(生成SDF);需要高存储(目前有一些方法使用层次化存储结构,在不同层次使用不同粒度);可能有artifacts。

参考视频

SDF(signed distance field)相关推荐

  1. Godot 4.0中的基于有向距离场SDF(Signed Distance Field)的实时全局光照技术

    原文地址 Godot官网 <Godot 4.0 gets SDF based real-time global illumination> 作者 Juan Linietsky 6月28日 ...

  2. signed distance field 算法

    将二值图转化成signed distance field后,可以在双线性插值下实现平滑放大. 定义: 到前景的distance field:各点到最近前景点的距离. 到背景的distance fiel ...

  3. DeepSDF : Learning Continuous Signed Distance Functions for Shape Representation

    作者提出了一个新的深度学习网络来生成某一类物体的连续SDF表示.主要贡献:  1. 相较于传统的SDF只能表示某一个形状的隐式表示,DeepSDF可以直接表示一类物体的SDF函数.所谓shape co ...

  4. Truncated Signed Distance Function: Experiments on Voxel Size

    论文:Truncated Signed Distance Function: Experiments on Voxel Size 简称:TSDF 作者:Diana Werner等 时间:2014 相关 ...

  5. 详解DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation

    Reference: Park J J, Florence P, Straub J, et al. Deepsdf: Learning continuous signed distance funct ...

  6. DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation

    目录 1. 概述 2. 相关工作 2.1 表示学习技术 2.2 3D形状补全 3. DeepSDF 4. Auto-decoder 4.1 训练阶段 4.2 推理阶段 5. 实验与应用 5.1 表示已 ...

  7. OpenGL Distance Field文本的实例

    OpenGL Distance Field文本 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <vmath.h> #include ...

  8. 第060封“情书”:相对论 Signed Distance Outlines Houdini

    第060封"情书":相对论 20180507 Quicktip- Signed Distance Outlines<Entagma>Houdini 2018  ▉ 中国 ...

  9. Voxgraph: Globally Consistent, Volumetric Mapping Using Signed Distance Function Submaps

      基于符号距离函数的大规模三维重建方法,使用子地图来降低存储和优化的代价.系统假设可以通过实时获得重力方向来降低位姿估计问题的维度.   本文根据固定频率生成子地图,假设子地图内误差较小,从而把全局 ...

最新文章

  1. 基于微软开源深度学习算法,用 Python 实现图像和视频修复
  2. UP_DOWN_REQUEST
  3. 场强和电阻_电阻定律及其相关问题
  4. 列注释_技术贴 | 宏基因组分箱 (Binning)第四课——COG EC RNA注释统计
  5. 主键和索引哪个快_字节一面,被连问 MySQL 索引,脸都问绿了。。。
  6. BI软件的作用有哪些
  7. md5是什么_全民小视频视频修改md5有什么用6
  8. linux查询进程命令stap,linux systemtap, stap++使用
  9. vue 倒计时 插件_vue倒计时组件
  10. 显卡更新后重启计算机就没了,在windows10系统更新显卡后黑屏的解决方法
  11. 汉诺塔,简单递归带你破解出攻略
  12. docker run --privileged参数(容器权限全开,不利于宿主机安全,宿主机容易重启)(与/usr/sbin/init共用)
  13. MyBatis入门回顾
  14. 日本雅虎乐天商城批量上传步骤
  15. 【创业笔记】团队建设--团队氛围的营造
  16. 【python实战】三:古典问题—兔子繁衍
  17. Spring学习第4篇:Spring 的依赖注入
  18. android如何加载长图
  19. java中正则表达式隐藏中文汉字
  20. Matlab画折线图是线型、颜色、标记符号和属性设置-LineSpec(线条设定)

热门文章

  1. 案例01-tlias智能学习辅助系统04-登录认证+全局异常处理
  2. 简单理解viterbi算法
  3. Problem A:Serval 的俳句
  4. tombstone问题追踪与分析
  5. 安托协助美的,管控线上渠道
  6. java实现猜数字小游戏(简单+详细)
  7. 钉钉小程序换行和输入空格
  8. 百度编辑器上传图片时设置图片展示的最大宽度
  9. vue管理后台项目中使用wangEditor富文本编辑器
  10. S32K的pwm_pal组件使用