我们首先来看看渲染公式的推导,渲染公式表示如下
L(x->x1) =∫(L(x2->x)*BRDF(x2->x,x->x1)*G(x2,x)*dA(x2)
其中L(x->x1)表示x到x1的光的强度,L(x2->x)表示x2到x的光的强度, BRDF(x2->x,x->x1)表示从x2->x,x->x1的BRDF,G(x2,x)=vis(x,x2)*cos(N)*cos(N2)/r^2,N1,N2分别为x,x2的法线和连线的夹角,vis(x,x2)表示x,x2的可视关系,r是x2到x的距离.
我们首先从x2->x的能量传递开始,我们知道从x2到x辐射的能量是:
dP(x2->x) =L(x2->x)*dA(x2)*vis(x,x2)*cos(N2)*dω(x2->x)
根据立体角的定义我们有
dω(x2->x) =cos(N)*dA(x)/r^2;
dω(x->x2) =cos(N2)*dA(x2)/r^2
于是我们就可以得到
dP(x2->x) =L(x2->x)*dA(x)*vis(x,x2)*cos(N)*dω(x->x2)
x2对于x的照度
dE(x2->x) =L(x2->x)*vis(x,x2)*cos(N)*dω(x->x2)
我们知道L=E*BRDF,也就是说亮度=照度*双向反射分布函数,于是我们有:
dL(x->x1) =dE(x2->x)*BRDF(x2->x,x->x1)
=L(x2->x)*vis(x,x2)*cos(N)*dω(x->x2)*BRDF(x2->x,x->x1)
我们在整个半球积分后得到:
L(x->x1) =∫L(x2->x)*vis(x,x2)*cos(N)*BRDF(x2->x,x->x1)*dω(x->x2)
我们把dω(x->x2)使用(cos(N2)/r^2))*dA(x2)替换得到
L (x->x1) =∫(L(x2->x)*BRDF(x2->x,x->x1)*vis(x,x2)*(cos(N)*cos(N2))/r^2*dA(x2)
我们把vis(x,x2)*(cos(N)*cos(N2))/r^2使用G(x2,x)替换这样就得到了最初的渲染公式
L(x->x1) =∫(L(x2->x)*BRDF(x2->x,x->x1)*G(x2,x)*dA(x2)
然后使用我们推导出来的渲染公式来推导辐射度方程,我们知道辐射度方程是在假设整个环境都是理想的Diffuse表面情况下建立的,也就是说在这种假设下BRDF=ρ/PI,并且有B=I*PI;所以我们可以得到在理想Diffuse表面情况下的渲染公式是:
L(x->x1) =∫(L(x2->x)*ρ/PI*G(x2,x)* dA(x2)
PI*L(x->x1) =PI*∫(L(x2->x)*ρ/PI*G(x2,x)* dA(x2)
B(x) =ρ*∫(L(x2->x)*PI*(G(x2,x)/PI)*dA(x2)
B(x)*dA(x) =ρ*∫(L(x2->x)*PI*(G(x2,x)/PI)*dA(x2)*dA(x)
基于我们在辐射度算法中对于环境的假设我们能够得到:
∫B(x)*dA(x)=ρ*∫∫(L(x2->x)*PI*(G(x2,x)/PI)*dA(x2)*dA(x)
B(x)*Ax =ρ*L(x2->x)*PI*∫∫((G(x2,x)/PI)*dA(x2)*dA(x)
=ρ∑B(x2)*∫∫((G(x2,x)/PI)*dA(x2)*dA(x)(这里的dA(x2)只是对片面的积分)
B(x)=ρ∑B(x2)*(1/Ax)∫∫((G(x2,x)/PI)*dA(x2)*dA(x)
这里G(x2,x使用vis(x,x2)*cos(N)*cos(N2)/r^2代替于是有
B(x)=ρ∑B(x2)*(1/Ax)∫∫((vis(x,x2)*cos(N)*cos(N2)/(r^2*PI))*dA(x2)*dA(x)
而∫∫((vis(x,x2)*cos(N)*cos(N2)/(r^2*PI))*dA(x2)*dA(x)就是我们上面提到的形状因子F(x,x2),于是就有:
B(x)=ρ*∫∑B(x2)*F(x,x2)
这样我们就得到了形状因子的表达式和辐射度方程的推导过程。