什么是PBR?
一. 预备知识
PBR就是Physically-Based Rendering的缩写,意为基于物理的渲染。它提供了一种光照和渲染方法,能够更精确的描绘光和表面之间的作用。以前是模拟灯光的外观,现在是模仿光的实际行为。
使用PBR有以下几个优点:
第一,PBR提供了一种稳定的美术工作流程
第二,材质在所有光照条件下看起来都是没有明显的错误。
第三,用PBR方法创建材质更容易,创建材质属性时不再仅仅依靠经验依靠直觉,而是根据真实数据设置。
二、PBR组成部分

灯光属性:直接照明、间接照明、直接高光、间接高光、阴影、环境光闭塞
表面属性:基础色、法线、高光、粗糙度、金属度
1). 灯光属性
I. 光线类型

入射光
直接照明:直接从光源发射阴影物体表面的光
间接照明:环境光和直接光经过反弹第二次进入的光
反射光
镜面光:在经过表面反射聚焦在同一方向上进入人眼的高亮光
漫发射:光被散射并沿着各个方向离开表面
II. 光与表面相互作用类型

直接漫反射:从源头到四面八方散发出来的直接高光
直接高光:直接来自光源并被集中反射的光
间接漫反射:来自环境的光被表面散射的光
间接高光:来自环境光并被集中反射的光
a. 直接漫反射

直接来自光源的光
撞击表面后散落在各个方向
在着色器中使用简单的数学计算
b. 直接高光

直接来自光源的光
反射在一个更集中的方向上
在着色器中使用简单的数学计算
直接镜面反射的计算成本比漫反射低很多
c. 间接漫反射

来自环境中各个方向的光
撞击表面后散落在各个方向
因为计算昂贵,所以引擎的全局照明解决方案通常会离线渲染,并被烘培成灯光地图
d. 镜面反射

来自环境中各个方向的光
反射在一个更集中的方向上
引擎中使用反射探头,平面反射,SSR,或射线追踪计算
2) 表面属性
(1)基础色

定义表面的漫反射颜色
真实世界的材料不会比20暗或比240 sRGB亮
粗糙表面具有更高的最低~ 50srgb
超出范围的值不能正确发光,所以保持在范围内是至关重要的

基础色贴图制作注意点:
不包括任何照明或阴影
基本颜色纹理看起来应该非常平坦
使用真实世界的度量或获取最佳结果的数据
(2)法线

定义曲面的形状每个像素代表一个矢量
该矢量指示表面所面对的方向即使网格是完全平坦的
法线贴图会使表面显得凹凸不平
用于添加表面形状的细节,这里三角形是实现不了的
因为它们表示矢量数据,所以法线贴图是无法手工绘制的
(3)镜面

用于直接和间接镜面照明的叠加
当直视表面时,定义反射率
非金属表面反射约4%的光
0.5代表4%的反射
1.0代表8%的反射但对于大多数物体来说太高了
在掠射角下,所有表面都是100%反射的,内置于引擎中的菲涅耳项

镜面贴图制作注意点:
高光贴图应该大多在0.5
使用深色的阴影来遮盖不应该反光的裂缝
一个裂缝贴图乘以0.5就是一个很好的高光贴图
(4)粗糙度

表面在微观尺度上的粗糙度
白色是粗糙的
黑色是光滑的
控制反射的“焦点”
平滑=强烈的反射
粗糙=模糊的,漫反射

粗糙度贴图制作注意点:
没有技术限制-完全艺术的选择
艺术家可以使用这张地图来定义表面的“特征”,并展示它的历史
考虑一下被打磨光滑、磨损或老化的表面
(5)金属度

两个不同的着色器通过金属度混合他们
基本色变成高光色而不是漫反射颜色
金属漫反射是黑色的
在底色下,镜面范围可达100%
大多数金属的反光性在60%到100%之间
确保对金属颜色值使用真实世界的测量值,并保持它们明亮
当金属为1时,镜面输入将被忽略

金属度贴图制作注意点:
将着色器切换到金属模式
灰度值会很奇怪,最好使用纯白色或黑色
当金属色为白色时,请确保使用正确的金属底色值
没有黑暗金属这回事
所有金属均为180srgb或更亮
3). 金属度与非金属单对比

非金属
基础颜色=漫反射
镜面反射=0-8%
金属
基础颜色=0-100%的镜面反射
镜面=0%
漫反射总是黑色的
三. PBR的两种工作流程
Metallic/Roughness(金属值/粗糙度);
Specular/Glossiness(镜面反射/光泽度)

1.Albedo
可以理解为物体的基础色Base Color,即该物体本身颜色,也是漫反射光的颜色。
其实该颜是色光的折射被物质吸收并形成漫反射后,成为不同波长的光,这就赋予了物体颜色。比如说物体呈现蓝色,是因为其把除了蓝色的光都吸收了,散射出来的光的波长是在蓝色所在范围内。
2.Metallic
即金属度,表示了反射时发生镜面反射和漫反射的光线的占比。
Metallic度越大,发生镜面反射的占比越大,漫反射diffuse占比越小,一般金属物体的金属度比较大:70% ~ 100%之间;
Metallic越小,发生镜面反射的占比越小,漫反射diffuse占比越大,一般非金属物质金属度比较小;2% ~ 5%之间,宝石的大概8%;
金属是没有漫反射的,折射进表面的光照全部被吸收。但是一些腐蚀性的金属,其腐蚀的部分具有漫反射。
3.Specular
这个没什么好说的,就是镜面反射,对于非金属物质,其镜面反射的sRBG范围在40 ~ 75;对于金属物质,其sRGB范围在155 ~ 255
其也是表示0度时的菲涅尔系数RF(0°)。
4.Roughness
即粗糙度,其与Smoothness(光滑度,也称为Glossiness光泽度)相反。其表示了物体表面的不规则程度,决定了在发生镜面反射时入射光线与法线的夹角大小。
粗糙度roughness越大,镜面反射的出射光线分散的角度就越大,光照越模糊;
粗糙度roughness越小,镜面反射的出射光线分散的角度就越小,光照越尖锐;
5.Metal-Roughness
在Metal-Rougnness流程中,分别对应BaseColor,Roughness,Metallic这三个参数;
在Metal-Roughness流程中,只要按照流程,分别设置好BaseColor,Roughness,Metallic,就可以基本确定物体材质的视觉效果;
6.Specular-Glossiness
在Specular-Glossiness流程中,参数发生了变化,分别为Diffuse,Glossiness,Specular三个参数;
在Specular-Glossiness流程中,Diffuse和Specular共同决定了物体的basecolor,和表面镜面反射和漫反射的比例,与第一种流程的区别在于,此流程直接指定确定的占比值,第一种是根据Metallic属性,自动匹配相应的占比值;
通过上面的介绍,我们可以只知道,在真实的生活中,视觉效果的呈现,主要取决于:
自然光照下,物体呈现的颜色(BasedColor/Albedo);
物体表面对光线的镜面反射角度(Roughness);
物体表面对光线镜面反射和漫反射的比例(Metallic/Specular);
两个流程的共同贴图
最右侧三张贴图 AO,normal,height都是为了增加材质贴图的细节,使得其看起来更真实。
AO贴图 (ambient occlusion map)AO贴图会根据模型某一部分相对于其他组成部分或者其他模型之间的几何距离,模拟模型的光影效果,比如一些夹角会更暗或者更亮,某一些面因为其他模型部分的影响,可能光照更少。
法线贴图(normal map)normal贴图会根据光照环境,优化模型表面的光影效果,比如一些凸起凹陷等细节;
高度贴图(height map)height贴图会给模型本身根据实际需要增加凸起或者凹陷的几何效果。比如木质模型,某处被敲打而导致的凹陷效果。
四、各自的优劣
1、Metal/Roughness工作流:
优势:
非导体的F0都是固定的,所以美术在使用时不容易出错。
纹理缓存压力小,因为Metallic和Roughness都是灰度贴图。
是目前兼容性最好的工作流。
劣势:
非导体的F0固定为0.04,但其实想要改动也是可以的。
白色边缘问题明显,尤其是低分辨率下。
2、Specular/Glossiness工作流
优势:
产生的黑边较于M/R工作流的白边更能接受,没有那么明显。
可以在镜面反射贴图中对F0自由调整。
劣势:
因为F0可以自由调整,所以可能会导致美术输入错误的值从而打破能量守恒。
因为有两张RGB贴图,对性能要求更大。
需要美术对PBR的理解更高,才能正确制作各种贴图。

linear模式
在PBR流程中,环境光线效果需要使用linear模式,原来的gamma模式不再适用。因为gamma模式本身是为了使其他技术渲染出来的模型具有更真实而效果,对环境光进行了修正。但是在pbr中,贴图在设计的时候,完全是按照真实的环境中的光照去计算的,所以此处不再需要修正。
这里补充一些色彩空间的知识:
linear(线性色彩空间)和srgb,HDR区别
人眼有光线自适应的特性,这样也是能让人在暗的场景里看到更多东西,在亮的场景里能分辨更多东西,这种效果一般从电影院这样昏暗的场所里走出来更能体会,眼睛会有一个慢慢适应的过程。现在摄像头一般也会自适应曝光度,但是工业需求的有些还是需要不自动的,三维渲染之中,如果把这种真实完全模拟的图像给人眼看到,会感觉比我们人眼看到灰暗的多,所以一般会在硬件方面做一个反曲线最后变成srgb的色彩空间让人看到。
游戏引擎里面最终效果给人看到,当然是这种强化过的适应人眼的色彩空间,但是我做光照计算和贴图就不行,因为会由于多次的色彩强化导致最终画面强烈失真,这时候就是需要linear的色彩空间,计算时候用真实色彩,直到输出这一步把色彩强化一遍以适合人眼。unity很早就是linear的色彩空间,但是由于后期最后一部的矫正方面很多从业人士的素养不足,或者完全没有这个意识,做出来的效果完全是不正确,或者缺乏调整弹性的。而unreal则在工作流上面几乎是整合和后期的色表,去解决这个问题。
而HDR是模拟人眼的过程,能看到更广范围的光(就是亮的时候能更亮瞎),HDR图像的一般色域也超过普通的RGB色域(但也可以不超过)。HDR在unity中需要勾选摄像机上的HDR选项和使用延迟渲染deferred才能(否则会有滤镜提示The camera is not HDR enabled 这是没使用延迟渲染),要看出效果还要加个bloom之类的

Unity中的PBS
先来看看PBR和PBS的关系:
PBR(Physically Based Rendering)是一种渲染方式,它使用的材质是PBS(Physically Based Shader),中文名:基于物理的渲染技术。可以对光和材质之间的行为进行更加真实的建模。(之前我们已经聊过一种简单的建模,标准光照模型)PBS只考虑材质在真实物理环境下应该有的效果。PBR包括的范围会更广一些,比如GI/AO/SUN等复杂情况,这些东西加上PBS,才是PBR。
Unity中的PBS即是把PBR算法(具体算法实现请等待下回分解)封装起来,只用修改PBS的参数就能达到PBR的效果。
在Unity中,PBS分为两类,一个叫做Standard,一个叫做Standard(Specular Setup),我们把它称为标准着色器的高光版,它们共同组成了一个完整的PBS光照明模型,而且非常易于使用。
Standard(Specular Setup)
其使用流程为:


可以发现Standard(Specular setup)对应的即是我们上面讲的Specular-Glossiness流程。
其中Albedo贴图即是物体的BaseColor,Specular贴图反映了物体的Specular值,Smoothness反映了物体的光滑度(即Roughness)。
Standard
其使用的流程为:


可以发现其与Standard(Specular Setup)不同的是Specular贴图替换成了Metallic贴图。Metallic贴图对应的是材质的金属度,Standard所对应的即是我们上面提到的Metal-Roughness流程。
Standard与Standard(Specular setup)比较

下面借用UWA的一张图,综述一下Unity中PBS的工作流程。如果把standard shader想成一个黑盒子,想要计算材质球在不同光照情况下的颜色。PBS最核心是BRDF函数,输入分为两类:第一类是材质的属性(几何信息、位置、法线等),材质的颜色信息(不管用金属工作流还是高光工作流,本质上都是为了得到漫反射颜色和高光颜色)。这样材质信息就准备好了。第二类输入是光照部分,光照部分分为两类,直接光照(平行光/点光/聚光灯的颜色和方向),间接光照。间接光照又分为两类,一类是漫反射光源(Unity的光照探针和lightmap),第二类是高光光源(Unity的反射探针)。
技术引用:
pbr: http://richbabe.top/2018/06/25/%E6%8E%A2%E7%A9%B6PBR%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%B5%81%E7%A8%8B%E4%BB%A5%E5%8F%8AUnity%E4%B8%AD%E7%9A%84PBS/
PBRUE4理论:
https://zhuanlan.zhihu.com/p/342484575
BRDF算法:
https://zhuanlan.zhihu.com/p/307858836