【PBR系列-1】 PBR 核心理论与渲染原理
(一)PBR核心理论与渲染原理
PBR的定义:基于物理的渲染( Physically Based Rendering, PBR )是指使用基于物理原理的微平面理论建模的着色/光照模型、以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。
-
微平面理论:微平面理论是将物体表面建模成做无数微观尺度上有随机朝向的理想镜面反射的小平面(microfacet)的理论。在实际的PBR 工作流中,这种物体表面的不规则性用 粗糙度贴图 或者 高光度贴图 来表示。
-
能量守恒: 出射光线的能量永远不能超过入射光线的能量。随着 粗糙度的上升 镜面反射区域的 面积会增加,作为平衡,镜面反射区域的 平均亮度则会下降。
-
菲涅尔反射: 光线以不同角度入射会有不同的反射率。相同的入射角度,不同的物质也会有不同的反射率。万物皆有菲涅尔反射。 是即 0 度角入射的菲涅尔反射值。大多数非金属的 范围是 0.02~0.04,大多数金属的 范围是0.7~1.0。
-
线性空间: 光照计算必须在线性空间完成,shader 中输入的gamma空间的贴图比如漫反射贴图需要被转成线性空间,在具体操作时需要根据不同引擎和渲染器的不同做不同的操作。 而描述物体表面属性的贴图如粗糙度,高光贴图,金属贴图等必须保证是线性空间 (关于线性空间和gamma空间 可以到常见问题记录里查看)
-
色调映射: 也称色调复制(tone reproduction),是将宽范围的照明级别拟合到屏幕有限色域内的过程。因为基于HDR渲染出来的亮度值会超过显示器能够显示最大亮度, 所以需要使用色调映射,将光照结果从HDR转换为显示器能够正常显示的LDR。
-
物质的光学特性: 现实世界中有不同类型的物质可分为三大类: 绝缘体 (Insulators), 半导体 (semi-conductors)和 导体 (conductors)。
- 渲染和游戏只对: 金属、绝缘体 感兴趣。非金属具有 单色/灰色镜面 反射颜色。而金属具有 彩色镜面 反射颜色。
- 非金属的_(0度角入射的菲涅尔反射值)是一个 float,而金属的是一个 float3
金属和非金属F0范围
核心理论与渲染原理
光与非光学平坦表面的交互原理
光在与非光学平坦表面(Non-Optically-Flat Surfaces)的交互时,非光学平坦表面表现得像一个微小的光学平面表面的大集合。表面上的 每个点 都会以略微不同的方向对 入射光反射 ,而最终的表面外观是许多 具有不同表面取向的点 的聚合结果。

- 表面越粗糙,反射越模糊。反之,越清晰。
- 这些粗糙和光滑都是在微观尺度上的,肉眼尺度下都是光滑的。

从表面折射的光取决于对象本身的特性:
- 对于金属: 折射光 会被吸收。(能量被自由电子吸收)
- 对于非金属:一旦光在其内部折射,表现出 吸收 和 散射 两种行为。
金属反射
非金属,折射的光会进行散射,直到从表面射出
漫反射和次表面散射本质相同
漫反射和次表面散射本质都是 折射光的次表面散射 的结果。。散射距离相较于像素来说微不足道,次表面散射便可以近似为漫反射。也就是说, 光的折射现象,建模为漫反射还是次表面散射,取决于 观察的尺度,如下图。
像素(红色边框绿色底)大于光线离开表面经过的距离,可以当做漫反射处理
像素(红色框绿色底)小于散射距离,需要更加真实的着色效果,要用到次表面散射
PBR的范畴
寒霜(Frostbite)引擎提出,基于物理的渲染的范畴,由三部分组成:
- 基于物理的材质(Material)
- 基于物理的光照(Lighting)
- 基于物理适配的摄像机(Camera)
渲染方程与BxDF(BRDF、BSDF、BTDF、BSSRDF...)

渲染方程和反射方程
渲染方程 (The Rendering Equation) ,描述了光能在场景中的流动。渲染方程在理论上给出了一个完美的结果,而各种各样的渲染技术,只是这个 理想结果的一个近似。
渲染方程的物理基础是能量守恒定律。在一个特定的位置和方向, 出射光 是自发光 与反射光线之和,反射光线本身是各个方向的入射光 之和乘以表面反射率及入射角。
这个方程经过交叉点将出射光线与入射光线联系在一起,它代表了场景中全部的 光线传输。所有更加完善的算法都可以看作是这个方程的特殊形式的解。
某一点的 渲染方程 可以表示为
- :点出射光亮度
- :点发出的光的亮度(自身的亮度)
- :点入射方向到出射方向的反射比例,即
- :点入射光亮度
- :是入射角带来的入射光衰减
- :入射方向的半球积分(累加和)

在实时渲染中我们常用的反射方程,则是渲染方程的简化版本,或者说是一个特例;
相比于上面来说,少了自发光的部分。
是对几种双向分布函数的一个统一表示。
- :双向 反射 分布函数
- :双向 透射 分布函数
- :双向 散射 分布函数,可以看做和的更一般的形式,且有
- :双向 散射表面反射 分布函数,与相比,不同在于可以指定不同光线的入射位置和出射位置。
是最简单,也最常用。因为大多数物体都是不透明的,就完全足够,而往往用于 半透明材质和次表面散射材质。
BSDF = BRDF + BTDF
迪士尼原则的

迪士尼原则的
核心理念
在2012年迪士尼提出,他们的 着色模型是艺术导向(Art Directable)的,而不一定要是完全物理正确(physically correct 的,并且对微平面BRDF的各项都进行了严谨的调查,并提出了清晰明确而简单的解决方案。
迪士尼的理念是开发一种“原则性”的易用模型,而不是严格的物理模型。
迪士尼原则的BRDF(Disney Principled BRDF)核心理念如下:
- 应使用直观的参数,而不是物理类的晦涩参数。
- 参数应尽可能少。
- 参数在其合理范围内应该为0到1。
- 允许参数在有意义时超出正常的合理范围。
- 所有参数组合应尽可能健壮和合理。
参数
以上述理念为基础,迪士尼动画工作室对每个参数的添加进行了把关,最终得到了一个颜色参数(baseColor)和下面描述的十个标量参数:
- baseColor 表面颜色, 纹理贴图 提供。
- subsurface 使用次表面近似控制漫反射形状。
- metallic 金属(0 =电介质,1=金属)。这是两种不同模型之间的 线性混 合。金属模型没有漫反射成分,并且还具有等于基础色的着色入射镜面反射。
- specular 入射镜面反射量。用于取代折射率。
- specularTint 对美术控制的让步,用于对 基础色(base color)的入射镜面反射进行颜色控制。掠射镜面反射仍然是非彩色的。
- roughness: 表面粗糙度,控制漫反射和镜面反射。
- anisotropic: 各向异性程度。用于控制镜面 反射高光的纵横比。
- sheen(光泽度): 一种额外的 掠射分量 (grazing component),主要用于布料。( 掠射分量:入射角接近 时 )
- sheenTint(光泽颜色): 对sheen(光泽度)的颜色控制。
- clearcoat(清漆强度):有特殊用途的第二个镜面波瓣(specular lobe)。
- clearcoatGloss(清漆光泽度):控制透明涂层光泽度,0 =“缎面(satin)”外观,1 =“光泽(gloss)”外观。

迪士尼原则的

漫反射模型(Diffuse BRDF)
求解渲染方程,需要分别求解 Diffuse BRDF 和 Specular BRDF
Diffuse BRDF中主要是分为传统型和物理型:
- 传统型:Lambert
- 物理型:↓

镜面反射模型(Specular BRDF)

这也是基于物理的渲染领域中最活跃, 最主要 的部分。
游戏业界目前最主流的基于物理的 镜面反射BRDF模型 是基于 微平面理论 (microfacet theory)的Microfacet Cook-Torrance BRDF。
假设 微观几何尺度 明显大于 可见光波长, 将每个表面视为 光学平坦 的。光学平坦表面将光线分成两个方向: 反射 和 折射。
镜面反射的方向取决于 微观几何法线 方向,只有恰好正确朝向可以将(入射)反射到 (观察)_方向才对BRDF有贡献。(其他方向有正有负,积分之后相互抵消)
仅有 时,才会将(入射)反射到_(观察)方向。(是半程向量)

当然,并不是所有满足这个条件的点都能够做贡献。会有遮挡的情况发生。_(Microfacet理论假设所有被遮蔽的光(shadowed light)都从镜面反射项中消失;实际上,由于多次表面反射,其中一些最终将是可见的,但这在目前常见的微平面理论中一般 并未去考虑 _)

- 左一:入射方向有遮挡
- 中间:观察方向有遮挡
- 右一:实际上经过多次表面反射,是会可见的。但是microfacet理论会 忽视 这些相互反射。
从物理现象到BRDF
利用这些假设,可以很容易推导出一个被称为Microfact Cook-Torrance BRDF的一般形式的 Specular BRDF 项
- :法线分布函数 (Normal Distribution Function),描述微面元法线分布的概率,即 正确朝向的法线的浓度。即具有正确朝向,能够将来自l的光反射到v的 表面点 的相对于 表面面积的浓度。( )
- :菲涅尔方程(Fresnel Equation), 描述不同的表面角下表面所反射的光线所占的比率。
- :几何函数(Geometry Function),描述微平面自成阴影的属性,即的 未被遮蔽的表面点 的百分比。
- :校正因子(correctionfactor),作为微观几何的局部空间和整个宏观表面的局部空间之间变换的微平面量的校正。
需要注意的点:
- 对于分母中点击,仅仅避免负值是不够的,也必须避免零值。(通常做法在常规 clamp或绝对值 操作后添加 非常小 的正值完成。
- Microfacet Cook-Torrance BRDF是实践中使用最广泛的模型,实际上也是人们可以想到的最简单的微平面模型。
Specular D
法线分布函数(Normal Distribution Function, NDF )也有很多常见的模型
其中业界较为主流的法线分布函数是GGX,因为具有更好的高光长尾:

注意:Normal Distribution Function的正确翻译是 法线分布函数,而不是 正态分布!!!
Specular F
对于菲涅尔项,使用 Schlick的Fresnel近似,因为计算成本低且精度足够:
是即 0 度角入射的菲涅尔反射值。
Specular G
Eric Heitz在[Heitz14]中展示了Smith几何阴影函数是正确且更准确的G项,并将其拓展为 Smith联合遮蔽阴影函数 (Smith Joint Masking-Shadowing Function),该函数具有四种形式:
- 分离遮蔽阴影型 (Separable Masking and Shadowing)
- 高度相关遮蔽阴影型(Height-Correlated Masking and Shadowing)
- 方向相关遮蔽阴影型(Direction-Correlated Masking and Shadowing)
- 高度-方向相关遮蔽阴影型(Height-Direction-Correlated Masking and Shadowing)
其中最常用是最为简单的形式—— 分离遮蔽阴影型。
分离遮蔽阴影
该形式将几何项G分为两个独立的部分:光线方向(light)和视线方向(view),并对两者用相同的分布函数来描述。根据这种思想,结合法线分布函数(NDF)与Smith几何阴影函数,于是有了以下新的Smith几何项:
- Smith-GGX
- Smith-Beckmann
- Smith-Schlick
- Schlick-Beckmann
- Schlick-GGX
Schlick-GGX UE4的方案,基于Schlick近似,将k映射为 ,去匹配GGX Smith方程
基于物理的环境光照(Physically Based Environment Lighting)
有了直接光部分,我们也需要环境光。所以PBR核心知识体系的第六部分是 基于物理的环境光照,一般大家也直接默认环境光照的技术方案是 基于图像的光照 ( Image Based Lighting, IBL )。这也是真正让基于物理的渲染画质提升的主要贡献者。

- 漫反射环境光照部分: 一般采用传统 IBL中辉度环境映射。但是这不是基于物理的特有方案,不讨论
- 镜面反射部分:一般采用 IBL 的方案。要将基于物理的BRDF模型与基于图像的光照(IBL)一起使用,需要求解光亮度积分(Radiance Integral),而求解光亮度积分通常会使用重要性采样(Importance Sample)。
分解求和近似(Split Sum Approximation)
基于重要性采样的思路,将蒙特卡洛积分公式代入渲染方程可得:
直接求解会非常复杂,实时渲染不现实。
目前的主流做法是,基于分解求和近似(Split Sum Approximation)的思路,将
拆分为 光亮度的均值:
和 环境BRDF:
即:
完成拆分后,分别对两项进行 离线预计算,去匹配离线渲染参考值的渲染结果。
在实时渲染中,计算 分解求和近似(Split Sum Approximation) 中的两项(已经预计算好),最后进行组合,作为实时IBL物理环境光照部分的渲染结果。
第一项 预过滤环境贴图(Pre-filtered environment map)
第一项:
可以理解为对光亮度求均值,经过(r是反射方向)假设,仅取决于 表面粗糙度(surface roughness 和 反射矢量(reflection vector。这一项,业界的做法比较统一(包括UE4和COD:Black Ops 2等),采用的方案主要借助预过滤环境贴图,用 多级模糊的mipmap 来存储模糊的环境高光:
直接使用cubemap的mip级采样输入即可
第二项 环境BRDF(Enviroment BRDF)
第二项:
即镜面反射项的半球方向反射率(hemispherical-directional reflectance),可以理解为环境BRDF(Environment BRDF)。
几个决定因素:仰角, 粗糙度, 菲涅尔项
- 仰角:
- 粗糙度:
- 菲涅尔项:通常使用Schlick近似来近似,其仅在单个值上参数化。
近似后,变为三个参数:, , 的函数。
这一项主要有两个实现流派UE4的2D LUT、以及COD : OP2的解析拟合
2D LUT
使用Schlick近似后,可以从积分中分出来
疑问点:
- 明明说是第二项,为什么是渲染方程来进行替换?
上式子留下两个输入:
- 粗糙程度:(Roughness)
- 仰角:
两个输出:
- 缩放
- 向的偏差
即把上述方程看为。预先计算此函数额结果,并且将其存储在2D查找纹理中。(look-up texture, LUT)中 
这张红绿色的贴图,输入roughness、cosθ,输出环境BRDF镜面反射的强度。 是关于roughness、cosθ与环境BRDF镜面反射强度的固有映射关系。 可以离线预计算。
即UE4是通过把Fresnel公式的F0提出来,组成的方式,再将Scale和Offset的索引存到一张2D LUT上。靠roughness和 NdotV进行查找。
解析拟合
Black Ops2的做法是通过数学公式拟合出曲线,将2D LUT用函数来表示:
使用工具:数值积分拟合曲线
基于Blinn - Phong分布的结果:
float3 EnvironmentBRDF( float g, float NoV, float3 rf0 )
{
float4 t = float4( 1/0.96, 0.475, (0.0275 - 0.25 \* 0.04)/0.96, 0.25 );
t *= float4( g, g, g, g );
t += float4( 0, 0, (0.015 - 0.75 * 0.04)/0.96, 0.75 );
float a0 = t.x * min( t.y, exp2( -9.28 * NoV ) ) + t.z; float a1 = t.w;
return saturate( a0 + rf0 * ( a1 - a0 ) );
}
基于GGX分布的EnviromentBRDF解析版本:
//specularColor 就是 F0
float3 EnvDFGLazarov( float3 specularColor, float gloss, float ndotv )
{
float4 p0 = float4( 0.5745, 1.548, -0.02397, 1.301 );
float4 p1 = float4( 0.5753, -0.2511, -0.02066, 0.4755 );
float4 t = gloss * p0 + p1;
float bias = saturate( t.x * min( t.y, exp2( -7.672 * ndotv ) ) + t.z );
float delta = saturate( t.w );
float scale = delta - bias;
bias *= saturate( 50.0 * specularColor.y );
return specularColor * scale + bias;
}
EnvironmentBRDF函数的输入参数分别为光泽度gloss,NdotV,F0。和UE4的做法有异曲同工之妙,但COD:Black Ops 2的做法不需要额外的贴图采样,这在进行移动端优化时,是不错的选择。