IrradianceVolumesForGames

原来是想做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来处理,否则会这样:
  • IrradianceVolumesForGames_第1张图片
  • 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

你可能感兴趣的:(vector,object,function,cache,Blog,存储)