之前很早就看到了UE4中的基于Sparse Voxel Octree的RTGI,效果很酷,一直尝试作些研究与实现,但苦于没机会。前段得空,抽时间学习了一下,这里小结一下备忘。
整个算法主要分类几个过程:体素化、Mipmap OCTree、Cone Tracing。
1. Voxelization
体素化整个GI算法的基础。这里体素化可以采用的方法也比较多,主要有以下几种:
- 直接将体素与场景进行碰撞检测。该方法比较原始,效率也较低,虽然也可以借助于GPU进行加速,但是在该特定场合中使用起来还是诸多不便;
- 基于CUDA进行体素操作,这也是使用GPU进行加速的一种方法。比如这里的一个使用CUDA进行光栅化方法,稍作修改就可以同样用来实现体素化;
- 基于GPU Rasterization的方法,使用这种方法的好处就是不需要特殊的Pipeline,很容易将它往现有的游戏或渲染引擎中进行整合;
由于整个算法要搞定动态场景以及动态光源,因而这里的体素化操作也是需要实时更新的,因而就需要效率尽可能高的体素化操作算法;而且就尽可以地与现在的引擎紧密结合,如此一来基于CUDA的其实也是不太方便。对于第三种方法,结合当前最新的DX11或OGL4.0以上的一些新属性,可以实现基于Rasterization和DirectCompute的体素化算法。这里有一篇文章就是Cone Tracing算法的作者发表在OpenGL Insight中介绍使用OpenGL来进行光栅化的方法,值得学习。
体素化的过程主要如下图所示:
其主要流程是:
- 使用与体素化细分分辨率相同的正交投影窗口来渲染三维网格中的每个三角形;