理解PBR:从原理到实现(上)

这篇文章介绍了PBR(基于物理的渲染)的原理,从能量守恒、辐射率、BRDF到Cook-Torrance反射模型。PBR通过反射率方程确保在不同光照环境下得到正确渲染结果,提高了3D画面的真实感。文章特别关注了虚幻4中的PBR实现,包括BRDF的计算、微平面模型和菲涅尔项。
摘要由CSDN通过智能技术生成

PBR 从离线渲染进入游戏引擎

CSDN 博客的公式排版有问题,可以看我的 GitHub Page:https://neil3d.github.io/unreal/pbr-theory.html

基于物理的渲染,即 PBR,Physically Based Rendering,这个技术名词最早是有马特·法尔(Matt Pharr)在他的知名著作中提出,这本书就是《Physically Based Rendering:From Theory To Implementation》,此书首次出版是在2004年。在2014年,此书的三位作者马特·法尔(Matt Pharr)、格雷戈·汉弗莱斯(Greg Humphreys)和帕特·汉拉汉(Pat Hanrahan)获得了第19届奥斯卡金像奖科技成果奖(Scientific and Technical Academy Award)1。 目前此书的第三版已经发布了在线版本:http://www.pbr-book.org 。这本书中提出的技术方案最开始是应用于离线渲染领域,典型的就是迪斯尼的在《无敌破坏王》(Wreck-It Ralph, 2012年)金属工作流(Metallic Workflow)。

在2006年的 SIGGRAPH 大会上纳蒂·霍夫曼(Naty Hoffman)等人进行了一场名为:SIGGRAPH 2006 Course: Physically-Based Reflectance for Games 的专题演讲,当时他还在顽皮狗(Naughty Dog)工作。纳蒂·霍夫曼对于 PBR 进入实时渲染领域十分热心,在 SIGGRAPH 2010 大会上,他再次组织一个关于 PBR 的专场:SIGGRAPH 2010 Course: Physically-Based Shading Models in Film and Game Production。这次的演讲引起了业界强烈的反响,PBR 成为热门话题!在后面的几年中,来自Ubisoft、迪斯尼、皮克斯、Epic Games、EA、Unity 等公司的牛人们轮番登场,在 SIGGRAPH 大会介绍他们对在电影、动画片、游戏中应用 PBR 技术的进展。对游戏行业影响最大的应该算是布瑞恩·卡里斯(Brian Karis)在 SIGGRAPH 2013 所做的演讲:Real Shading in Unreal Engine 4。虚幻4(Unreal Engine 4)并不是游戏业界第一个使用 PBR 技术的引擎,但是凭借虚幻引擎的影响力,以及后来免费、开源的大力推广,在行业内产生了无可替代的影响力。另外,2014年 EA 的 DICE 工作室所做的关于寒霜引擎(Frostbite Engine)的演讲:Moving Frostbite to PBR 也十分精彩!

PBR 对于现代 3D 引擎十分重要,它使得实时渲染突破了被常年诟病的“塑料感”,我们有了金属、皮革、瓷器!以从业者的角度看,更重要的是:它使我们可以把材质与光照解耦。也就是说一个 PBR 材质,在不同的光照环境下都应该得到正确的渲染结果,这让 3D 美术工作者可以更方便的调节对象的材质,并使得材质更具备通用性。

那么,它是怎么做到的呢?下面我就带你领略这一突破是如何完成的。我们首先要从物理、数学的层面来理解其原理,然后我们再来学习虚幻4中的实现方案。

理解 PBR 的原理

我们必须先明确一个事情:PBR 并不是“一项”技术,它是由一系列技术的集合,并不断改进的结果。从原理到实现方案,整体来看是很复杂的,但是如果你先把每一项技术搞明白,再看清楚它们是怎么串起来的,就容易理解多了。把所有珍珠串起来的这根金线就是“反射率方程(Reflectance Equation)”,它是一个特殊的渲染方程(Render Equation)。下面我就以反射率方程为线索,讲述 PBR 背后的物理和数学原理,其中的具体方案来自虚幻4。

render_eq

渲染方程(Render Equation)
James T. Kajiya 在 SIGGRAPH 1986 中发表的论文《The Rendering Equation》中提出了这个概念。它不是一个渲染算法,而是高屋建瓴的用一个方程描述光能在场景中的转播。它给出了一个渲染的顶层抽象定义,是一个理论上的完美结果,实际中的各种渲染计算过程可以认为是它的某种近似。

下面我们就看一下虚幻4中所使用的反射率方程:

L o ( p , v ) = ∫ H L i ( p , l ) f ( l , v ) n ⋅ l d l L_o(p, v) = \int\limits_H L_i(p,l) f(l, v) n \cdot l dl Lo(p,v)=HLi(p,l)f(l,v)nldl

这个公式中的符号含义:

  • L L L:辐射率(Radiance),这是一个物理概念,下面我用一小节专门解释
  • p p p:物体表面上的一个点
  • v v v:观察方向
  • l l l:入射光方向
  • f f f:BRDF,非常重要的概念,后面单独一小节解释
  • ∫ H . . . d l \int\limits_H ... dl H...dl:在半球域(Hemisphere)内,对所有入射光线进行积分
  • n n n:这个最简单了,就是 p p p点所在平面的法向量啦

需要说明的是虚幻4文档中列出的这个方程已经经过了概念上的简化。原始的反射率方程是在半球域上对立体角(Solid Angle)进行积分: ∫ Ω . . . d ω i \int\limits_{\Omega} ... d\omega_i Ω...dωi,立体角是一个十分重要的概念,后面我用一小节专门解释。在上面这个公式中,把无限小的立体角近似认为就是一个入射光线 l l l

这个公式挺复杂,我们先概括的理解一下它。它的含义是这样的: p p p 点在 v

  • 17
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值