上文简单过了一遍Unity Standard材质,而Standard材质的核心便是UNITY_BRDF_PBS函数,Unity的BRDF模型。本文主要的目的就是根据资料分析BRDF模型,加深对Unity BRDF的理解。

上来先开门见山说明下BRDF,双向反射分布函数(Bidirectional Reflectance Distribution Function),用来定义给定入射方向上的辐射照度(irradiance)如何影响给定出射方向上的辐射率(radiance)。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布——这可以是从理想镜面反射漫反射各向同性(isotropic)或者各向异性(anisotropic)的各种反射,而我们在Unity里面使用BRDF模型的目的就是为了模拟真实光照。那我们首先来回顾下光照以及Unity的光照模型。

光照现象

只要学过基础物理课程的,对光学都有大概的了解,光是由光源发出,物体本身的颜色是因为该物体可以反射更多对应颜色波长,吸收了其他颜色波长。在光学中,用来定量描述辐射能强度的量有两类,一类是物理的辐射度量学,是用能量单位描述光辐射能的客观物理量。另一类是生理的光度量学,是描述光辐射能为平均人眼接受所引起的视觉刺激大小的强度,我们暂不讨论。

辐射照度即辐射度(irradiance)的定义就是投射在单位面积上的辐射通量。

E_{{\mathrm  {e}}}={\frac  {\partial \Phi _{{\mathrm  {e}}}}{\partial A}},

where

以平行光l为例,它的辐射度可以通过计算垂直于l的单位面积上单位时间穿过的能量。物体表面通常和l不垂直,由下图可以得出倾斜的光在单位面积上接收的光线数量要更少一些,可以得出辐射度与d/cosθ成反比,cosθ可以通过光源与表面法线的点积得到。

而光线照射到物体表面会有两种结果,散射和吸收。散射只改变光线的方向,不改变光线的密度和颜色。而吸收只改变光线的密度和颜色,不改变光线的方向。散射后光线会有两种方向,到物体内部的称为折射,到物体外部的称为反射。为了区分这两种散射现象,我们在光照模型中分别用Specular(高光反射)模拟表面反射,Diffuse(漫反射)来模拟光线折射、吸收以及重新散射出去的部分。

而出射光线的方向和数量,同样有着量化的单位。辐射出射度即出射度(Radiant exitance)的定义就是辐射体在单位面积内所辐射的通量。

M_{{\mathrm  {e}}}={\frac  {\partial \Phi _{{\mathrm  {e}}}}{\partial A}},

where

光照模型

辐射度和出射度之间是满足线性关系的,它们之间的比值就是材质的高光反射和漫反射属性。而着色(shading)指的是,根据材质属性、光源信息,使用一个等式去计算某个方向出射度的过程。同时我们也把这个等式称为光照模型(Lighting Model)。

光照模型有很多的种类,早期的游戏引擎只使用一个光照模型,这个模型就是标准光照模型。也就是Phong光照模型,是由裴祥风提出的使用漫反射(兰伯特模型)和高光反射的和来对反射光线进行进行建模,并且提出了基于经验计算高光反射的方法,之后Blinn模型简化了高光反射部分的计算而衍生出了Blinn-Phong光照模型。运算简单,适合早期硬件实现,在显卡只支持固定管线(Fixed Pipeline)的年代,Blinn-Phong模型是设计在显卡硬件中的,OpenGL/Direct3D固定管线的光照模型就是Blinn-Phong模型。

Unity的标准光照模型包含了环境光、自发光、漫反射、高光反射。但是这类光照模型都有一个共同的缺陷,就是各项同性(isotropic)即我们固定视角和光源方向旋转表面,反射不会发生任何变化。如果应用到各项异性(anisotropic)的表面上如毛发、拉丝金属,光照的不真实性就会凸显。而且如果想要模型渲染出高质量的图像,需要繁复地调参数。

近几年比较流行的次时代游戏基本上都采用了PBR技术,然而基于物理的渲染已经提出好多年了。基于物理的、保能量的渲染模型可以很容易地建立出在不同光照环境下都接近真实的材质表现。事实上基于物理的渲染并不会比传统上的经验模型更难实现,计算量也相差不多。不过在Unity中,在传统的经验模型下,我们通常会采用离线渲染的方式烘焙光照贴图,规避实时光带来的额外计算量。

BRDF

在有了上面的理论基础,我们再来看BRDF函数本身,就没有那么难理解了。概况地说,BRDF是一个抽象的工具用来描述光子撞击材料的宏观行为,这样说可能比较难理解,我们用BRDF的目的就是给定一个入射方向后,算出所有出射方向上的反射和散射的光线分布。

The BRDF of nylon viewed in the Disney BRDF Explorer. The cyan line represents the incoming light direction, the red peanut object is the amount of light reflected in the corresponding direction.

用f(I,v)来表示的话(I为入射方向,v为观察方向),当光线沿着入射方向I到达表面的时候,f(I,v)表示了有多少能力反射到了观察方向v上。

f_{\text{r}}(\omega _{\text{i}},\,\omega _{\text{r}})\,=\,{\frac {\operatorname {d} L_{\text{r}}(\omega _{\text{r}})}{\operatorname {d} E_{\text{i}}(\omega _{\text{i}})}}\,=\,{\frac {\operatorname {d} L_{\text{r}}(\omega _{\text{r}})}{L_{\text{i}}(\omega _{\text{i}})\cos \theta _{\text{i}}\,\operatorname {d} \omega _{\text{i}}}}

未完待续...

References:

  1. BRDF
  2. 基于物理着色:BRDF
  3. 基于物理着色(四)- 次表面散射