什么是基于物理渲染(PBR)?
传统3D材质制作方法是基于艺术家的手艺的,由美术根据个人评估绘制Diffuse贴图调整颜色后进行渲染。好处是画成什么颜色就是什么颜色,制作流程简单修改直观,缺点则是质量不稳定,难以标准化和做进一步的细致分工,导致游戏制作规模受到人力限制;此外,在复杂变化的光照环境下,仅通过RGB值定义的贴图往往无法达到足够的拟真感。
基于物理渲染的本质,则是通过对真实世界的物理现象进行逼近、模拟、再现,使3D对象在不同环境下都能展现出逼真的渲染质感,并通过材质的参数化将材质制作这一手工业流程转化为标准化流水化的工业流程。
为了实现这个目标,对于贴图的定义就不能再只是传统的RGB值,而是一系列与真实光学现象有关的实际测量物理参数;由于对于一个特定的物理材质,其物理参数总是恒定的,这也使得通用材质库成为可能。
以上,可以很容易归纳出PBR的三块核心内容:
与人类视觉有关的真实光学现象/过程有哪些
一个基于物理渲染的材质球应该具有哪些对应的参数
接收参数后,如何完成渲染过程获得最终输出的显示色彩
视觉基础眼睛如何看见物体
眼睛如何看见物体
一切皆为光的反射,PBR的本质也就是算法模拟光学过程。
光照Lighting、着色Shading、感光Sensitising即是一次完整视觉过程的三个步骤,后面会依次讲到……
人眼能感受到的光
颜色由光的波长决定,与一些散射/衍射现象有关
光照Lighting
基础计量单位
球面度(sr)
立体角的国际单位。它可算是三维的弧度。以r为半径的球的中心为顶点,若展开的立体角所对应的球面表面积为r2,该立体角的大小就是一球面度。球表面积为4πr2,因此整个球有4π个球面度。
坎德拉(cd)
定义光源亮度的单位。1cd = 1/683W / sr,约为一支蜡烛的亮度,或220V下1W白炽灯的亮度。之所以会这样是因为这个单位在制订时就考虑到了人的视觉……
流明(lm)
光通量单位,用于衡量在空间中传播的光的强度。1坎德拉的点光源向周围的球形空间内投射出的光通量为 4π流明(或者1球面度流明)
勒克斯(lux)
照度单位,用于衡量一块面积上受到的光照强度。1勒克斯= 1流明/平米 = 1坎德拉/球面度。
平方反比定律
光照与距离远近的平方成反比例衰减。即对于一个光源,若距离该光源距离为r的固定面积上的光通量为x,则距离该光源2r处同样面积上的光通量为1/4x。(基于能量守恒)
散射/折射
光照与距离远近的平方成反比例衰减。即对于一个光源,若距离该光源距离为r的固定面积上的光通量为x,则距离该光源2r处同样面积上的光通量为1/4x。(基于能量守恒)
米氏散射
当介质内微粒直径>=入射光波长时,会发生米氏散射。云/雾等基本均为米氏散射。其特点为:
大部分入射光线会沿着前进的方向进行
微粒半径会改变米氏散射模型(具体来说是光线偏折角度及偏折比例)
对于自然环境影响如下:
瑞利散射
当介质内微粒直径<=入射光波长的十分之一时,会发生瑞利散射。瑞丽散射的散射强度与光波长的4次方成反比,因此短波长的蓝光的瑞利散射更剧烈。因此天空是蓝色的而阳光则偏黄。
IES Light
照明工程协会(Illuminating Engineering Society),提供了标准化的照明灯具的光度学数据(PhotometricProfile)数据,PBR光源制作时的重要数据来源。
IES Light = 最大光强(坎德拉) * IESPhotometric Profile
灯光色温(K)
色温低则偏暖,色温高则偏冷。
几个可供参考的色温值:
晴朗蓝天 10000-12000K
多云有雨 8000-10000K
薄雾 6500-8000K
日光型荧光灯 6500K
正午阳光 5500K
电子闪光灯 5500K
早晨或下午的阳光 4000-5000K
摄影棚灯光 3000-4000K
石英灯 3500K
钨丝灯具 2700-3200K
黎明、黄昏 2000-3000K
烛光 1800-2000K
灯光类型
平行光、点光、面光。
着色Shading
PBR中,Shading的本质其实就是计算材质对入射光的反应,因此会牵涉到以下两个内容:
材质本身的物理参数
光线反射计算模型
双向反射分布函数(BRDF)
BRDF:Bidirectionalreflectance distribution function,基本式为:,用于定义光线在不透明表面反射的函数,其中变量包括:光的入射角、不透明表面法线、光线反射角,函数返回值为反射光线与入射光线的辐射率比值。
这一函数实际上是对于真实世界光照的简化逼近,将真实世界中复杂的光照反射过程简化成基于反射点单点的概率分布函数:
获取一种材质的BRDF,有三种方法:
基于经验。也就是开发人员根据自己的经验推测出的公式(例如200多年前就存在了的用于描述粗糙表面光线反射的Lambert光照模型)
基于物理模型。根据物理理论创立的数学模型,后面会详细介绍
数据驱动模型。用仪器测量并导出数据,简单省事儿……(随手网上找了张不怎么高大上的图)
物理着色模型的基本原则
一致性:入射光源与观察摄像机交换位置后,得到的反射计算结果应该等价(即光路可逆)
能量守恒:入射光线能量 >= 反射光线总能量
恒为正值:传播正能量
经典通用模型
Pixar与1990年首先定义的渲染模型,沿用至今,该模型下,观察者所见到的材质某一点的颜色 = ambient + diffuse + specular,如下图:
Diffuse即漫反射,之后会详细介绍。
Specular为高光反射,之后会详细介绍。
Ambient为环境光,这里没有展开细说……
漫反射 Diffuse
漫反射实际上是光在射入物体表层后,在物体内部折射散射后,再离开物体表面后形成的,后面有几个简化的数学模型,用于近似模拟这一过程。
Lambert模型
Lambert模型是最简单的光照模型,该模型认为当光照射到一个粗糙表面时,会向周围均匀反射(各向同性),反射光的强度与(入射光方向和反射点处法线夹角的余弦)成反比。
Oren-Nayar模型
基于Lambert光照模型的改良,该模型认为材质表面可以视为由多个不同法线的光滑Lambert表面所构成粗糙表面,但每个子表面的光线反射可以用Lambert模型进行描述。因此在这个模型可以视为多了一个“粗糙度”参数的Lambert模型,或者可以将Lambert模型视为粗糙度=0的Oren-Nayar模型。
模型公式中可以看到有个重要的参数ρ,表示反照率。
模型参数:反照率(Albedo)
物体反射光辐射量与入射光辐射量之比即为反照率。在3D制作中,这代表一张正确的Diffuse贴图。而所谓“正确”的Diffuse贴图,需要满足以下条件:
不受漫反射光线以外的额外光线影响(例如高光、环境光、阴影等)
不受曝光偏差影响亮度
不受色温影响色相
一旦Diffuse贴图制作不满足以上三条要求,整个PBR渲染出来的结果就会与实际严重不符,所以要获得正确的Diffuse贴图也需要一些方法……
色卡法。在拍摄取材时使用标准色卡,之后可根据色卡调整照片的色温及曝光。但这个方法无法消除材质上的高光。
交叉偏正法。在专门的封闭空间内,使用偏振光照明,用偏光滤镜过滤高光反射,再拍摄取材。缺点嘛就是麻烦……
高光 Specular
目前普遍采用Cock-Torrance模型,该模型类似Oren-Nayar模型,也认为材质表面有无数个法线各异的微表面,但不同之处是,Cock-Torrance模型中,这些微表面仅进行镜面反射。由于是镜面反射,一旦给定了入射光源,每一个微表面将仅有一道反射光。
在该模型中,当且仅当观察者视线与反射方向光线重合时(亦即反射光线可以抵达观察者摄像机),对应的微表面才被激活,而未被观察到的微表面则不被激活。
在高光反射过程中,会牵涉到这么几个玩意:
微表面相关的分布函数
几何衰减函数(根据经验人工修正简化数学模型导致的问题)
菲涅尔函数(用于处理菲涅尔现象)
接下来会解释这三者。
分布函数
分布函数用于描述材质微表面的显微结构,或者说描述其微表面的粗糙度,其范围在0-1之间,数值意义为微表面斜率的平方根(即粗糙度越大,则微表面倾斜更厉害)
几何衰减函数
在现实世界中,崎岖的表面会对入射光线和反射光线都发生遮挡,如果忽视这一现象直接应用微表面计算高光时就会出现一个问题:粗糙的表面实际上大大增加了反射表面积,会导致直接计算得出的反射光能量高于入射光能量总和,违反了能量守恒定律。因此需要引入几何衰减函数修正反射光光量。在做光线遮挡修正时一般仅考虑入射光被遮挡和反射光被遮挡这两种情况,现实世界中还会出现光线的多次反射,一般就都忽略了,实在是做不到啊……
现存的分布函数即几何衰减很多,基本都是基于概率分布的数学逼近;目前最常用的是GGX。
各向异性 Anisotropic
有些材质在不同方向上的高光表现是一样的,这称为各向同性;例如一块绝对光滑的金属板。
有些材质在不同方向上的高光表现是不同的,这称为各向异性;例如一块经过人工打磨拉丝的金属板,或者尼龙袜。
当物体表面的微表面法线呈现有规律分布时,就会表现出各向异性。
高光剔除Specular Occlusion
对于物理模型的人工修正,用于减少一些不应受光部位出现反光的漏光问题。这并不是严谨的PBR模型流程(亦即在完美的PBR中这一步应该不存在)
Cavity
用于模拟显微结构所形成的凹陷孔洞,与高光剔除一样,是非PBR的人工经验修正
应该是用来给物件增加岁月沧桑感用的,不展开……
模型参数:电导率Metallicity
该参数用于描述材料的电导率,0表示绝对绝缘,1表示毫无电阻(超导体),0和1几乎都不会出现在真实世界中。
该参数的物理意义涉及到电磁波在物质中传播的物理模型:电导率越高的材料,则其带有的自由电子就越多。当作为电磁波的光接触到材料时,电导率高的材料会立刻将光能吸收,并很快随着电子能级态的改变而重新将光反射出去。
放到PBR中,电导率1的材质将完全不再有任何漫反射,只会进行镜面反射。
模型参数:反射率 Refelectance
在材质表面正上方打光,材质反射回光源的高光占入射光光通量的比例即为反射率
菲涅尔函数 Fresnel
菲涅尔函数用于描述菲涅尔反射现象:即材质的反射率均会随着观察者视线与其表面法线夹角大小改变;对于非金属材质来说,通常该夹角越小(即从材质正上方观看),反射率越低;该夹角越大(即侧视),反射率越高。
以下是某著名的菲涅尔函数表:
可以看到金属是一类很特别的材质,其会在视线与材料表面夹角约60-75度时反射率下降,之后再75-80度角时再急剧升高至1。
模型参数:孔隙率Porosity
用于描述物体表面的孔隙,用于计算液体浸润对材质的影响。并非所有PBR系统都会带有该参数。
感光Sensitising
目前能参考的感光物件有两种:CMOS/CCD,人眼。
简单来说,人的视觉是非常复杂的,例如人眼所看到的其实是大脑经过后期加工完成的图像,因此具有非常不科学的宽容度和视野范围,而且针对人感兴趣的地方,大脑还会动态改变视觉焦点内外的解析度……所以PBR只能参考CMOS/CCD来调整成像效果,毕竟人眼实在太难逼近了,臣妾做不到啊……
所以接下来,就要涉及到成像时的两个重要步骤:曝光与后期处理。
曝光
现实世界中的亮度范围、相机可接受的亮度范围和游戏中最终可以显示的亮度范围是不同的,因此需要控制到达摄像机光亮,亦即控制摄像机的曝光。
在这里要区分一下“曝光值”和“曝光量”这两个单位:
以及,目前绝大多数游戏引擎的感光度ISO都设定在100。
然后是以此衍生出的一批数据:
(感觉以后做VR早晚都得查这张表……)
在这里演讲者提到,使用曝光量为参数进行设置比较好,一来很直观(与最终效果直接相关),二来可以将光圈、快门速度等留给后期处理。
后期处理
后期处理包含色彩调校、运动模糊、景深、暗角等,基本都和光圈大小、快门速度、焦距挂钩。
光圈越大,则景深越小
光圈越大,暗角越明显
快门越慢,运动模糊越明显
HDR Tone Mapping
游戏引擎最终能呈现的图像色彩每个颜色通道仅能保留8bit,而相机能接受的光色范围却更大,因此需要在最终输出画面前去除掉一部分色彩信息、保留甚至增强画面的动态层次。这便是HDR Tone Mapping的工作内容。
在去除色彩信息的过程中,高动态画面向低动态画面映射时往往会导致亮度损失,因此Tone Mapping常常需要选择性调整亮度。这里要指出,人眼对于暗部的细节感知度更高。
演讲者在此对比了Reinhard和Filmic两种常用的Tone Mapping曲线,其中Filmic曲线还做了一些取巧,做了一根S型的Mapping曲线,以此拉大画面的对比度。总之呢就是,HDR Tone Mapping要怎么搞,还是得看项目的艺术风格方向是啥样的。
结束
现在再看Unity的PBR Shader,这参数应该能看懂了嗯~
转:http://zsydeepsky.lofter.com/post/1cbcb2b2_969a105