Lighting and Material of Halo3
[关键东东]:
lightmap存的是incident radiance in SH coefficient
预计算cook torrence BRDF
个人觉得这个 文章非常赞。
近期看了一些GI的文章,大多数就是集中在indirect lighting上,这个则从更基础的(也就是更本质,而不是更简单)角度出发,去看lighting和material 的 BRDF。
回顾早期学习real time rendering,对lighting and material的理解就是diffuse光照和specular光照,material的BRDF更是没有概念。
而且很长时间以来,游戏领域也是这两种direct lighting和phong BRDF占据统治地位。
BRDF定义:(from wikipedia)
Thebidirectional reflectance distribution function(BRDF;) is a four-dimensional function that defines how light is reflected at an opaque surface.
进入本篇论文:
1, 开篇提出游戏业主要使用的phong BRDF效果不错,但是仍旧不够realistic,在处理面光源(类似sky lighting),physical property like fresnel,上还不够好。
2,然后提出在效果和效率上都比较合适的一个BRDF----CookTorrance。
直接数学表达就略过吧。。。
3,SphericalHarmonics在本文运用的非常多,做一个简单介绍
- 它是类似傅立叶展开的一种基函数展开
- 它很适合用低频的部分(一般就是用前3级甚至前2级展开)去表达平滑变化的信号,比如环境光,而且SH表达方式是非常占空间小(几个系数)运算快(同SH表达的其他东西做,就是dot就可以了)
- 用SphericalHarmonicsIrradianceEnvironmentMaps就把irradiance distribution用SH系数表达,用二次逼近多项式就够了。
- 对于shadow和inter-reflection(subsurface scattering一类的)用precomputed radiance transfer可以
- 当计算lighting时候,可以把其他部分像角度的cos值,material的BRDF用sh表达,结果就是dot就可以了,非常快捷
- 当然做计算的时候要统一空间,把lighting的空间转换通过SH来做也很方便(这个要再看一下)
- 最后是环境里面的lighting表示,主要是indirect lighting,这个基本就是irradiance volume那种,把场景分割成一堆cell,每个cell里面存lighting信息,然后去sample周围cell的lighting信息,进而计算光照结果
- ATI的一个例子说用一些不是很规矩的cell,这样可以除去一些不必要的计算,算是一种优化
4, SH light map
普通的lightmap(像quake3)里面那种,直接存反射出来的光照结果,也就是exit radiance。
Halo3的存的是入射光信息,也就是还没算的光照信息(incident radiance),当然是以SphericalHarmonics的方式。
有了入射光照信息,bump map这样的东东可以正确渲染了。
效果很牛:
5, Specular Reflectance
用GI和environmental lighting渲染glossy material是比较困难的,specular是视角相关的,而且glossy material分几个频段。
这里可说的不太多,environment map也是和一般游戏里一样,一个个offline弄出来的,存起来。
最后最精髓的地方是把整个cook torrence model给参数化成一些2D texture一共3k大小左右。
把BRDF投射到SH上之后,是一个跟视角有关的函数,这个函数是可以预先算出来的,这样给定一个视角,就可以通过sample texture来得到BRDF在这个视角上的SH系数了。
计算过程中涉及到一些数学上的简略和优化,就不提了。