video:
http://v.youku.com/v_show/id_XNDEwMDEwNTg4.html
UE4中的realtime GI是基于这个researcher:
http://blog.icare3d.org/
主要的paper:
http://perso.telecom-paristech.fr/~eisemann/publications/Crassin2011VoxelGlobalPG/VoxelGI_EG-pg2011-sub.pdf
http://maverick.inria.fr/Publications/2011/CNSGE11a/GIVoxels_Siggraph_Talk.pdf
算法的名字是:voxel cone tracing,很简洁的概括了算法的两个核心点:voxel&cone tracing。
voxel
谈算法先谈数据结构,voxel于3d mesh正如pixel于2d的图片:规则的离散化的表示信息,pixel是将2d的图片切分成一个个小正方形,voxel是将3d空间切分成一个个立方体。
最先听说这个是carmack和jon olick在08年的时候放出的一些前瞻性的想法,当时看起来就是把mega texture扩展到3d空间,jon olick也在youtube上面放出了一些视频。
在对变革性realtime rendering的期望与将信将疑中,今年迎来了UE4的demo,也把这项技术推到公众眼前。
voxel比较高效的组织方式是sparse voxel octree,简称svo。
是以八叉树的hierarchy方式,表示空间中有东西的部分:
svo是这个算法的关键,在于:
- svo在以一定粒度对场景进行离散化表示之后,GI光照计算量基本保持稳定,而不是和场景中vertex数量以及复杂度成正比
- 这一点上我们可以把这个当作是一个3d的gbuffer,里面以一定粒度存储场景信息
- octree的层级结构,可以让我们在计算的时候很自然的引入LOD,在较远的地方使用低lod(在octree中是高层的节点),使得计算指数降低
- 便于遍历,octree相比于三角形组成的mesh遍历速度快太多了,这在cone tracing部分和filter部分会体现出绝对优势
- 将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如出一辙
- 从lightview渲染场景,把光照信息填入svo
- 对svo中的光照信息进行filter,
- 开始存进去的光照信息实在最底层的level,那么要将这些信息也通过filter放入父节点,那么在cone tracing的时候,就可以直接读父节点(if possible&necessary)来获得足够的光照信息
- 这个过程颇像构建mipmap
- 存的信息是光照的方向分布
- cone tracing,在我们看到的每一个像素这里,使用一组可以覆盖这个点的半球的cone来遍历svo,进而获得这个点上的光照信息
- 获得的方式有使用较大的cone,来获得indirect diffuse lighting
- 较小的cone,获得indirect specular lighting