图形学基础 | 基于物理的渲染理论(PBR)

转载自:
https://learnopengl.com/PBR/Theory Learn OpenGL PBR Theory

PBR 基于物理的渲染(Physically Based Rendering) 它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合

因为基于物理的渲染目的便是为了使用一种 更符合物理学规律的方式来模拟光线 ,因此这种渲染方式与我们原来的Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些

美术师们可以 直接以物理参数为依据来编写表面材质

基于物理的渲染仍然只是对基于物理原理的现实世界的一种 近似
这也就是为什么它被称为基于物理的着色(Physically based Shading) 而非物理着色(Physical Shading)的原因

判断一种 PBR光照模型是否是基于物理的,必须满足以下三个条件:

  1. 基于微平面(Microfacet)的表面模型
  2. 能量守恒
  3. 应用基于物理的BRDF

微表面模型

所有的PBR技术都基于微平面理论。
这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致:
在这里插入图片描述
产生的效果就是:

  • 一个平面越是粗糙,这个平面上的微平面的排列就越混乱。这些微小镜面这样无序取向排列的影响就是,当我们特指镜面光/镜面反射时,入射光线更趋向于向完全不同的方向发散(Scatter)开来,进而产生出分布范围更广泛的镜面反射
  • 而与之相反的是,对于一个光滑的平面,光线大体上会 更趋向于向同一个方向反射,造成更小更锐利的反射
    在这里插入图片描述
    在微观尺度下, 没有任何平面是完全平滑的 .
    然而由于这些微平面已经微小到 无法逐像素的继续对其进行区分
    因此只有假设一个 粗糙度(Roughness) 参数.
    然后用 统计学的方法 估算微平面的粗糙程度.

可以基于一个平面的粗糙度来计算出 某个向量 的方向与 微平面平均取向方向 一致的概率
这个向量便是位于 光线向量l视线向量v 之间的中间向量(Half Vector).
h = ( l+v ) / | l+v |

微平面的取向方向与中间向量的方向越是一致. 镜面反射的强度就越是锐利.
然后再加上一个介于 0到1 之间的粗糙度参数. 就能概略的估算微平面的取向情况

能量守恒

微平面近似法使用了这样一种形式的 能量守恒(Energy Conservation)

  • 出射光线的能量永远不能超过入射光线的能量(发光面除外).
    图形学基础 | 基于物理的渲染理论(PBR)_第1张图片
    图中:
    黄色的光表示理想的反射. 认为表面是完全平滑的.
    红色的光表示考虑了表面的粗糙程度. 认为表面是粗糙的.

随着粗糙度的上升 镜面反射区域的会增加,但是镜面反射的 亮度却会下降.
如果 不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。

光滑平面的镜面反射更强烈而粗糙平面的反射更昏暗。

为了遵守能量守恒定律,我们需要对 漫反射光和镜面反射光 之间做出明确的 区分
当一束光线碰到一个表面时,它被分离成为一个 折射 部分 和 一个 反射 部分.

  • 反射部分就是直接反射. 不会进入平面的那部分怪光线. 就是 镜面光照
  • 折射部分就是余下的会进入表面并被吸收的那部分光线,这也就是我们所说的 漫反射光照

当光线接触到一个表面的时候折射光是不会立即就被吸收的.

  • 光线实际上可以被认为是一束没有耗尽就不停向前运动的能量.
  • 而光束靠碰撞的方式来消耗能量.
  • 每一种材质都是由无数微小的粒子组成的. 这些粒子都能下图所示一样与光线发生碰撞。这些粒子在每次的碰撞中都可以吸收光线所携带的一部分或者是全部的能量而后 转变成为热量

一般来说,并非所有能量都会被全部吸收,而光线也会继续沿着(基本上)随机的方向发散,然后再和其他的粒子碰撞直至能量完全耗尽或者再次离开这个表面。而 光线脱离物体表面后将会协同构成该表面的(漫反射)颜色。

在基于物理的渲染之中我们进行了简化

  • 假设对平面上的每一点所有的折射光都会被完全吸收而不会散开。
  • 而有一些被称为 次表面散射(Subsurface Scattering)技术 的着色器技术将这个问题考虑了进去.它们显著的提升了一些诸如皮肤,大理石或者蜡质这样材质的视觉效果,不过伴随而来的则是性能下降代价。

对于 金属(Metallic)表面,当讨论到反射与折射的时候还有一个细节需要注意:

  • 金属表面对光的反应与非金属材料还有电介质(Dielectrics)材料表面相比是不同的。它们遵从的反射与折射原理是相同的,
  • 但是 所有的折射光都会被直接吸收而不会散开 ,*只留下反射光或者说镜面反射光 。亦即是说,金属表面不会显示出漫反射颜色
  • 由于金属与电介质之间存在这样明显的区别,因此它们两者在PBR渲染管线中被区别处理,而我们将在文章的后面进一步详细探讨这个问题。

反射光与折射光它们二者之间是互斥的关系

  • 无论何种光线,其被材质表面所反射的能量将无法再被材质吸收
  • 折射光这样的余下的进入表面之中的能量 正好就是我们计算完反射之后余下的能量

按照能量守恒的关系,首先计算镜面反射部分.它的值占 反射光线占 入射光线能量的百分比.
然后可以直接计算得到折射部分:

float kS = calculateSpecularComponent(...); // 反射/镜面 部分
float kD = 1.0 - ks;                        // 折射/漫反射 部分

能在遵守能量守恒定律的前提下知道 入射光线的反射部分与折射部分所占的总量

反射率方程

渲染方程(Render Equation)

它是某些聪明绝顶人所构想出来的一个精妙的方程式,是如今我们所拥有的用来模拟光的视觉效果最好的模型。

基于物理的渲染所坚定的遵循的是一种被称为 反射率方程(The Reflectance Equation)的渲染方程的特化版本

在这里插入图片描述

辐射度量学(Radiometry)

辐射率(Radiance),在这里用 L 来表示.
辐射率被用来量化 单一方向上 发射来的 光线的大小或者强度

辐射通量:辐射通量Φ 表示的是 一个光源所输出的能量 ,以瓦特为单位。
RGB(或者按通常的称呼:光色)来作为辐射通量表示的简化。

立体角:立体角用 ω 表示.
它可以理解为我们描述投射到单位球上的 一个截面的大小或者面积.

投射到这个 单位 球体上的 截面的面积就被称为立体角(Solid Angle)
可以把立体角想象成为一个带有体积的方向

图形学基础 | 基于物理的渲染理论(PBR)_第2张图片

辐射强度辐射强度(Radiant Intensity) 表示的是在单位球面上,一个光源向 每单位立体角 所投送的 辐射通量
举例来说,假设一个全向光源向所有方向均匀的辐射能量,辐射强度就能帮我们计算出它在一个单位面积(立体角)内的能量大小:
图形学基础 | 基于物理的渲染理论(PBR)_第3张图片
辐射强度的计算公式如下:
在这里插入图片描述
其中 I 表示 辐射通量Φ 除以 立体角ω

辐射率的方程式:
这个方程表示的是: 一个拥有 辐射通量Φ 的光源在单位面积A, 单位 立体角ω 上的辐射出的总能量:
图形学基础 | 基于物理的渲染理论(PBR)_第4张图片
在这里插入图片描述

辐射率是辐射度量学上表示一个区域平面上光线总量的物理量
它受到入射(Incident)(或者来射)光线与平面法线间的夹角θ 的余弦值cosθ的影响

float cosTheta = dot(lightDir, N);  

当涉及到辐射率!!!

  • 我们通常关心的是 所有投射到点P上的光线总和.
  • 这个和就称为 辐射照度或者辐照度(Irradiance)

在这里插入图片描述
渲染方程中 L代表通过某个无限小的立体角ωi在某个点上的辐射率
而立体角可以视为 入射线 wi
利用光线和平面间的入射角的余弦值cosθ来计算能量.
用ωo表示观察方向,也就是出射方向

反射率公式计算了 点p在ωo方向上被反射出来的辐射率Lo(p,ωo)的总和。
或者换句话说:Lo表示了从ωo方向上观察,光线投射到点p上反射出来的辐照度。

需要计算的就不只是是单一的一个方向上的入射光,
而是一个以点p为球心的 半球领域Ω内 所有方向上的入射光。
一个半球领域(Hemisphere)可以描述为以平面法线n为轴所环绕的半个球体:

图形学基础 | 基于物理的渲染理论(PBR)_第5张图片

BRDF 双向反射分布函数

RDF,或者说 双向反射分布函数

  • 它接受入射(光)方向ωi,出射(观察)方向ωo,平面法线n
    以及一个用来表示微平面粗糙程度的参数a作为函数的输入参数

BRDF 可以 近似的求出 每束光线对于一个给定材质属性的平面上最终反射出来的光线所作出的贡献.

BRDF基于之前的微平面理论来近似的 求得材质的反射与折射属性。

为了物理上的可信度. 必须遵循 能量守恒定律

  • 反射光线的总和永远不能超过入射光线的总量
  • 同样采用ωi和ωo作为输入参数的 Blinn-Phong光照模型也被认为是一个BRDF. 然而由于Blinn-Phong模型并没有遵循能量守恒定律,因此它 不被认为是基于物理的渲染
  • 几乎所有实时渲染管线使用的都是一种被称为 Cook-Torrance BRDF 模型。

Cook-Torrance BRDF

Cook-Torrance BRDF兼有漫反射和镜面反射两个部分:

kd 是被折射部分的比率(占入射光线能量)
flambert 是表示漫反射部分. Lambertian漫反射 .
在这里插入图片描述
c表示表面的颜色(漫反射表面纹理). 除以PI,是对漫反射光进行标准化.

ks 是被反射部分的比率.
fcook-torrance. BRDF的镜面反射部分
在这里插入图片描述
Cook-Torrance BRDF的镜面反射部分包含三个函数: (此外分母部分还有一个标准化因子). 字母D,F与G分别代表着一种类型的函数.
三个函数分别为 正态分布函数(Normal Distribution Function)菲涅尔方程(Fresnel Rquation)几何函数(Geometry Function) :

  • 正态分布函数: 估算在受到表面粗糙程度的影响下. 取向方向与中间向量一致的微平面数量. 这是用来估算 微平面的主压函数.
  • 几何函数: 描述微平面自成阴影的属性. 当一个平面相对比较粗糙的时候. 平面表面上的微平面有可能会挡住其他微平面从而减少了表面所反射的光线.
  • 菲涅尔方程 : 菲涅尔方程描述的是 在不同的表面角下, 表面能反射的光线所占的比率;

正态分布函数

正态分布函数D. 或者说 镜面分布.
从统计学上近似的表示了与 某些(中间)向量h 取向一致的微平面的比率
举例来说,假设给定向量h,如果我们的微平面中有35%与向量h取向一致,则正态分布函数或者说NDF将会返回0.35。

目前有很多NDF都可以从统计学上来估算微平面的总体取向度.主要给定一个 粗糙度的参数 以及一个参数Trowbridge-Reitz GGX:
在这里插入图片描述
h表示中间向量. a表示粗糙度.

几何函数

几何函数从统计学上近似的求得了微平面间相互遮蔽的比率,这种相互遮蔽会损耗光线的能量。
图形学基础 | 基于物理的渲染理论(PBR)_第6张图片
NDF类似,几何函数采用一个材料的粗糙度参数作为输入参数,粗糙度较高的表面其微平面间相互遮蔽的概率就越高。
将要使用的几何函数是GGX与Schlick-Beckmann近似的结合体,因此又称为Schlick-GGX:

图形学基础 | 基于物理的渲染理论(PBR)_第7张图片
引擎把粗糙度转化为α的方式不同,得到k的值也有可能不同。

k这个重映射是如何起作用的?
为了有效的估算几何部分,
需要将 观察方向(几何遮蔽(Geometry Obstruction))光线方向向量(几何阴影(Geometry Shadowing)) 都考虑进去。

使用史密斯法(Smith’s method)来把两者都纳入其中:

在这里插入图片描述
几何函数是一个值域为[0.0, 1.0]的乘数
其中白色或者说1.0表示没有微平面阴影,而黑色或者说0.0则表示微平面彻底被遮蔽。

菲涅尔方程

菲涅尔(发音为Freh-nel)方程描述的是 被反射的光线对比光线被折射的部分所占的比率,这个比率会随着我们观察的角度不同而不同。

当光线碰撞到一个表面的时候,菲涅尔方程会根据观察角度告诉我们被反射的光线所占的百分比。
利用这个反射比率和能量守恒原则,我们可以直接得出光线被折射的部分以及光线剩余的能量。

当垂直观察的时候,任何物体或者材质表面都有一个基础反射率(Base Reflectivity).
但是如果以 一定的角度往平面上看的时候所有反光都会变得明显起来。

菲涅尔方程可以用Fresnel-Schlick近似法求得近似解:
在这里插入图片描述

F0 表示平面的基础反射率,它是利用所谓 折射指数(Indices of Refraction) (IOR) 计算得出的。

Cook-Torrance反射率方程

在这里插入图片描述

PBR材质

PBR渲染管线所需要的 每一个表面参数都可以用纹理来定义或者建模
使用纹理可以让我们逐个片段的来控制每个表面上特定的点对于光线是如何响应的:不论那个点是金属的,粗糙或者平滑,也不论表面对于不同波长的光会有如何的反应。

PBR渲染管线当中经常会碰到的纹理列表,还有将它们输入PBR渲染器所能得到的相应的视觉输出:
图形学基础 | 基于物理的渲染理论(PBR)_第8张图片
反照率反照率(Albedo)纹理 为每一个金属的纹素(Texel)(纹理像素)指定表面颜色或者基础反射率。

  • 这和我们之前使用过的漫反射纹理相当类似,不同的是所有光照信息都是由一个纹理中提取的
  • 漫反射纹理的图像当中常常包含一些细小的阴影或者深色的裂纹,而反照率纹理中是不会有这些东西的。它应该只包含表面的颜色(或者折射吸收系数)。

法线:法线贴图纹理和我们之前在法线贴图教程中所使用的贴图是完全一样的。

  • 法线贴图使我们可以逐片段的指定独特的法线,来 为表面制造出起伏不平的假象。

金属度:金属(Metallic)贴图逐个纹素的指定该纹素是不是金属质地的。根据PBR引擎设置的不同,美术师们既可以将金属度编写为灰度值又可以编写为1或0这样的二元值。

粗糙度:粗糙度(Roughness)贴图可以以纹素为单位指定某个表面有多粗糙。采样得来的粗糙度数值会影响一个表面的微平面统计学上的取向度。

  • 一个比较粗糙的表面会得到更宽阔更模糊的镜面反射(高光),而一个比较光滑的表面则会得到集中而清晰的镜面反射
  • 某些PBR引擎预设采用的是对某些美术师来说更加直观的 光滑度(Smoothness)贴图而非粗糙度贴图,不过这些数值在采样之时就马上用(1.0 – 光滑度)转换成了粗糙度。

AO:环境光遮蔽(Ambient Occlusion)贴图或者说AO贴图为表面和周围潜在的几何图形指定了一个额外的阴影因子。

  • 比如如果我们有一个砖块表面,反照率纹理上的砖块裂缝部分应该没有任何阴影信息。然而AO贴图则会把那些光线较难逃逸出来的暗色边缘指定出来。在光照的结尾阶段引入环境遮蔽可以明显的提升你场景的视觉效果。网格/表面的环境遮蔽贴图要么通过手动生成,要么由3D建模软件自动生成。

美术师们可以在纹素级别设置或调整这些基于物理的输入值,还可以以现实世界材料的表面物理性质来建立他们的材质数据。这是PBR渲染管线最大的优势之一,因为不论环境或者光照的设置如何改变 这些表面的性质是不会改变的,这使得美术师们可以更便捷的获取物理可信的结果。在PBR渲染管线中编写的表面可以非常方便的在不同的PBR渲染引擎间共享使用,不论处于何种环境中它们看上去都会是正确的,因此看上去也会更自然。

你可能感兴趣的:([图形学基础])