随着硬件性能的提升,PBS/PBR已经越来越成为一种趋势。
Unity内置的standard shader都已经默认使用PBR算法。
而学习PBR过程中,有一门必提的知识是“辐射度量学”。
本来我以为我都学会了,毕竟path tracer都写出来了,并且效果看起来很正常。
但是最近在学习全局光照时,突然对“辐射度量学”突然产生了两个疑惑。
-
光线在传播过程中,Radiance是如何体现出,能量随着距离增加而衰减的?
回忆在写path tracing时,代码并没有刻意去计算距离对光线能量的衰减。
而从数学公式上看,在计算光线弹射时,反射方程的输入和输出都是Radiance。
某一单位表面弹射出的某一个方向上的光线A的Radiance值,会在计算被光线A击中物体表面时直接使用。
那么衰减到底在哪里体现的呢?
-
为什么一个物体表面弹射出的光线的Radiance,可以直接被光线击中的物体直接拿来计算?
先看一下定义:
入射Radiance, 单位面积从单位立体角接收到的flux(功率)。
L(p,\omega)=\frac{dE\left(p\right)}{d\omega\cos\theta}
出射Radiance, 单位面和从单位立体角发出的flux(功率)。
L(p,\omega)=\frac{dI\left(p,\omega\right)}{dA\cos\theta}
从定义上看,入射Radiance使用的是接收面和接收方向的立体角,而出射Radiance是出射面和出射方向上的立体角。
那么,凭什么一个物体表面的出射光线Radiance可以直接被照射物体用来计算,而且还可以随距离智能衰减?
是的,所有答案的问题指向立体角,是立体角将他们神奇的联系到一起的。
先复习一下,立体角的定义:d\Omega=\frac{dA}{r^2}
然后回答第一个问题(这里仅考虑 单位表面与光线垂直的情况,所以去掉了cos项):
假设在平面DE上有一个单位表面A,发光表面B发出了一条光线照向A。
根据Irradiance的定义,dE(p)\;=L(p,\omega)\;\ast\;d\omega
。
代入立体角公式就可以得出,单位表面A接收由表面B照射过来的功率为(HG表面积)/(HG离表面A的距离) * Radiance。如果将表面B由HG移动到JI位置,由于JI离表面A更远,单位表面A接收到的单位表面B照射出的功率更小。
那么path tracer是如何利用这一性质的呢,想象一下,从单位表面A发出720根射线,离发光表面B离表面A越近,被表面A的射线击中的次数就会越多,表面A就接收到表面B的能量就越多。
在回答问题1时,假定了第2个问题是毫无疑问的。但是入射Radiance和出射Radiance为什么一定是一样的呢?
我们先来化简一下入射Radiance和出射Radiance的公式。
入射Radiance, L(p_2,\omega_2)=\frac{d^2\phi(p_2,\omega_2)}{d\omega_2dA_2\cos\theta_2}
出射Radiance, L(p_1,\omega_1)=\frac{d^2\phi(p_1,\omega_1)}{d\omega_1dA_1\cos\theta_1}
可以看到入射Radiance和出射Radiance公式完全一样,只不过作为接收平面,他使用是接收平面的面积,立体角,法线与光线的夹角。而作为出射平面,使用的是另一组参数而已。
到止前为止接收Radiance和出射Radiance仅仅是公式相同而已,没有任何迹象表明他们会是同一个值。
借用《Fundamentals of Optics and Radiometry for Color Reproduction》中的一张图,来解释这奇迹的变换。
假设P1点所在的微平面ds1发出一条光线\xrightarrow[{P_2P_1}]{}
照向点P2所在的平面ds2。
由于ds1在立体角d\omega_1
方向上发出的能量被ds2全部吸收,所以\phi(p_2,\omega_2)
= \phi(p_1,\omega_1)
。
根据立体角的定义:
d\omega_2dA_2\cos\theta_2
= \frac{ds_1\cos\theta_1}{r^2}dA_2\cos\theta_2
= ds_1\cos\theta_1\frac{dA_2\cos\theta_2}{r^2}
= ds_1\cos\theta_1d\omega_1
可以得出接收Radiance和出射Radiance是完全相同的量。
嗯,这就是大名鼎鼎的radiance invariance。
ps. 在研究这两个问题过程中,我还有另外一个疑惑,不过这个疑惑随着这两个问题的解决一起解决了。这个问题就是“对于一个微小平面dA, 他在整个单球上发射出的radiance是均匀(完全相等)的么?答案显然否定的,因为dA在整个半球上发射出的I是相同的,根据radiance公式,radiance必然不是均匀的。”
pps. 但是根据Lambert’s Law的漫反射模型,I_\theta=I_n*\cos\theta
,也就是说物体跟光线的夹角会影响接收到的I_\theta
,代入Radiance公式后,radiance在漫反射模型下是均匀的。