标量三重积(Scalar Triple Product)
a⋅(b×c)
它的结果是一个标量,表示由三个向量/(a,b,c)构成的平行六面体体积。
a⋅(b×c)=axbxcxaybycyazbzcz
循环交换不改变结果:
a⋅(b×c)=b⋅(c×a)=c⋅(a×b)
但是交换任意两个向量会变号:
a⋅(c×b)=−a⋅(b×c)
Snell 折射定律
设入射方向I,法线N,通常约定I指向表面。
定义:
cosθi=−I⋅N
根据 Snell 定律:
n1sinθi=n2sinθt
令η=n1n2,用三角变换,则:
k=cos2θt=1−η2(1−cos2θi)
判别:若k<0则无实数解,发生全反射。否则正常折射,方向:
T=ηI+(ηcosθi−k)N
Möller–Trumbore 光线-三角形求交算法
射线:
P=O+tD
三角形:
P=P0+uE1+vE2
所以:
O+tD=P0+uE1+vE2
整理得非齐次方程组:
tD−uE1−vE2=P0−O
写成矩阵形式:
[−D, E1, E2]tuv=P0−O=S
根据 Cramer 法则,方程组 Ax=c 有解当且仅当 detA=0,且 xi=detAdetAi,Ai 为第 i 列被 c 替代的系数矩阵。
因此有
t=det(S,E1,E2)/det(−D,E1,E2)
根据向量三重积性质
t=E1⋅D×E2S×E1⋅E2
同理:
u=E1⋅D×E2S⋅D×E2
v=E1⋅D×E2S×E1⋅D
即有
tuv=E1S21S1E1S2SS1D
其中
S1S2S=S×E1=D×E2=P0−O
且
detA=E1S2=0
一次性解出三个几何参数。
BRDF
立体角
立体角 ω 具有如下微分形式:
dω=r2dA
面积微元在球面坐标系下可以写成:
dA=(rdθ)(rsinθdϕ)=r2sinθdθdϕ
因此:
dω=r2dA=sinθdθdϕ
Radiant Intensity:辐射强度
光源向某个方向,每单位立体角辐射多少功率。
I(ω)=dωdΦ
其中:
- Φ:光通量Radiant Flux
- ω:立体角
- dΦ:微小立体角
Irradiance:辐照度/辉度
单位面积表面接收到多少辐射功率。公式:
E=dAdΦ
Radiance:辐亮度
从某个表面位置、沿某个方向传播的单位面积、单位立体角上的辐射功率。
定义:
L=dA⊥dωd2Φ
其中:
dA⊥=dAcosθ
因此:
L=dAcosθdωd2Φ
单位:
W/(m2⋅sr)
Lambert’s Cosine Law
如果光从方向ω入射到表面:
dE=L(ω)cosθdω
其中:
cosθ=n⋅ω
因此:
E=∫ΩL(ω)(n⋅ω)dω
BRDF(Bidirectional Reflectance Distribution Function,双向反射分布函数)
物理定义:
fr(x,ωi,ωo)=dEi(x,ωi)dLo(x,ωo)
其中:
- x:表面上的位置
- ωi:入射光方向(向外)
- ωo:出射光方向
- dLo:沿 ωo 方向产生的出射 Radiance
- dEi:来自 ωi 方向的微分 Irradiance
即
fr(ωi,ωo)=LicosθidωidLo
移项积分:
Lo(ωo)=∫Ωfr(ωi,ωo)Li(ωi)cosθidωi
如果考虑自发光,即有渲染方程(rendering equation):
Lo(ωo)=Le(ωo)+∫Ωfr(ωi,ωo)Li(ωi)(n⋅ωi)dωi
光源推广到多次反射,简写为
L=E+KL
其中L为递归定义的。
Monte Carlo 积分:
I≈N1i=1∑Np(xi)f(xi)
代入得Monte Carlo光线追踪方程:
Lo≈Le+N1i=1∑Np(ωi)fr(ωi,ωo)Li(ωi)cosθi
为了提高效率,在光源dA上采样(直接光照),立体角和光源面积微分的关系如下:
dω=∣∣x′−x∣∣2dAcosθ′
重写渲染方程
Lo(ωo)=∫Ωfr(ωi,ωo)Li(ωi)∣∣x′−x∣∣2cosθcosθ′dA
其他间接光照,采取俄罗斯轮盘赌(RR)算法。