数学可视化(13)——距离场环境光遮蔽SDF AO

  1. 1. 环境光遮蔽(Ambient Occlusion)
  2. 2. 利用距离场计算AO的一种简便方式
  3. 3. Shader实现上述公式
  4. 4. 补充

 

环境光遮蔽(Ambient Occlusion)

  • 用来描述绘制物体和物体相交或靠近时候遮挡周围漫反射光线的效果
  • AO的表现可以突出阴影暗部的细节
  • 除了可以增强画面的层次感和真实感,还可以修补一些漏光、Shadow map阴影接触不实等问题
  • 是实时渲染里,在经验光照模型下,模拟GI表现比较常用的一种光影技术
  • AO表现的实现有多种方法,如预计算的AO、顶点AO、各种在屏幕空间下实时计算的AO等等

利用距离场计算AO的一种简便方式

  • 在已经有距离场数据的条件下,对于着色点p,在其法向量方向上,以固定的步长步进几个绿色的点,用该点对距离场进行采样
  • 将距离场采样的结果,与到p点的实际距离差值比较
  • 如图,若洋红色的线条与黄色线条长度几乎相等,其累计的差值也很小,代表该p点的环境光几乎不被遮蔽;或洋红色线条与黄色线条的差值较大,其累计差值也相对更大,这代表该p点环境光被遮挡更多
  • 总之,累计的差值越大,代表环境光被遮挡越多
  • 由于环境光遮蔽的衰减是呈指数级下降的,因此更远的表面比更近的表面遮挡得更少

  • 任意点的AO值为 1 - 洋红色线条长度与黄色线条长度差值的累加值,这里的公式默认步进了5次,1/2的i次幂是衰减的指数,k为我们为衰减值添加的系数,通过k可以调整遮挡阴影的深浅
  • 进一步对公式展开,洋红色线条长度可以为步进次数乘以△步进长度,黄色线条长度可以可以替换为步进的几个绿色点在距离场上的采样

Shader实现上述公式

  • 传入着色点p的位置与p点的法线方向
  • occ是为计算累计距离差值定义的变量
  • scale是衰减系数
  • 衰减系数k默认为3.0
  • 步进的默认距离为0.03
  • 这些数值都可以通过调整来改变AO的效果
  • 接下来是5次循环计算洋红色线条长度(distDelta),与黄色线条长度(distField),并将二者的差值乘以衰减系数累加到遮挡值中
  • 最后用1减去遮挡值,并将结果截断到[0, 1]间返回

  • 并乘到经验光照模型的环境光分量上



  • 在有SDF数据时,该算法即简单又高效
  • 当没有SDF数据时,也可以通过屏幕空间来模拟计算AO,比如SSAO等

补充

  • 按公式来看,1/2的i次幂完整的写法应该再加上scale * 0.5;
  • 但如果这样改,出来的AO效果衰减得太快,所以需要同时调整遮挡系数k与默认步进距离step
  • 由于衰减过快,可能后几次的增加值非常小,所以可以在遮蔽值达到一定值后直接跳出循环,放弃后面的增量值occ的计算
  • 当把衰减系数和步进距离调成一个更夸张的值来看时,只使用1/2系数时效果是不对的,使用1/2的幂次更符合AO的分布表现