之前介绍过Huwb在Siggraph 2015年上分享的一篇通过调整采样点排布来保证使用较少的采样点也能得到稳定表现的技术文章,今天要介绍的这个技术则是huwb在2017年提出的新方案,这个方案相对于之前介绍的方案具有更好的稳定性,且不必像之前的技术一样需要针对motion/rotation分开处理,这里是原文的PPT链接。
体积云的实时渲染主要面临着如下的几个问题:
- raymarching采样消耗非常高
- 想要做到实时渲染,只能不断的降低单条射线上的采样点数目
- 采样点数目降低会导致相机移动或者旋转时的锯齿
针对这些问题,现在业界主要有如下的几种解决路径:
- 将光照以及密度数据缓存到与相机frustum平齐的volume texture中,运行时通过一定的算法进行取用
- 通过TAA来减少sampling数目
- 使用较少的采样点来进行光照计算,通过与相机平齐的3D细节贴图来fake粒子浓度效果
这些方法都有着各自的局限性。
之前我们分享的huwb的技术通过对每条射线的起始采样位置进行偏移来解决相机移动时的锯齿问题,对于相机旋转时的锯齿则是通过在平面slice到曲面slice之间进行过渡来解决,但是这种做法比较复杂,而且在相机绕着某个固定点旋转时,会存在瑕疵。
今天这里要介绍的这个技术跟上一个技术方案不同,是通过在世界空间中设定一些采样slice来消除motion/rotation的锯齿的,其基本思路给出如下:
- 假设在世界空间中摆放了一系列与xy平面平行的透明slice,每个slice上存放了对应深度的切片信息
- 正对着这些贴片望过去,看到的结果是没有问题的
- 当相机角度偏离z方向过远时,就会导致效果发生变化
- 但是如果偏离的不是很大,那么看到的结果其实并不会有太大问题。
针对这些表现,这里提出了一套解决方案,那就是在世界空间中摆放多套slice,当相机发生旋转时,根据角度的不同,对不同的slice采样结果进行混合,这种做法的结果对比参考上下两图。
多套slice效果为了便于理解,这里给出了一套顶视示意图:
single slice垂直竖线表示的是采样slice的位置,可以看到,在单套slice的作用下,相机旋转角度过大就会导致采样点分布出现问题,下面给出增加一套垂直相交的slice时的采样点表现:
multiple slices下面介绍一下实现细节,首先,需要选定对应的slice,这个是通过对射线以及slice的法线的夹角与给定的夹角进行比较来得出。
选定slice之后,就需要计算当前射线在这个slice上的起始采样点以及采样步长:
对于某个slice占据主导地位的情况(如下图绿色区域)来说,只需要进行单套slice的采样就可以了,但是对于处于两套slice中间区域的射线(如下图黄色区域)而言,可能就需要同时对两套slice进行采样,之后对结果进行blend:
采样混合俯视图如上图所示,这里给出了相机水平扫射时的各射线raymarching次数的示意图,跟前面一样,黄色表示的是两次raymarching的情况,这些raymarching区域构成了一个带斜边的八边形,不考虑黄色斜边的话,每条射线需要在四套slice(不考虑正负方向)之间进行判断哪套slice占据主导地位,而如果是3D情况的话,就会更加复杂,需要在九套slice之间进行判断。
采样混合 - 3D考虑多套slice之间的混合关系,如果走动态分支的话会导致较高的浪费,因此最高效的做法是将单套slice,两套slice,三套slice之间混合的部分拆成多个section,分别走不同的shader静态分支。
这里给出实际场景中各个位置的slice套数示意图:
以及最终的渲染效果:
原文还给了一个视频,从效果上来看,基本上很难看出slice过渡导致的瑕疵。
网友评论