博客中排版可能看着没那么舒服,可以看语雀:PBR 学习总结:理论篇
零、前言
1. 什么是PBR
PBR全称Physically Based Rendering,中文是基于物理的渲染。
它是利用真实世界的原理和理论,通过各种数学方法推导或简化或模拟出一系列渲染方程,并依赖计算机硬件和图形API渲染出拟真画面的技术。
PBR只能一定程序上模拟接近真实世界的渲染画面,还不能渲染跟真实世界完全一致的效果,故而叫基于物理的渲染,而非物理渲染。
2. 为什么需要PBR
简单来说就是 传统的经验光照模型 不如PBR效果好,如图


3. PBR的范畴
寒霜(Frostbite)引擎在SIGGRAPH 2014的分享《Moving Frostbite to PBR》中提出,基于物理的渲染的范畴,由三部分组成:
- 基于物理的材质(Material)
- 基于物理的光照(Lighting)
- 基于物理适配的摄像机(Camera)

完整的这三者,才是真正完整的基于物理的渲染系统。
说PBR就是镜面反射采用微平面Cook-Torrance模型,其实是不太严谨的。
本文主要包含的是 基于物理的材质(Material)
一、核心理论
1. 微平面理论 Microfacet Theory
微平面理论是将物体表面建模成无数微观尺度上有随机朝向的理想镜面反射的小平面(microfacet)的理论
真实世界的物体表面不一定是很多微小平面组成,也可能是带有弧度或者坑坑洼洼。但对于我们肉眼能观察到的维度,PBR的微观近似模拟方法产生的结果跟实际差别甚微。

微观尺度上,物体表面有无数的微表面构成。
用粗糙度去衡量一个表面的粗糙程度,表面越粗糙,反射越模糊,表面越光滑,反射越集中。

2. 能量守恒 Energy Conservation
光与介质边界的交互类型
在描述能量守恒之前先了解一下光与介质边界的交互类型:

- 反射(Reflection):光线在两种介质交界处的直接反射
- 折射(Refraction):从表面折射入介质的光,会发生吸收(absorption)和散射(scattering)
- 散射(Scattering):折射率的快速变化引起散射,光的方向会改变(分裂成多个方向),但是光的总量或光谱分布不会改变。散射最终被视作的类型与观察尺度有关:
- 次表面散射(Subsurface Scattering):观察像素小于散射距离,散射被视作次表面散射
- 漫反射(Diffuse):观察像素大于散射距离,散射被视作漫反射
- 透射(Transmission):入射光经过折射穿过物体后的出射现象。透射为次表面散射的特例
- 吸收(Absorption)具有复折射率的物质区域会引起吸收
不同物质与光的交互
上文已经提到,光线入射到两种介质之间平面边界时,会发生反射和折射。
而根据材质光学性质的不同,具有不同的行为表现,从而得到不同的材质外观。
可以将材质根据光学特性,分为金属和非金属两大类,具体行为可以总结如下:
- 金属(Metal)。金属的外观主要取决于光线在两种介质的交界面上的直接反射(即镜面反射)。金属的镜面反射颜色为三通道的彩色,R、G、B各不相同。而折射入金属内部的光线几乎立即全部被自由电子吸收,且折射入金属的光不存在散射。
- 非金属(No-Metal)。非金属即电介质,其的整体外观主要由其吸收和散射的特性组合决定。同样,非金属与光的交互分为反射和折射两部分。而折射按介质类型的散射和吸收特性,分为多类,这里略。
概念:出射光线的能量 永远不能大于 入射光线的能量
表现:随着粗糙度的上升镜面反射区域的面积会增加,作为平衡,镜面反射区域的平均亮度则会下降

能量守恒应用到PBR中,可以用渲染方程来描述
3. 菲涅尔反射 Fresnel Reflection
简单来说,菲涅尔效应即描述视线垂直于表面时反射较弱,而当视线非垂直表面时,夹角越小,反射越明显的一种现象。

4. 线性空间Linear 和 Gamma矫正
光照计算必须在线性空间完成,shader 中输入的gamma空间的贴图比如漫反射贴图需要被转成线性空间
在具体操作时需要根据不同引擎和渲染器的不同做不同的操作。
而描述物体表面属性的贴图如粗糙度,高光贴图,金属贴图等必须保证是线性空间。
5. 色调映射 ToneMapping
也称色调复制(tone reproduction),是将宽范围的照明级别拟合到屏幕有限色域内的过程。
因为基于HDR渲染出来的亮度值会超过显示器能够显示最大亮度,所以需要使用色调映射,将光照结果从HDR转换为显示器能够正常显示的LDR。
6. 真实世界材质的渲染属性
基于物理的渲染的核心理念之一是采用基于真实世界测量的材质光学参数
根据导电特性,可将现实生活中的物质分为三个主要光学类别:
- 电介质(dielectrics),又称绝缘体(Insulators),非金属(no-metal)
- 半导体(semiconductors)
- 金属(metals),又称导体(conductors)

常见材质F0参考

二、渲染方程与BxDF
这里从Games101的笔记中摘抄了一部分
1. BRDF
什么是BRDF?
双向反射分布函数 Bidirectional Reflectance Distribution Function(BRDF)描述的是 入射光 和 反射光关系
- 光线从某个方向进来,打到某个物体之后,往不同的方向上反射,它的能量分布。
- 如果是镜面反射,那它反射出去的方向上分布了所有的能量;
- 如果是漫反射,那进来的能量会被均等的分配到各个不同的出射方向上去
- BRDF就是描述了光线和物体是如何作用的,所以BRDF项定义了物体的不同材质
2. 反射方程 Reflection Equation
反射方程定义的是任何一个着色点,在各种不同的光照环境下,我们考虑任何一个输入的光照的进入方向对出射(观测)方向的贡献,并将所有入射方向的贡献都加起来
简单来说,反射方程就是把来自四面八方的每一束入射光,根据BRDF计算一遍后,全部累加得到的最终亮度

其中:

3. 渲染方程 Rendering Equation
渲染方程在反射方程的基础上在前面考虑了物体本身会发光(Emission,自发光),使其更为通用,所有物体表面的光线传播都可以用这个公式来总结
渲染方程的物理基础是能量守恒定律,某一点P的渲染方程,可以表示为:

其中:


4. BxDF
BxDF一般而言是对BRDF、BTDF、BSDF、BSSRDF等几种双向分布函数的一个统一的表示。
- BRDF:双向反射分布函数 Bidirectional Reflectance Distribution Function
- BTDF:双向透射分布函数 Bidirectional Transmittance Distribution Function
- BSDF:双向散射分布函数 Bidirectional Scattering Distribution Function
- BSSRDF:双向散射表面反射分布函数 Bidirectional Scarttering-Surface Reflectance Distribution Function
其中,BSDF可以看做BRDF和BTDF更一般的形式,且BSDF = BRDF + BTDF(光与介质边界的交互类型中也介绍到,透射为散射的特殊情况)
而BSSRDF和BRDF的不同之处在于,BSSRDF可以指定不同的光线入射位置和出射位置。
在上述这些BxDF中,BRDF最为简单,也最为常用。因为游戏和电影中的大多数物体都是不透明的,用BRDF就完全足够。而BSDF、BTDF、BSSRDF往往更多用于半透明材质和次表面散射材质。

我们时常讨论的PBR中的BxDF,一般都为BRDF,对于进阶的一些材质的渲染,才会讨论BSDF等其他三种BxDF。
三、漫反射BRDF模型(Diffuse BRDF)

Diffuse BRDF可以分为传统型和基于物理型两大类。其中,传统型主要是众所周知的Lambert
四、镜面反射BRDF模型(Specular BRDF)
目前最主流的基于物理的镜面反射BRDF模型是基于微平面理论的Microfacet Cook-Torrance BRDF


其中:
- D(h) : 法线分布函数 (Normal Distribution Function),描述微面元法线分布的概率,即正确朝向的法线的浓度。即具有正确朝向,能够将来自 l 的光反射到 v 的表面点的相对于表面面积的浓度。
- F(l,h) : 菲涅尔方程(Fresnel Equation),描述不同的表面角下表面所反射的光线所占的比率。
- G(l,v,h) : 几何函数(Geometry Function),描述微平面自成阴影的属性,即m = h的未被遮蔽的表面点的百分比。
- 分母 4(n·l)(n·v):校正因子(correctionfactor),作为微观几何的局部空间和整个宏观表面的局部空间之间变换的微平面量的校正。
1. D项
D项的作用:它是一个统计学函数,用来计算在给定的粗糙度下,究竟有多大比例的微平面,其法线方向刚好朝向 h(通过Roughness来控制)
物理本质:微平面法线朝向 h 的密度分布
视觉表现: 决定高光的大小、亮度和衰减边缘
法线分布函数(Normal Distribution Function, NDF)D的常见模型可以总结如下:
- Beckmann[1963]
- Blinn-Phong[1977]
- GGX [2007] / Trowbridge-Reitz[1975]
- Generalized-Trowbridge-Reitz(GTR) [2012]
- Anisotropic Beckmann[2012]
- Anisotropic GGX [2015]
其中,较为主流的法线分布函数是GGX(Trowbridge-Reitz),因为具有更好的高光长尾:


2. F项
菲涅尔效应描述了一个普遍的物理现象:你观察表面的角度越平(掠射角),表面反射的光就越多。
而F项就是用来决定 光线被反射的比例
对于菲涅尔(Fresnel)项,一般都采用Schlick的Fresnel近似,因为计算成本低廉,而且精度足够:

此处F0: 材质在垂直入射时的基础反射率

,n代表介质的折射率(空气的折射率为1)
F0值决定了镜面反射光的百分比
不同材质之间F0的取值不同:(详见查找表)
- 电介质 (Dielectrics): 如塑料、木头、石头、水。
- F0 特点: 非常低(0.02~0.05)。
- 反射颜色: 通常是单色(灰白)的。
- 视觉表现: 直视时几乎不反光,只有在边缘处才会看到明显的反光。
- 导体 (Metals): 如金、银、铜。
- F0 特点: 非常高(通常在0.5~1.0)。
- 反射颜色: 带有色彩(例如黄金是淡黄色)。
- 视觉表现: 无论从什么角度看,反光都非常强烈,且反光带有金属自身的色调。
非金属的F0数值较小,金属F0的数值较大
为了简化计算,通过金属度在一个预设的F0(0.04)和自身颜色之间经行插值。
菲涅尔项的常见模型可以总结如下:
- Cook-Torrance [1982]
- Schlick [1994]
- Gotanta [2014]
3. G项
G项被称为几何函数(Geometry Function), 几何项体现了微表面的自我遮蔽现象,即入射光线或者反射光线会被自身凹凸不平的表面遮蔽。
一般而言,这一项也跟材质的粗糙程度有关,可以理解为越粗超的材质表面越有可能发生自我遮蔽现象。
从视觉表现上来看:G项就决定了这些朝向我们的微平面中,有多少是真正能被看见且被光照到的

几何项G的常见模型可以总结如下:
- Smith [1967]
- Cook-Torrance [1982]
- Neumann [1999]
- Kelemen [2001]
- Implicit [2013]
五、基于物理的环境光照(间接光)

1. 漫反射
漫反射环境光照部分一般采用传统IBL中辉度环境映射(Irradiance Environment Mapping)技术,并不是基于物理的特有方案。
2. 镜面反射
而基于物理的镜面反射(Specular)环境光照,一般会采用基于图像的光照(Image Based Lighting, IBL)的方案。
与直接光相比,IBL把周围环境整体视为一个 大光源,IBL 通常使用(取自现实世界或从3D场景生成的)环境立方体贴图 (Cubemap) ,可以将立方体贴图的每个像素视为光源,在渲染方程中直接使用它。
要将基于物理的BRDF模型与基于图像的光照(IBL)一起使用,需要求解光亮度积分(Radiance Integral),而求解光亮度积分通常会使用重要性采样(Importance Sample)。
重要性采样(Importance Sample)即通过现有的一些已知条件(分布函数),想办法集中于被积函数分布可能性较高的区域(重要的区域)进行采样,进而可高效地计算准确的估算结果的的一种策略。
分解求和近似(Split Sum Approximation)
基于重要性采样的思路,将蒙特卡洛积分公式代入渲染方程可得:

上式的直接求解较为复杂,进行完全的实时渲染不太现实。
因此基于分解求和近似的思路,将上式进行拆分:

完成拆分后,分别对两项进行离线预计算,去匹配离线渲染参考值的渲染结果
第一项 预过滤环境贴图
第一项可以理解为对光亮度求均值
主要借助预过滤环境贴图,用多级模糊的mipmap来存储模糊的环境高光:

也就是说,第一项直接使用cubemap 的mip级别采样输入即可。
第二项 环境BRDF
第二项为镜面反射项的半球方向反射率,可以理解为环境BRDF
这一项的主要流派有两个,UE4的2D LUT,以及COD:OP2的解析拟合。
流派1:2D LUT
使用Schlick近似后, F0可以从积分中分出来:

我们预先计算此函数的结果并将其存储在2D查找纹理(LUT,look-up texture)中

这张红绿色的贴图,输入roughness、cosθ,输出环境BRDF镜面反射的强度
具体的取出方式为:

流派2:解析拟合
通过数学工具中的数值积分拟合出曲线,即将UE4离线计算的这张2D LUT用如下函数进行了拟合:
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;
}
上式中的specularColor即F0
EnvironmentBRDF函数的输入参数分别为光泽度gloss,NdotV,F0。和UE4的做法有异曲同工之妙,但COD:Black Ops 2的做法不需要额外的贴图采样,这在进行移动端优化时,是不错的选择。
其他方案
3D LUT
六、总结
根据毛星云大佬的文章,对PBR的理论知识进行了一个总结。
主要就是很多很多的公式和数学、物理、图形学;
中间略去了一些个人认为没那么重点的内容,后面具体的实现看实战篇
参考
【基于物理的渲染(PBR)白皮书】(一) 开篇:PBR核心知识体系总结与概览
【基于物理的渲染(PBR)白皮书】(二) PBR核心理论与渲染光学原理总结
【基于物理的渲染(PBR)白皮书】(三)迪士尼原则的BRDF与BSDF相关总结
【基于物理的渲染(PBR)白皮书】(四)法线分布函数相关总结
Games101笔记:


-哔哩哔哩.jpg)

渲染大师!ヾ(≧∇≦*)ゝ