02 - PRT
能解决实时环境光照的除了IBL外,还有PRT(Precomputed Radiance Transfer)。本文将先介绍一些PRT的数学基础(信号、基函数、球谐函数等),然后介绍PRT的算法,最后介绍一点2D小波函数内容。
回顾数学基础
信号
首先简要回顾一下在GAMES101中有关信号的内容。
傅里叶变换
函数f(x)可由一个常数项和若干sin, cos项近似表示。并且每个项都有自己的频率。
图片的频率
图片可通过傅里叶变换将时域转换为频域,右图也被称为图片的频谱图:
因此,可用不同大小的滤波核对图像进行过滤操作,保留需要的信息。例如下图使用 低通滤波器(Low-pass filter),只保留图片的低频信息:
卷积理论
在时域的卷积操作相当于在频域的乘积操作:
一些公理
两个函数乘积的积分可悲认为是滤波/卷积操作:
认为低频率就是函数光滑/变化满等。
认为上面说的滤波操作中,它的最终频率是各函数中的最低频率。
基函数
函数f(x)可被很多其他函数的线性组合描述:
球谐函数(SH)
定义
球谐函数(Spherical Harmonics, SH),是一系列定义在球面上的二维基函数(用两个角描述球面坐标,因此是二维);也可看做是一维情况下的傅里叶函数。
它很适合用来直接分析球面上一些函数的性质。
在这个图中:
- 每行SH的频率都相同;
- 颜色表示函数值的符号,值的大小是离原点的距离;
- SH的阶数l与球谐函数数量的关系:
; - m是每一阶SH的编号;
- 前n阶SH的总数为:
。
性质
正交性
SH 是正交的,每个SH基函数
简单投影/重建
可通过投影(Projection)操作获得每个SH基函数前面的系数:
简单旋转
旋转一个SH,相当于旋转它的正交基。因此旋转后的SH可被 同阶基函数SH 线性表示。
简单卷积
SH可进行简单的卷积操作。
低频
SH重建出来的原函数是低频的,保留不了多少高频信息。
应用
如图,diffuse BRDF
可由前3阶的SH简要描述。从配图来看,diffuse BRDF
是没有高频信息的,因为3阶以后的值基本为0。因此,diffuse BRDF
是低频函数,而且光滑,就像一个低通滤波器。
而这样的低通滤波器和环境光照的映射(相当于一个球面函数)相乘,就相当于做了个滤波/卷积操作,就能完成下图的预过滤阶段:
经研究发现,应使用前3阶共9个SH去描述diffuse BRDF
,误差只有1%:
对于任何光照条件,只要物体材质是diffuse
的,就都能用前三阶SH描述。
有了以上数学基础,就能开始PRT内容了。
PRT
使用IBL进行环境光照的着色很好,但难解决阴影问题。而 PRT(Precomputed Radiance Transfer) 则不必担心阴影问题,它是 考虑阴影的环境光照,也是 静态场景的全局光照。
背景
回顾一下考虑阴影(可见性)的RTR渲染方程:
其中,环境光,可见性,BRDF均可被存储为球面贴图。
如果使用暴力法求解渲染方程,那么需要对三个贴图进行采样,然后计算乘积。假设每张图小正方形的分辨率为64x64,那渲染一个着色点需要3x6x64x64次采样,很慢。
我们能不能像IBL那样,简化渲染方程从而简化计算呢?这正是PRT所做的事。
算法
如图,PRT认为 整个场景只有光照在改变,可将渲染方程分为两部分:光照(Lighting) 和 光传输(Lighting Transport) 两部分。
PRT将光照项
在运行时只需通过几个乘法便完成了渲染方程的运算,很快。
diffuse材质
如果材质是diffuse
的,那么BRDF就是个常数
因此有
glossy材质
如果材质是glossy
的,那么BRDF就不是常数,是
接下来将
- Shading结果,关于
的一维向量; ,一维向量; ,二维矩阵。
我们只需计算向量和矩阵的乘积就能解出渲染方程。
代价
但代价是什么?
- 空间上:任何一个着色点都要存储这个transport矩阵
- 时间上:通常选用3/4/5阶SH描述,导致
diffuse
情况需要 次点乘;glossy
情况需要 次向量矩阵乘法。
多次弹射
前面只说了环境光弹射一次的情况,这里讨论一下环境光弹射多次的情况(它们都差不多)。
描述光传输路径
我们可以像编译原理那样描述光的传输路径:
LE
:直接光照,反射光直接进入眼睛,对应下图none情况。LGE
:反射光会弹到glossy
材质物体上,然后再次反射进入眼睛,对应下图 1 bounce 情况。L(D|G)*E
:LGE的通用版本。反射光会弹到diffuse/glossy
材质物体上,并且会再次经反射弹到diffuse/glossy
物体上……直到弹射*
次后才反射进入眼睛,对应下图 2 bounces 情况。LS*(D|G)*E
:在前者基础上,光线会先到specular
材质物体上进行多次反弹,然后才会做前者的工作,对应下图 caustics 情况。
因此,任何光路可被描述为 L + Transport
,而后者可被预计算,不影响运行时时间。
对光传输的理解
如图,光传输的计算可理解为,求在不同SH基函数下计算渲染方程(着色),然后将着色结果综合起来。
总结
PRT使用SH近似描述了渲染方程的光照项和光传输项,我们在预计算阶段计算并存储光传输的所有可能结果,然后在运行时,将光照项和光传输项进行点乘/向量矩阵乘法即可(方式取决于物体的材质)。
当然,PRT也存在一些限制:
- 由于使用球谐函数SH作为基函数,它只能描述低频的内容,不适合描述高频的(因为付出代价很大,往往要26阶才能描述较准确)
- 虽然光源可以是动态的,但场景、材质必须是静态的。因为后者是经过预计算的。
- 预计算需要的数据存储太大。
为了缓解这些限制,人们也是做了许多工作:
- 使用更多种类的基函数;
- 让两个积分点乘变成三个;
- 允许场景、材质稍微动态一点;
- 将PRT应用在更多领域(半透明材质,头发等);
- 通过推导解析解进而减少预计算。
更多基函数
除了球谐函数SH,多项式函数等基函数外,还有很多:
- 小波函数(Wavelet)
- 带球调和函数(Zonal Harmonics)
- 球面高斯函数(Spherical Gaussian,SG)
- 阶跃长函数(Piecewise Constant)
小波函数
这里介绍的是2D Haar小波函数,它定义在图像块上。
特点
投影操作:
可以将图像投影到各个基函数上,然后保留系数不为0的项,进而得到近似结果。这种近似也被称为非线性(non-linear)近似。
支持全频率:
小波函数的特性支持它描述全频率的信息。
应用
可以对CubeMap上的每个图做小波变换,高频信息留在左下,右下,右上三块;低频信息放在左上。然后左上又能做一次小波变换……
渲染结果如下,可见很好地描述了高频信息:
参考资料
GAMES202: 高质量实时渲染 (ucsb.edu)