谈谈虚幻引擎4的Global Illumination
- 米兰的红与黑本届GDC 2013,Epic再次展示了UE4的最新demo,效果惊艳毋庸置疑,,不过今天我们只谈UE4的光照利器--SVOGI。
SVOGI全称Sparse Voxel Octree Global Illumination,由Epic的Andrew Scheidecker发明,和CE3的LPV(Light Propagation Volumes)同属实时全局光照,但SVOGI精度更高,这个也是虚幻引擎迄今为止首次引入实时全局光照,同时SVOGI允许在全景模式下实现间接镜面反射和光照反射。UE4保持了octree(八叉树)的数据结构,SVOGI的算法为voxel cone tracing,此算法的好处是可以使cone-tracing通过GPU运行的更快,在实时模式下,每个像素可以达到运行一次甚至更多。
接下来介绍下voxel cone tracing的核心(转载自CSDN,作者ccanan),简而言之就是voxel和cone tracing:
voxel:
voxel于3d mesh正如pixel于2D的图片:规则的离散化的表示信息,pixel是将2D的图片切分成一个个小正方形,voxel是将3D空间切分成一个个立方体。voxel比较高效的组织方式是sparse voxel octree,简称svo,以八叉树的hierarchy方式,表示空间中有东西的部分:svo是这个算法的关键,在于:
- svo在以一定粒度对场景进行离散化表示之后,GI光照计算量基本保持稳定,而不是和场景中vertex数量以及复杂度成正比
- 这一点上我们可以把这个当作是一个3D的gbuffer,里面以一定粒度存储场景信息
- octree的层级结构,可以让我们在计算的时候很自然的引入LOD,在较远的地方使用低LOD(在octree中是高层的节点),使得计算指数降低
- 便于遍历,octree相比于三角形组成的mesh遍历速度快太多,这在cone tracing部分和filter部分会体现出绝对优势。
voxel cone tracing算法的svo的一些特点和做法:- 将static mesh的voxel和dynamic mesh的voxel进行分离,对于dynamic mesh的voxelmz 每帧更新。
- 使用gpu的rasterizer pipeline进行voxel构建--非常的高效
- 禁掉depth test,从3个方向去渲染一个mesh,渲染的精度由定的voxel精度决定
- 走到pixel shader的时候,每一个triangle的信息就都被离散成pixel,而且没有depth test,就是每一个triangle raster出来的每一个pixel都有,然后在pixel shader里面将voxel信息更新到svo中去
- 更新的信息包括normal, color, material property:和gbuffer如出一辙
voxel cone tracing:
如图所示:- 从lightview渲染场景,把光照信息填入svo
- 对svo中的光照信息进行filter
- 开始存进去的光照信息在最底层的level,要将这些信息也通过filter放入父节点,那么在cone tracing的时候,就可以直接读父节点来获得足够的光照信息
- 过程类似构建mipmap
- 保存的信息根据光照的方向分布
- cone tracing,在我们看到的每一个像素这里,使用一组可以覆盖这个点的半球的cone来遍历svo,进而获得这个点上的光照信息
- 获得的方式有使用较大的cone,来获得indirect diffuse lighting
- 较小的cone,获得indirect specular lighting
实际计算的时候,基于DX和底层硬件的优化手段也很重要。
在UE4里,不再有预先计算好的光照贴图(lightmaps),取而代之的是,间接或直接光照都是由每帧实时计算得出,对比之前存储于2D纹理贴图里的光照贴图,UE4里全部存储在voxels(voxel就是在三维空间里,一个点的图像信息),voxel由树形结构管理,用来标记一个点的图像信息坐标,当一个像素被渲染的时候,它会向voxel tree询问“哪些voxel对我可见”,基于这些信息,决定了它所会接收到的反射光数量。这些voxel tree会每帧进行信息更新,进而所有像素根据该tree获得相应的光照信息。 - Tupperware高,实在是高。拜读了!
- akme印象中我的数据算法老师就是研究这个的,结果年纪轻轻的就撒手人寰了……