本节继承上一节的难度并继续加深,讲这个BRDF,然后理解反射方程和渲染方程,最终实现全局光照,以下内容很抽象……如果想要深入理解建议到隔壁基于物理着色:BRDF - 知乎 (zhihu.com)或者多看几遍视频,我也是回头看了第二次才透彻,比较重要的是上一节的物理概念要搞明白
目录
双向反射分布函数 (BRDF)
反射方程
渲染方程
理解渲染方程
解渲染方程
双向反射分布函数 (BRDF)
我们用这个双向反射分布函数 BRDF(Bidirectional Reflectance Distribution Function)来表示这个指定方向入射光和反射光的关系,也就是光线如何和物体发生作用的,这个BRDF实际上就规定了不同材质的反射光的性质,发射多少光以及往哪个方向反射
对于物体上一个单位面积上收到的光通量,那它大小就是irradiance,也就是dE,这个dE可以表示成radiance在单位立体角上的积分,也就是dE(wi) = L(wi) cos θi dwi,同时物体单位面积接收到光能量后会发射,也就是有一个出射的radiance
BRDF就是用来描述这个接受到的光通量和如何发射的这个关系的,接受到的能量有多少需要发射出去,往哪个方向方向,BRDF就是这个radiance和irradiance和比例
反射方程
对于BRDF我们说是对于给定方向的入射的光通量然后规定这个出射的radiance的方向和大小,那实际上这个物体上的单位面积它可能不止接收到来着一个方向的这个入射的radiance,那实际上如果我要去描述这个物体出射的radiance应该对所有方向来的radiance做一个积分,这个就是所谓的反射方程
实际上这个物体接受到的入射radiance它可能不止来着一个光源,它可能来自于其他物体的出射的radiance,所以这里实际上会有一个递归的定义
渲染方程
对于这个反射方程其实没有考虑到一个地方,什么呢,就是这个物体本身可能会放光,物体本身可能是个光源,那这个反射方程需要修改一下,这就需要加上物体本身的出射radiance,形成这个所谓的渲染方程
理解渲染方程
之前我们都是从这个物理数学推导出来的这个渲染方程,现在我忘记这个推导的过程,我从这个渲染方程本身去理解这个全局光照是怎么实现的
对于只有一个点光源的情况,那就是我这个物体发射的radiance就等于我本身会发射的radiance加上反射点光源发射的radiance,具体怎么反射的,这个是物体本身的材质决定的,那就是由BRDF所描述的事情
那对于多个点光源的情况,我就全都加起来,让接收的radiance是所有点光源的累加效果就行了
那如果不是点光源,是这个面光源怎么办呢,是不是就把这个面的radiance对它所覆盖的立体角做一个积分就行了
那实际上接收到的光还有可能来着其他物体反射的光,这个怎么处理呢,那我就直接统一把接收的radiance当作是其他物体这个出射的radiance就行了
解渲染方程
那怎么解这个渲染方程呢,从我们最后给出的方程可以看出,未知的只有物体本身的出射radiance和接收到的来着其他物体的出射radiance,而这两个radiance实际上是一个东西是不是,这里其实可以解释为什么后面可以写成两个相同的L了,这里先简化一下BRDF写成核函数的形式
然后从线性代数的角度,定义这个算子操作,这个K就是发射算子,这个L实际上是全局radiance,像机器学习里面从某个属性值上升到属性本身一样,从单个元素上升到矩阵操作
然后通过解这个线性方程可以算出L
怎么理解这个L呢,实际上如果L=E那就是只有点光源的光可以看到,L=E+KE,此时光是直接光照,有了一次反射光,而L=E+KE+K²E则是增加了一次间接光照,称为一次弹射光照,如果继续计算下去就会得到全局光照
其中能在光栅化做到的只有L=E+KE,后面的光栅化就很难实现了
这个就是光栅化能够实现的L=E+KE
L=E+KE+K²E
继续下去全局光照的效果会更好,但是最终会收敛到某个程度,其中图片中上方其实是个玻璃,但是光线需要经过多次弹射才能从里面出来