原来是想做IrradianceVolume的笔记,但是显然ATI这篇文章要更加全面和深入,所以直接这个吧。
Link:
http://ati.amd.com/developer/gdc/Tatarchuk_Irradiance_Volumes.pdf
这个文章涵盖了几个方面:
- Radiance, irradiance, transfer
- Spherical Harmonics
- Irradiance Volume
几个概念:
- RadianceDistributionFunction:空间一点,在某个角度上的发出的flux,是个5D(pos+2 angle)的函数。
- Field radiance function : 在surface上半球上定义的incident radiance分布
- Irradiance : 在半球面上,对于field radiance function和夹角cos值的积分,irradiance可以来定义diffuse surface的randiance。
- Irradiance:所以可见Irradiance是radiance的一种卷积,也是和pos,direction相关的东西,也是5D的。
SH:
- n阶SH系数,有n*n个
- 和normal做计算----直接dot(这里有些疑问呃,应该是coefficient做了处理的)
- irradiance gradients【0】 : 在sample点附近irradiance变化比较剧烈,那么需要引入irradiance gradient来处理,否则会这样:
- irradiance gradients【1】:使用central differencing来计算irradiance gradients,然后把这个vector和dir(point,sample)做dot操作,作用到原来的irradiance,结果就是一个比较正确的irradiance。
PRT:
前面介绍的是环境对object的光照影响,但是没法处理物体自己对自己的光照影响。
这样就可以用precomputed radiance transfer来搞定。
前面的blog有介绍,这里跳过。
就是要注意的是,PRT不好旋转,所以可以旋转环境来模拟。
Irradiance Volume
这里就是处理高效存储scene里面的irradiance信息的事情了。
就是用空间分割(各种树,比如8叉树,或更加adaptive的8叉树)来做一个irradiance的cache。
树的节点存的是irradianc投射在SH上的系数,使用的时候就是一顿lerp,得出需要的点的SH 系数,然后用就可以了。
分割空间的时候纯8叉树比较费(很多地方不用继续分割了),所以就用更加灵活的8叉树,叫:
adaptive volume subdivision.
这个dx sample里面有,房子那个。
其实到这一步,怎样分布已经可以非常灵活的根据游戏需要来做了,例如killzone2,就可以让artist来设定那里需要放置sample点,有些地方player没法到达的,就可以直接跳过了。
后面记录了一些GPu帮助划分的方法,harmonic depth mean,刚才记录了一遍,但是csdn出错了,实在不想再打一遍了。
反正觉得没什么大的实用性。
最后应用irradiance volume就是根据具体的点,sample周围8叉树节点,然后根据距离做插值,然后应用SH系数就可以了。
总结:
- 提供了静态场景预计算全局光照的高效使用办法
- irradiance gradients处理irradiance 在sample点周围变化剧烈的情况
- 用SH高效保存低频光信息,高频丢掉
- adaptive空间分割结构来保存irrdiance cache
- 插值应用irradiance