腾讯游戏学院专家:PBR渲染模型的理论及具体应用

摘 要

作者:Leonn 腾讯游戏学院专家 编者按 : PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型。腾讯游戏学院专家Leonn,将和大家分享PBR的理论知识以及在Disn

  作者:Leonn 腾讯游戏学院专家

编者按: PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型。腾讯游戏学院专家Leonn,将和大家分享PBR的理论知识以及在Disney和UE中的典型应用。

PBR,基于物理的渲染模型,是当前主流游戏引擎使用的真实感3D渲染模型,在游戏场景渲染中,它用更接近物理光学的方式,建立一个对全场景材质的大一统shader。大一统shader的好处包括:统一美术制作管线加快制作效率,对动态光照环境的更耗的适应性,减少shader维护的负担等。本文总结了PBR的理论知识以及具体在Disney和UE中的典型应用。

1.jpg


1.1 光波

1.1.1 光波能量描述

渲染来自于光照,先要明确光照度的度量。光照源于单位时间内单位视网膜接受的光的能量。

感受光波亮度

光存在波粒二象性,当光子能量较高的时候,表现粒子性,按照普朗克定律,e=hv,能量同频率(或波长)有关,按照maxwell方程,e确同振幅的平方有关。对于可见光部分,振幅的影响要大于频率的影响,光波的能量基本取决于光波的振幅(即对可见光来说,能量不主要来自颜色(频率))。量化单位时间内通过单位空间界面的能量流(enrgy flow)来量化光波,这个值通常被叫做irradiance,或者大写E,翻译为辐照度,单位应该是energy/s*t(s为面积,t为时间),即Watt/m*m。

感受光波色度

可见光区域的光能虽然同振幅相关最大,但是不同频率的光对视网膜的刺激效应不同,一些低频长波的光波的组合很容易激发人们对红色的感觉,一些高频短波的光又很容易激发人们对蓝色的感觉。因此色度感知其实是在等于感知光波的频率。可见光的振幅决定的光的能量,但是波频确决定了色彩感知。

我们看到的光波基本都不会是一个单频率的一个波,而是由各种频率的几个波组成的,这个组成比率可以用频谱来表示。事实上考虑到光波是不同频率波长的组合,那么图形学里的渲染公式应该跟当前场景中所有光波的频率种类相关,即对每个频率的光波分别计算,最后叠加。但是这个太复杂了,所以现代图形学只是按照简单的长中短,即红绿蓝把一个光束聚类降维到三维,或者简单认为任何光波都是由三种频率组成的,所以图形学用rgb来量化光能,而不是(I1,I2,I3…),基于光谱(spectrum rendering)的物理渲染则是真正考虑每个频率的维度,虽然基于低维的光谱渲染已经出现在实时渲染领域。

光波的复合

因为波的复合是个复杂的问题,所以考虑到波的复合,那么光的能量不是简单的各个波的叠加。例如下面三种情况,相位不一致,结果强度完全不一致,图形学里该怎么办?我们认为第三种情况即随机的情况是最容易发生的,这种情况结果近似波能叠加,所以在图形学公式里,才能简单的把多盏光源的结果线性相加,在这里已经忽略了光波的干涉(interference)了。不过类似的工作在离线渲染领域有很多,例如薄膜干涉效果。此外这里也没考虑到衍射(diffraction)。

2.png


1.1.2 光源

所有的光波都是从光源发出来的。

度量光源

光源在单位时间发射出的总能量叫做radiant,或希腊字母φ,翻译成辐射量。表示光源的辐射能力。因为能量的单位是焦耳J,单位时间的能量单位一般用功率表示即瓦特Watt,所以Radiant的单位是Watt。

因为光源辐射的能量在不同方向可能是不同,所以用于描述光源在特定方向的辐射能力,还有另外一个度量,即定义为单位时间内光源在单位球面度上的辐射能,叫做intensity,或I,即我们熟悉的光源强度,它的单位是Watt/sr。一整个球面的球面度是4π。

光源类型

不同的光源类型的区别是对场景表面点的影响即radiance不一样,不同的光源类型就是影响E的方程E=f()不一样。

不带位置的光,也叫方向光,不带位置,只有方向,太阳光,用一个常量C就可以表示它对所影响物体的radiance,即E=c,这种光是物理不存在的,是模拟的远距离太阳光,可以认为没有Radiant,Intensity的概念。

带位置的光,对于表面任何一点,从一个光源只有一个方向的光线射过来,也就是说光源无形状。用光源位置P1,表面位置P2,和强度I定义它对表面点的影响E,即E=f(P1,p2,I),一般来说I又是光照方向的函数,记为I(d)。即E=f(P1,p2,I(d))。或者可以表达成E=I*dist(p)*l(d)

泛光(点光):I(d)是常量的情况,叫做omni light,泛光,这是我们常说的点光,即光源强度不随方向改变。泛光的E=I/r2.(怎么推导的?E=总能量/4π*r*r, I=总能量/4π。)事实上,点光的E一般都不会用1/r2,因为距离太近的时候要在数值上处理极大值(这不是bug,因为极小值的积分会抵消,但是数值表示极大值有困难),且距离太远了无限接近极小值也没有意义,不如及早抵达0来消除一些不受光源影响的物体。一般表达成1/(s+sr+sr2)

聚光灯:l(d)随着方向改变,对于I(d) 的这种情况,就是聚光灯,它的光强随着角度的扩散变弱。E=l(d)/r2。

其实我们可以用E=J*dist(p)*l(d) (光源能量*距离衰减函数*方向分布函数)表达上面所有光源,方向光l(d)和dist(p)都是常量,泛光只有l(d)是常量,聚光灯都不是常量,一些光照计算中用所谓的uber light来表达任意光源。

1.1.3 介质对光波的反应

Scattering 散射

散射是一切光照视觉现象的基础。光波在介质中直线传递遇到物质分子会四处反射,一束光线碰到一个表面,会跟表面物质反应激发出向其他很多方向的新的光线,这就叫做散射。散射其实就是光波遇到物质分子后发生的反应,通常在原光波方向上散射出的光线更多,散射后的频率和原始光波可以认为是一致的,不讨论不一致的情况。

均匀介质

光波在光照方向上散射出来的能量要更高一些,或正向或反向。如果介质组成一致的,那么散射产生到某个方向的光波,会被互相干涉,能量抵消,只剩下直线传递的那个部分光波,所以均匀介质中光波才可以看做直线传递没有散射的。

粒子介质

如果小粒子是最理想化的均匀分布,多个粒子对同个光波的散射会成线性叠加。如果小分子是聚集成一个个比波长还小的cluster,那么就会出现同phase的光波叠加,光的能量会变成n2增长,大气里的光线散射较强是这种原因,这也叫做rayleigh散射(注意这不违反能量守恒,因为能量守恒是建立在线性叠加的基础上的而没考虑干涉);当cluster要大于波长后,变成mie散射,如云雾。

1.1.4 表面对光波的反应

表面是两种介质的分界面,上面研究光波在单一介质中的传递,这里研究光波遇到介质分界面的行为。

首先光波在遇到介质表面后不会向单一介质中那样向各个方向散射,只会向两个方向散射,反射方向和折射方向。

次表面散射

但是折射方向的光波会继续在单一介质内散射,导致最终一些散射的光线重新反射出介质,这些从体内反射出来的光线叫做次表面散射,也有一些光波在介质内被物质电子吸收。

所以表面对光源的反应,总的上来看,一些被吸收,一些被表面直接反射出去,一些被折射出去,一些经过次表面散射反射出去。因为有了次表面散射的复杂作用,一个光入射表面,不再是产生反射和折射两个新的光波,而是折射,加上向各个方向的反射光波。

1.2 BRDF

量化物质表面对光波的反应

渲染中我们大部分时间是处理光波对物质表面的反应,前面量化了光源,这里就要量化物质表面对光波的反应。因为上面提到的表面对入射光波是几种反应,而我们通常关心一个光波经一个表面点后反射到另一处(如摄像机),所以定义了一种度量,它描述给定一个光波入射方向l,一个对表面点的观察发现v,物质表面沿v反射(及次表面散射)出来的光波的irradiance和入射光波的irradiance的比值f(l.v)。这个叫做brdf(binary reflection distribution function)

严格来讲次表面散射不能用brdf来定义,定义次表面散射要用BSSRDF,但是当物件离摄像机有一定距离的时候,次表面散射出来的位置会趋近于同直接反射的位置重叠,这时候就可以用BRDF描述次表面散射。BRDF可以描述那些离摄像机不是很近的物体表面的反射和次表面散射。

对于BSSRDF来说,如果物质次表面散射出逃点距离入射点很近,这种又叫做local subsurface scattering,,而出逃点较远的话又叫做global subsurface scattering。Lss还是gss 取决于材质以及观察点,观察点远趋向于lss,而皮肤这种材质更易趋向于gss,它的次表面反射距离很长(长于一个渲染pixel),当然当观察距离足够远,皮肤也会变成lss了。更近的lss就可以用brdf来描述了。

BRDF有两个重要的属性:

f(l,v) = f(v,l),这是表面特性,此外反射能量要小于进入能量(能量守恒)

量化光波的传递

在前面度量接收器对光波的接受的时候用辐射度irradiance来量化单位时间单位表面接受光源的能量,它接受的可能是来自各个方向的多个光波辐射能,但是在计算光线传递的过程中,因为考虑到单束光线是有方向性的,所以会把irradiance再计算一个在立体角上的微分,这个量叫做radiance, 英文记为L,翻译做光束光辉,它的单位是watt/m2*sr, radiance同irradiance的区别是它表示了单位面积表面通过的单位方向的光能,而不是各个方向,把irradiance可以想象成一个漏斗,而radiance则是一个细管,在一束光波的传递过程中基本都用的是radiance。

BRDF与Shading

渲染的一切是为了计算在摄像机上的图像,有了brdf我们就能进行基于物理的光照计算。

只有小孔才能成像 图形学里通常的渲染模拟的是针孔光圈,它一般没有模拟大光圈(会有景深,远景模糊)。如下图上表示真实的小孔成像,中是图形学中为了方便计算把成像器至于针孔前的情况(这样不是倒像),下图是大光圈的情况。

4.png