公式
面片上的光照情况:
L=Le+TL
L :最终要求的光照值;
T :光照传播因子;
球谐光照常用光照模型 1:
L(x,wo→)=Le(x,wo→)+∫Sfr(x,wi→→wo→)L(x′,wi→)G(x,x′)V(x,x′)dwi[1]
L(x,wo→) :点 x 处在
Le(x,wo→) :物体自身在点 x 处发出的光线
L(x′,wi→) :从其他物体上的 x′ 处沿 wi 方向到达的光线
G(x,x′) :两 x,x′ (分别属于不同的物体)间的几何关系
V(x,x′) :两点 x,x′ 间的可见性关系,取值0或1
蒙特卡洛积分
2D点 -> 3D球面点转换:
(2arcos(1−ξx−−−−−√),2πξy)→(θ,φ)
近似积分:
∫f(x)dx≈1N∑i=1Nf(xi)w(xi)=4πN∑i=1Nf(xi)
N :采样点数量;
勒让德多项式
勒让德多项式主要属性:
- (l−m)Pml=x(2l−1)pPml−1−(l+m−1)Pml−2
- Pmm=(−1)m(2m−1)!!(1−x2)m/2
- Pmm+1=x(2m+1)Pmm
实数球谐函数
通过勒让德多项式得到的球谐函数实部表示如下:
yml(θ,φ)=⎧⎩⎨⎪⎪2√Kmlcos(mφ)Pml(cosθ),2√Kmlsin(−mφ)P−ml(cosθ),K0lP0l(cosθ),m>0m<0m=0
其中P为相应的伴随勒让德多项式,K为SH球谐函数的随访因子,如下:
Kml=(2l+1)(l−|m|)!4π(l+|m|)!−−−−−−−−−−−−−−√
由上述参数化表示之后即可以求得蒙特卡洛采样后的球面空间上的球谐函数,其可视化形状一般表示为下图:
球谐投影与重建
对于一个分布于球面空间的函数
f(x)
, 其用球谐函数表示后为
f~(x)
,则 2:
f~(x)=∑t=0n∑m=−llcmlyml(s),cml=∫Sf(s)yml(s)ds
对其系数应用蒙特卡洛离散化后得到 3:
cml=∫Sf(s)yml(s)ds≈1N∑j=1Nf(sj)w(sj)yml(sj)cml=4πN∑j=1Nf(sj)yml(sj)
由此便可以对有一个球面空间上的函数进行球谐投影并还原,投影与重建情形如下:
特性:两个函数的乘积在球面空间上的积分值与它们的球谐系数向量组的点积相同。
从而有[^4]:
∫Sf1(s)f2(s)ds≈∫Sf~1(s)f~2(s)ds=ci→⋅c2→=∑i=0Nc1ic2i
四面体剖分线性插值
假设原本点的位置为
r⃗
,对应的重心坐标为
λ⃗
,则有
⎡⎣⎢⎢p0x−p3xp0y−p3yp0z−p3zp1x−p3xp1y−p3yp1z−p3zp2x−p3xp2y−p3yp2z−p3z⎤⎦⎥⎥⎡⎣⎢λ0λ1λ2⎤⎦⎥=⎡⎣⎢⎢rx−p3xry−p3yrz−p3z⎤⎦⎥⎥
规则
固定采样点的不足:
- 如果采样点比较稀疏则对场景的采样就粗略,影响绘制效果,设置得密集则每帧的采样工作计算量大,影响整体计算速度;
- 对于动态场景较容易出现采样点失效的情况;
- 每帧都必须对所有采样点建立立方体并计算该立方体的球谐系数,在此基础上插值计算所有的面片的光照.
改进方法:
- 采样点随物体的运动而更新,大大降低了采样点失效的概率;
- 每帧选用合适的采样点进行计算,既保证采样效率又减少了采样工作的计算量;
- 利用相邻帧的变化较小、每帧可以只更新场景中的一部分物体的光照,将原本大量的计算分散到各帧,提高了效率.
算法
分帧计算:
初始化 :首先对场景进行初始化计算,包括细分面片、建立面片列表和相互对应关系、建立立方体形状因子查找表、设置物体包围盒的8个顶点为人射参考点、设置出射参考点等
帧计算:
- Step1. 计算到场景边界物体的直接光照.直接光照是具有自我发光能力的物体向外发射出的直接照射到其他物体的光照,为了避免与后续计算重复,此处不计算光源照射到场景内部物体的直接光照,只计算光源到场景边界上的直接光照,并将其记录在每个边界面片的数据结构中.
- Step2. 选择一个场景内部的物体,计算它的光照.与以往的方法不同,每一帧都不是计算所有物体的光照,而是有所选择地同时对接收到的直接光照和间接光照进行计算,采用球谐方法并插值.
- Step3. 计算所选择的物体对边界的间接光照.场景内部的物体从周围环境吸收能量,再将部分能量反射到环境中去,这部分就是间接光照.将物体视为一个整体发射间接光能量,这个过程和直接光照非常类似.由于计算时每帧所选择的物体一般不同,所以维护每个边界面片接收到的间接光照能量时只更新当前物体对它的影响.
- Step4. 绘制场景面片.场景每个面片的光能量包括物体自身拥有的光能量和从其他物体处吸收来的光能量2个部分.将能量值转化为颜色值并绘制.
实现
球谐光照
通过以下变换转换
θ,φ
到笛卡尔坐标系:
cos(θ)=xr
sin(φ)=yrsin(θ)=1
cos(φ)=xrsin(θ)=xy
使用笛卡尔坐标系表示结果如下:
- y00(θ,φ)=12⋅1π−−√
- y−11(θ,φ)=−12⋅3π−−√⋅yr
- y01(θ,φ)=12⋅3π−−√⋅zr
- y11(θ,φ)=−12⋅3π−−√⋅xr
- y−22(θ,φ)=−12⋅15π−−√⋅yxr2
- y−12(θ,φ)=−12⋅15π−−√⋅yzr2
- y02(θ,φ)=14⋅5π−−√⋅2z2−x2−y2r
- y12(θ,φ)=−12⋅15π−−√⋅zxr2
- y22(θ,φ)=14⋅15π−−√⋅x2−y2r2
对于光照方程[1],考虑一个diffuse表面时,各个方向行的反射光线均相同,用一个衡量代替。从而有:
L(x,w0→)=k∫SL(x′,wi→)G(x,x′)V(x,x′)dwi
根据特性 [4]可以将 L(x′,wi→) 与其他部分分开处理,从而进一步简化模型 [5]:
L(x′,w0→)=∫SG(x,x′)V(x,x′)dwi
其中 G(x,x′) 也是简单的光线与定点法向量之间的夹角关系,从而计算夹角cos值进行储存即可。