PBR渲染从理论到实现

本文深入探讨了基于物理的渲染(PBR)理论,包括微平面模型、能量守恒和BRDF。PBR提高了渲染的真实感,减少了美术师的工作负担。文章详细介绍了微平面模型与粗糙度的关系,解释了能量守恒在镜面反射和次表面散射中的应用,以及反射率方程。此外,还讲解了BRDF的概念,如Cook-Torrance BRDF模型中的D、F、G函数。文章最后简述了PBR的实现,包括单光源光强计算和完整的PBR渲染流程,为读者提供了实现PBR的初步指导。
摘要由CSDN通过智能技术生成

引言

  • 无论是从事游戏引擎开发还是游戏开发,只要是有关三维图形渲染,必然涉及到着色模型
  • 程序员使用图形API驱动GPU进行图形计算,而GPU执行的代码就是所谓的Shader即着色器
  • 如果你学习过OpenGL或者GAMES101,那么你至少了解Phong模型。在这个对渲染真实感要求越来越高的时代,出现了一种基于物理的渲染即PBR渲染,PRR模型的渲染效果比Phong模型更为真实。
  • 本文先从理论层面阐述PBR模型,再编写通用的Shader代码,通过本文你能轻松学会一种真实渲染的方案
  • 本文参考LearnOpenGL和D3D龙书,若想系统性学习PBR渲染,请学习课程GAMES202或书籍《物理渲染-从理论到实践》。

一、PBR概述

  • PBR即基于物理的渲染(Physically Based Rendering),它指的是在不同程度上基于现实世界物理理论所提出的渲染技术的集合
  • PBR指基于物理的渲染模型,其渲染效果是基于物理的渲染
  • 总之由于PBR更符合物理学规律,因此其渲染效果比Phong和Blinn-Phong都更真实。
  • 除了渲染真实性更好外,PBR也减轻了美术师的负担,以往美术师在建模时必须依据经验对模型材质的数据进行反复调整。若使用PBR模型,美术师可以直接查找现实世界不同材质的物理参数作为依据
  • 我们眼中的世界是光和物体材质交互的结果,二者缺一不可。使用基于物理参数的材质,能使得物体在任何光照条件下都看起来是正确的。通常许多游戏中的光照并不会变化太大,但对于荒野大嫖客这样有早晨和黑夜循环交替、光照变化很大的情况,若使用Phong模型则开发者必须在光照较暗时对着色器进行微调,以保证渲染效果,而使用PBR却完全不用考虑。
  • PBR是对现实物理的一种近似,因此其被称为基于物理的着色,而非物理着色。PBR最先由迪士尼提出探讨被Epic Games首先应用于实现渲染的PBR方案,相关文献有很多记录可以查找。

二、PBR理论

  • PBR即基于物理的渲染必须包含以下三种理论:
    1. 微平面模型
    2. 能量守恒
    3. 基于物理的BRDF

2.1 微平面模型

(1)放大后的平面

  • 现实世界中物体表面放大后都是参差不齐的,如下图所示:
    在这里插入图片描述
  • 上图是物体表面放大后的结果,可见现实世界中物体的表面放大后都是有褶皱的,即不是完全光滑的。
  • 当一束平行光线照射到物体表面时,物体反射出的光线也会是发散的,如下图所示:在这里插入图片描述
  • 平行的光束照射到物体表面上多个微表面后,由于不同微表面的法向量不同,因此物体反射出的光束并不平行

(2)微平面和粗糙度

  • 左边平面没有右边平面光滑,即左边平面比右边平面更加粗糙,因此左边平面反射出的光线更加发散
  • 光源发出的光通过物体反射到人的眼睛,于是人就看到了颜色。我们要计算的就是人眼看到的光,因此对于上图中表面散射出的无数光线,我们只在乎那些会反射到人眼中的光线
  • 假设光源位置为p1、人眼位置为p2、物体位置为p3,则入射光向量v1=(p1-p3),则射进人眼的反射光向量应该为v2=(p2-p3),则反射光线会射入人眼的微平面法向量应该为h=(v1+v2),因为法向量应该为单位向量因此再单位化则h=(v1+v2) / (||v1+v2||)
  • 根据上述推导,发现只有法向量为h的微平面的反射光才会射入人眼,其他微平面的反射光并不会反射到我们的眼睛中,因此必须统计物体表面法向量为h的微平面占所有微平面的比例。计算有多少光线能通过物体反射到人眼这个问题,在后面的BRDF中会讨论
  • 总之我们使用粗糙度(Roughness)这个参数来描述物体表面的粗糙程度。若粗糙度越大,则表面物体表面越粗糙、微平面法向越分散。若粗糙度越小,则物体表面越光滑,微平面法相越集中。

(3)粗糙度与高光的关系

  • 下图展示了不同粗糙度时物体的渲染效果,可以看到粗糙度越小,即物体越光滑,物体的镜面高光越集中越明亮。当物体粗糙度逐渐增大,物体的高光越来越大即分散,也越来越暗淡。
    在这里插入图片描述
  • 什么是高光?就是物体表面看起来最亮的那个地方。为什么那里特别亮?根据上文我们得知物体表面的微表面的法向量必须为h,否则其光线是无法射入我们眼中的。对于上图中球体,右上角区域的宏观法相是最接近h的,而其他区域宏观法相相距h是较大的,因此即使粗糙度相同,对于整个球体而言,右上角区域法向量为h的微平面数量是最多的,因此其相对其他区域反射了更多的光线,因此我们人眼才会看到那里特别亮。
  • 球体的右下角区域的宏观法向偏离h那么大,为什么还会反射光让人看到亮呢?因为虽然右下角宏观法向偏离h较大,但其中有许多参差的微平面,一些微平面的法向量就为h,因此能将光反射到我们眼中。但是考虑球体右上角区域对应的背面,那里的法向量明显应该往球体背面的左下角,因此即使参差也不可能有微平面的法向量为h,因为其法向必然和h是反向的。由此也可以看出,仅靠粗糙度是无法描述物体表面有多少光反射到人眼的,还需要将光向量、视线向量等信息统一起来考虑才行,这就是后面在BRDF中要讨论的。

2.2 能量守恒

(1)入射光能量守恒

  • 物体不会发光的前提下,根据能量守恒定律,物体表面出射光线的总能量永远不能超过入射光线的总能量。在上一小节的最后,随着物体粗糙度的增大,物体表面高光的轮廓越来越大,根据能量守恒定则,则高光的亮度也应该越来越低,这样出射光线的总能量才能保持不变。

(2)镜面反射和次表面散射

  • 当一束光线照射到物体表面时,光线会发生折射反射反射的光线会直接射离物体表面,而折射光线会进入物体内部,折射光线进入物体后一部分会被物体吸收,另一部分折射光线在物体内部反复散射后会从物体中射出
    在这里插入图片描述
  • 上图是光线与物体交互的示意图。黄色的光线从右上角斜向下照射到物体表面,一部分光线直接从表面反射离开,另一部分光线射入物体内部,在物体内部被吸收,或反复散射后射出物体表面,即图中红色的光线。
  • 我们将物体直接反射出的光线叫做镜面光照,将折射入物体内部并经过多次散射后射出物体的光线做次表面散射
  • 物体的颜色是由光照和物体交互的结果,所谓交互就是指光线通过物体后进入了人的眼睛,那么光线是如何通过物体进入人眼的呢?经过上述分析,光可以直接在物体表面反射后进入人眼,光也可以折射入物体内部经多次散射后射出再进入人眼,因此物体所能返回的光照就是镜面光照和次表面散射光照

(3)次表面散射特例-漫反射

  • 直接反射出的光线是非常容易计算的,只需知入射光线、表面法线,就能依据初中物理计算得到反射光线。但折射光线的计算是非常困难的,因为我们无法对物体表面的复杂粒子层进行建模,无法求出折射光线的具体路径,因此我们假设折射光线经散射后会在物体表面向各个方向均匀射出,并将这种次表面散射称作漫反射
  • 当物体的介质透光性较弱时,进入物体内部的光线,会很快出射,我们一般会把这类光照叫做漫反射。当物体透光性较强时,光线可能会在内部传播很久才出射,此时就无法使用简单的漫反射公式来描述这一光照现象了。也就是说,漫反射是次表面散射的一种特殊情况,可以使用很简单的公式来描述。诸如皮肤、蜡质这样透光性较强的材质,其视觉效果就需要复杂的次表面散射技术才能实现。本文以漫反射实现次表面散射。

(4)金属与非金属材质的区别

  • 对于金属表面而言,由于金属会完全吸收所有的折射光,因此金属表面只会显示出镜面反射颜色,而不会显示出漫反射颜色非金属表面也称介电质,会显示镜面反射和漫反射,因此金属和非金属在PBR渲染管线中被区别处理
  • 光是具有能量的,根据能量守恒定律,镜面反射和漫反射的能量之和必须小于等于入射光的能量

2.3 反射率方程

(1)辐射度量学

  • 渲染方程是用来模拟光视觉效果的最好的模型。PBR所使用的的光照模型是反射率方程它是渲染方程的特化版本。反射率方程如下:
    在这里插入图片描述
  • 要正确理解反射率方程,必须要涉及一些辐射度量学的内容,辐射度量学是一种用来度量电磁场辐射 (包括可见光) 的手段,接下来介绍一些辐射度量学内容。
  • 辐射率 (Radiance) ,在这里用L来表示,辐射率被用来量化来自单一方向上的光线的强度
  • 辐射通量:辐射通量Φ表示的是一个光源所输出的能量,以瓦特为单位。光是由不同波长的能量所集合而成的每种波长与一种特定的颜色相关。因此一个光源所放射出的能量可以被视为,这个光源包含的各种波长的一个函数波长介于390nm到700nm的光被称为是处于可见光光谱中,也就是人眼可见的波长。下图中展示了日光中不同波长的光所具有的能量:
    在这里插入图片描述
  • 辐射通量将会计算上图中不同波长构成的函数的总面积,但这么多不同波长的计量作为参数输入计算机有些不切实际,因此我们通常不直接使用波长的强度而是使用三原色编码,即RGB来作为辐射通量的简化表示。比如可以指定物体的基础颜色为:红色(255,0,0)、白色(255,255,255),可以指定光源的强度为:(1000,500,100)。这套编码确实会带来一些信息上的损失,但是对于视觉上的影响基本可以忽略。
  • 立体角:立体角使用ω表示,它描述的是立体的角度。
    在这里插入图片描述
  • 如上图所示,在一个单位球体上有一个立体角ω。立体角的计算公式为:ω = S / r^2 ,其中S表示立体角投射到半径为r的球体上的截面面积,因此单位球体上的截面的面积就被称为立体角
    在这里插入图片描述
  • 上图表示一个大小固定的立体角,从顶点朝着固定立体角延展出一个圆锥的形状随着距离越来越远,截面的面积也越来越大,但立体角是固定的,这就是空间的角度
  • 辐射强度:辐射强度表示在单位球面上光源向每单位立体角所投送的辐射通量。其计算公式为:I = /

(2)能量的辐射与守恒

  • 讨论辐射率的计算方程,一个拥有辐射强度Φ的光源在单位面积A,单位立体角 ω上辐射出的总能量:L=d^2Φ / ( dA dω cosθ)。
  • 想象一个灯泡向四面八方发射光线,如何形容灯泡发出能量的多少?通常我们使用多少瓦,即单位时间消耗的电能。类似的,辐射通量Φ的意义就是光源在单位时间内发出的总能量大小
  • 对于一个辐射通量为Φ的光源而言,其单位时间内释放的总光能为Φ。若光源类似于灯泡一样将光能射向四面八方,光能Φ将以球形向外传输,那么光能Φ在某一条直线上传输的光能有多少呢?这是个三维问题,其实就是求光源在单位立体角上所投送的辐射通量。对于整个三维空间,单位球体的面积为4πr^ 2,则整个空间的立体角大小为:4πr^ 2 / r ^2 = 4π。因此光能Φ在某一条直线上传输的光能为Φ/4π。再来考虑一般情况,若光能Φ仅在立体角ω中进行传输,则单位立体角的光能为:I = / ,符合之前辐射强度的公式
  • 光源在单位时间传输的光能为一个球体时,随着距离越来越远,球体的半径会越来越大,则球体每单位面积上光能会越来越小。若有一个辐射通量为Φ的灯泡,假设物体距离灯泡的距离为d,则当灯泡发出的光能Φ接触到物体时,光能球体的半径为d,则光能球体上单位面积的光能为Φ / 4πd^ 2。因此可以看到光能不仅会在立体角上分散,也会随着距离的增加而分散

(3)辐射照度

  • 光线直射和斜射到平面所接收到的光能是不同的,当光线与平面垂直时能接收到所有的光能,而若光线与平面不垂直时,即光线与平面法线间的夹角θ不为零度时,则平面能接收光线能量的有效面积是S cosθ,其中S为平面面积。因此综上所述,辐射率方程应为:L = d^2 Φ / (dA cosθ)。
  • 当我们把立体角ω和面积A看作是无穷小时,那么就能用辐射率来表示单束光线穿过空间中一个点的通量,这样我们就可以使用此式计算物体表面上某点处射入光线的辐射率
  • 事实上物体表面某点可能被多条光线所照射,因此我们关心的是投射到某点p上所有光线的总和,而这个和就称为辐射照度或辐照度

(4)再论反射率方程

  • 物体上某点可能接收的光线范围是一个半球形,如下图所示:
    在这里插入图片描述
  • 我们要计算上图p点处的光照,就要枚举半球领域Ω内所有方向上的入射光,对所有入射光的光照进行计算并求和
  • 设Li(p,ωi)表示从点p处ωi方向入射的光强,则该点接收到的光强为 Li(p,ωi) x cosθ,其中θ为p点处法向量n与入射光向量ωi间的夹角,则cosθ = n · ωi,因此该点接收到的光强为 Li(p,ωi) x n·ωi。设ω0表示观察方向,最终需要计算出:半球领域Ω内所有入射光照射到p点后反射到ω0方向上的光强之和,现在再来看下面的反射率方程。

-

  • Lo(p,ω0)表示:半球领域Ω内所有入射光照射到p点后反射到ω0方向上的光强之和。要求空间中每一个方向上光线反射之和,必然要使用积分,因此方程右边是一个积分式,积分区间就是Ω。方程中 Li(p,ωi) x n·ωi 表示:p点从ωi方向上接收的光强,而dωi 是积分式。
  • 最后只剩下fr项了,那么它是什么?我们已经计算出任意ωi方向上的光照射到p点后的强度为 Li(p,ωi) x n·ωi,那么这个入射光会有多少反射到ω0即观察方向呢?毕竟我们只关心物体反射回人眼的那部分光照&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望—星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值