在计算机图形学中,我们为了能够对现实进行模拟,有很多的模型,比如说lambert模型,phong模型,blinn-phone模型等,这些模型简单,高效,但是这些模型都存在一个共性的问题,就是不真实,因为它们并不是对光的效果的真实模拟,从最初的设定和假设上就是有问题的。为了解决这个问题,大神kajiya在1986年提出了渲染方程,使得我们能够对物体进行真实的渲染。
基础概念
在引入渲染方程前,我们首先需要引入一些新的概念。
radiant Energy 表示辐射出的总能量
Q
,单位是焦耳(J)radiant Flux 表示单位时间的辐射量,单位是瓦特(W)
radiant Intensity 表示单位立体角接收到的单位能量
solid angle立体角,这是个空间的概念,是物体对特定点的空间的角度,如下所示
有了上图,我们可以得到单位立体角
- Inradiance 表示一个单位表面上收到的radiant flux
radiance 这个是图形渲染的主要概念,它的概念如下所示
1
The radiance (luminance) is the power emitted, reflected, transmitted or received by a surface, per unit solid angle, per projected unit area.
单位立体角,单位投影面积下,物体表面发射,反射,接收到的能量。
这里的$cos\theta$,是因为定义里面有
per projected unit area
,因为投影面积也会影响到接收的能量,如下所示:(在lambert模型里就有这一项,同时地球的不同纬度的四季变化也可以说明这一点。)
Incident Radiance 到达表面的单位立体角的irradiance
Exiting Radiance 离开表面的单位投影面积的Intensity
Irradiance vs. Radiance
Irradiance: total power received by area dA
Radiance: power received by area dA from “direction” dω
BRDF
BRDF 是双向反射分布函数,听这个名字很高大上,实际上是一个比较简单的概念。先思考下,我们为什么能够看见物体,是因为物体表面反射了光,被我们的眼睛捕捉到了。也就是说我们看到的物体的形状颜色,都是反射的结果。
The Bidirectional Reflectance Distribution Function (BRDF) represents how much light is reflected into each outgoing direction from each incoming direction
The Bidirectional Reflectance Distribution Function (BRDF) 表示从每个入射方向有多少光线被反射到每个出射方向。
渲染方程
有了BRDF,那么对于一个单位表面,我们对其进行半球积分,就可以得到指定方向的所有的出射能量
如果再加上物体本身的发光,则就可以得到下面 的方程,这就是大名鼎鼎的渲染方程
渲染方程的理解
从上面的公式我们可以得到,人看到的光就是物体自身发出的光加上反射的其他光源的光。那么渲染的结果本质上就是Lr。
现在我们看上面的渲染方程,Le已知,brdf已知,入射角度已知,未知的是Li。
对上面的等式,我们对其进行规范化,就会得到下面的式子:
对应的离散化表达如下:
对式子求解,并应用二项式分解,可以得到
从上面的式子我们就可以看出,物体指定表面的渲染结果是这一点本身的发光E,加上这一点反射的光, 加上这一点反射的别的点反射过的的光,等等等。如下所示:
这也就很直观的解释了为什么光栅化的效果并不如光线追踪更加现实的原因了,因为光栅化只是计算了本身的光以及直接光照,没有反应间接光照。