PBR全称(Physicallly-Based Rendering)。笼统的说,就字面含义可以看出,这是一种基于物理规律模拟的一种渲染技术。最早用于电影的照片级真实的渲染。近几年由于硬件性能的不断提高,已经大量运用于PC游戏与主机游戏的实时渲染。几款著名的3D引擎均有了各自的实现(UnrealEngine 4, CryEngine 3, Unity 3D 5)。此外目前国外的一款HTML5 3D引擎(PlayCanvas) 也已使用了PBR,并且在iPhone5s的手机浏览器中可以流畅播放。
本文虽然是介绍渲染技术的,但不是工程师向的,所以不会涉及到任何的高等数学公式与程序代码
PBR的应用
如下是几个实际应用案例,PBR可以达到什么样的效果:
HTML5引擎Demo
使用PBR的游戏截图
使用PBR的动画电影
使用PBR的真人电影
基于PBR的电影级渲染器Arnold
Arnold渲染器是一款高级的、跨平台的渲染API,是基于物理算法的电影级别渲染引擎。近期使用了Arnold的一些电影有:地心引力,饥饿游戏(系列),复仇者联盟(系列),精灵旅社(系列),碟中谍4,X战警(系列),源代码。
PBR的组成
漫反射与反射
漫反射与反射是光线在物体表面作用的最基本的两个表现。传统游戏的渲染系统中也把它们叫做漫反射与高光。
当光线达到物体表面的时候其中的一部分将会沿着表面的垂直法线反弹向与来源光线相反的方向。这就像皮球沿一定角度砸向地面后反弹一样。在越光滑的表面就表现的越像镜面反射,这种现象一般本称作表面高光(Specular)。这个词就是来源于拉丁文的“镜子”的发音。
然而并不是所有的光线都会被反射,部分光线将进入被照射物体的内部。这部分光线一部分被物体吸收转换为热能,另一部分则会在物体内部发生散射,最终离开物体被人眼和摄像机捕获到。这一现象被叫做“漫反射”与“子表面散射”。其中子表面散射(Sub Surface Scattering),经常能看到SSS效果就是这部分光线进过散射后从物体另一边射出的现象。
不同波长的光线的吸收与散射有着很大的不同,这就是为什么白光在不同物体的表面能照射出不同的颜色。比如:某种材料会散射大部分的蓝光,并吸收其它颜色的光,那么这种材料的表面就会表现出蓝色。散射出去的光线是杂乱的,射向各个方向的,所以不会表现出镜面反射的效果。游戏引擎中一般使用漫反射贴图(“Diffuse Map”也叫“Albedo Map”)来描述物体表面的颜色。
能量守恒
由上面的描述我们可以看出,漫反射与反射是相互独立的两部分。入射光线的一部分在物体表面发生了反射,没有反射的一部分进入物体表面被吸收或者被散射。因此可以得出一个重要的结论:漫反射光线+反射光线=入射光线。这就是光线的能量守恒。
这一现象就表现在,同样的光照条件下,反射越强烈的材质表面漫反射就越弱(表现为更暗)。如下图可以看出,从左到右材质的反射逐渐加强,同时材质本身的颜色越来越不明显。
能量守恒是PBR最重要的一个守则,遵循此守则可以确保美术在调整物体材质的漫反射和反射时不至于调出一些打破物理规律,在不同环境中表现极不真实的材质。
金属
这里把金属(导电性材质)单独拿出来说有以下几点原因。
首先,导体的反射度通常都达到60%-90%,而绝缘体只有0%-20%。高反射度导致只有很少的光线能进入导体表面之下发生散射,这也就是为什么导体通常表现的很有“金属光泽"。
第二,导体的反射度针对不同的可见光谱是不同的,这就导致导体能反射出有颜色的光。这种带颜色的反射导体很少,但生活中却很常见。如:金、铜反射出黄色。而绝缘体则没有此种特性,总是反射所有的光线。
最后一点,导体理论上讲只会吸收光线而不会散射光线的。但实际上物体材质总有或多或少的杂质与表面污迹,所以金属类材质也会发生少许的散射。
正因为金属的这些特性,所以很多渲染系统中都单独为材质引入了一个属性“金属度”(Metalness)。这只是方便美术进行材质的调节,并非PBR所必须的。如星际争霸二的材质就没有金属度这个属性,但仍然能表现出人族和神族单位的金属材质。
菲涅耳
菲涅耳是一种反射现象,最早由奥古斯汀-让·菲涅尔发现,因此被以非聂耳反射命名。
从计算机图形学来解释的话,就是随着入射光线相对与表面法线的夹角越大,反射率就越大。也就是说在物体边缘的反射会比中间要亮。在早期的渲染中也有引入菲涅耳反射,但在PBR中进一步完善相关计算公式的几个方面。
第一点,所有的材质,在其“边缘”(入射光线与物体表面角度无限趋近于0度)都会发生完美的镜面反射,且反射所有颜色的光线。这可能是很难想象的,但在物理上已经被证实了。
第二点,不同材质的菲涅耳反射随着角度的变化可以用曲线表示,并且相差都不大。不同金属材质之间差异虽然会更大,但仍然能够被分析并且公式化。因此艺术家们可以很方便的定义几种预定义的材质模板,并在他们之间调整参数就能创造出不同的材质了。
这两点可以由下图很好的解释:
从上图曲线可以看出我们要实现菲涅耳反射非常简单,只需要美术定义出中心最小的反射度,然后程序更具特定的公式计算出不同角度的实际反射度。就可以实现菲涅耳反射了。
微表面
以上的理论都是基于宏观的,然而在微观世界中,物体的表面不可能是绝对平滑的,总有一些或多或少的沟壑。这就导致了反射光线并不是总是平行的。
如下图:
因为微表面存在于微观层面,所以如果使用数据描述的话,由于精度需要将会是海量数据,是任何系统都无法承受的。因此在PBR中我们定义了一个属性“光泽度”(Gloss)或者“光滑度”(Smoothness),它的反属性为“粗造度”(Roughness)。这样就可以在渲染系统中通过光泽度贴图加以描述了。
再次的能量守恒
这里的能量守恒和之前第2点提到的能量守恒不同,第2点是针对于入射光线,反射光线与散射光线,这里的守恒仅仅指反射光线。
反射光线由于微表面的作用造成了不同方向的反射,但总能量维持不变。
下图可以方便理解这一点
从左到右光泽度一次增加,图中的高光点越来越亮,但范围越来越小,因此总亮度维持不变。
在老式的渲染系统中关于高光的实现通常都是错误的,随着光泽度提高不是变的更亮就是变得更暗。
结语
至此,整个PBR都已介绍完毕,如有兴趣了解具体实现的这里推荐一本书《基于物理的渲染-从理论到实践》(Physically Based Rendering – From Theory to Implementation)。
本文作者:张恒(点融黑帮),游戏行业从业11年。做过2D、3D游戏。端游、页游还有手游。既做客户端也做服务端。现如今开始了HTML5 3D游戏新的历程。