环境光照总结

所谓环境光照其实是因为光源的各种弹射让环境中的所有物体都可以看作是光源,它所表现的效果是一种全局光照,但是在实现的时候我们是把它当成直接光照处理的。
球谐函数
球谐函数是一组基函数,我们可以通过这组基函数来表达复杂的函数,比如光照方程。不是所有的函数都可以被球谐函数表示,只有定义域在球面上的函数才可以。球谐函数类似于傅里叶变换,它可以分成很多层,每一层表示不同频率的信号,通常我们会使用较低层次的基函数来还原光照方程,这样就意味着,我们只保留了低频信号。因为diffuse光照其实就是低频信息,所以球谐函数适合处理diffuse光照,不适合处理高频的反射光照。小波函数可以保存全频信息(因为很多频率的值是零),因此小波函数在处理高频上要强于球谐函数,但是球谐函数支持旋转,小波函数不支持。我们可以把原函数在每一个基函数上进行投影,这样就会得到一个存储投影的向量,这个向量乘以基函数就可以得到原函数的值。因为基函数彼此正交,所以可以将光照方程拆解成多个部分表示,然后分别求出投影向量,这些投影向量相乘就可以还原原函数,比如将光源拆出来,这样光源就可以旋转了。
PRT
在我看来PRT就是代表预计算的一种思想,它把复杂的函数用球谐函数,小波函数等一些列函数表示,然后通过预计算求出对应基的投影,利用投影就可以通过简单的点乘来获得原函数的近似结果,比如对于环境光计算来说我们需要积分环境光贴图,积分阴影贴图,积分BRDF等等,具体的数学公式太多了,具体问题具体分析吧。
IBL
IBL是环境光预计算的一种,类似于PRT,与PRT不同的是IBL并没有使用基函数代替光照方程,而是将光照方程进行拆解,然后将拆解的每一步的值存储到贴图中,IBL将光照方程拆解成三部分:

  1. 漫反射积分,这部分的输入是法线n,输出是法线n半球积分上的漫反射光。这部分就是使用蒙特卡洛积分,在半球面上均匀采样,然后使用一张立方体贴图,将计算后的结果保存到立方体贴图中。这部分也可以使用球谐函数,做diffuse的旋转,但是没必要,因为我们不想看到diffuse可以旋转,specular不能旋转。
  2. specular反射光的积分,这部分输入是反射光线r,输出是r方向上镜面波瓣上的输入光线的积分,这里处理比较麻烦,镜面反射和漫反射不一样。漫反射会在法线周围均匀散射,而镜面反射只有在镜面波瓣中的光线才能反射到眼睛中。这里需要使用重要性采样来解决镜面波瓣的问题。首先我们需要知道镜面波瓣怎么定义,我们知道反射光线是由观察方向和法线方向决定的,而微表面模型是由无数个微表面组成的,这些微表面有自己的法线,这些法线对应的反射光线就在一个波瓣形状中。换句话说镜面波瓣的形状是由微表面的法线决定的。我们知道根据法线分布函数,一个微表面的法线是由宏观表面的法线以及表面的粗糙度决定的。但是在预计算的过程中我们不知道宏观表面的法线以及粗糙度,这里就做了一个近似,宏观法线的方向等于反射方向,也就是掠射角为零的情况。另外我们分别计算粗糙度为0,0.25,0.5,0.75,1,这五个粗糙度的值存储在mipmap中,实际使用的时候使用三线性插值求出反射积分的值。通过上面的近似,我们就得到了法线分布函数,根据法线分布函数,我们可以求出法线的概率密度函数,然后根据概率密度函数可以求出CDF函数,根据CDF就可以求出其反函数,然后我们使用低差异序列匀采样0-1之间的值,根据这个反函数我们就可以推导出在镜面波瓣中的反射光线了。
  3. BRDF LUT,这个处理比较简单,这里涉及F, a, Wo, n四个变量,F可以提取出来,wo和n组成一个变量,这样最后就是a和dot(n,wo)组合一张查找表。
    IBL中涉及到的数学计算可以参考我另外一篇文章,这里只说一下思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值