转载自:
https://learnopengl.com/PBR/Theory Learn OpenGL PBR Theory
PBR 基于物理的渲染(Physically Based Rendering) 它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合
因为基于物理的渲染目的便是为了使用一种 更符合物理学规律的方式来模拟光线 ,因此这种渲染方式与我们原来的Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些
美术师们可以 直接以物理参数为依据来编写表面材质
基于物理的渲染仍然只是对基于物理原理的现实世界的一种 近似,
这也就是为什么它被称为基于物理的着色(Physically based Shading) 而非物理着色(Physical Shading)的原因
判断一种 PBR光照模型是否是基于物理的,必须满足以下三个条件:
所有的PBR技术都基于微平面理论。
这项理论认为,达到微观尺度之后任何平面都可以用被称为微平面(Microfacets)的细小镜面来进行描绘。根据平面粗糙程度的不同,这些细小镜面的取向排列可以相当不一致:
产生的效果就是:
可以基于一个平面的粗糙度来计算出 某个向量 的方向与 微平面平均取向方向 一致的概率
这个向量便是位于 光线向量l 和 视线向量v 之间的中间向量(Half Vector).
h = ( l+v ) / | l+v |
微平面的取向方向与中间向量的方向越是一致. 镜面反射的强度就越是锐利.
然后再加上一个介于 0到1 之间的粗糙度参数. 就能概略的估算微平面的取向情况
微平面近似法使用了这样一种形式的 能量守恒(Energy Conservation)
随着粗糙度的上升 镜面反射区域的会增加,但是镜面反射的 亮度却会下降.
如果 不管反射轮廓的大小而让每个像素的镜面反射强度(Specular Intensity)都一样的话,那么粗糙的平面就会放射出过多的能量,而这样就违背了能量守恒定律。
光滑平面的镜面反射更强烈而粗糙平面的反射更昏暗。
为了遵守能量守恒定律,我们需要对 漫反射光和镜面反射光 之间做出明确的 区分
当一束光线碰到一个表面时,它被分离成为一个 折射
部分 和 一个 反射
部分.
当光线接触到一个表面的时候折射光是不会立即就被吸收的.
一般来说,并非所有能量都会被全部吸收,而光线也会继续沿着(基本上)随机的方向发散,然后再和其他的粒子碰撞直至能量完全耗尽或者再次离开这个表面。而 光线脱离物体表面后将会协同构成该表面的(漫反射)颜色。
在基于物理的渲染之中我们进行了简化
对于 金属(Metallic)表面,当讨论到反射与折射的时候还有一个细节需要注意:
反射光与折射光它们二者之间是互斥的关系
按照能量守恒的关系,首先计算镜面反射部分.它的值占 反射光线占 入射光线能量的百分比.
然后可以直接计算得到折射部分:
float kS = calculateSpecularComponent(...); // 反射/镜面 部分
float kD = 1.0 - ks; // 折射/漫反射 部分
能在遵守能量守恒定律的前提下知道 入射光线的反射部分与折射部分所占的总量
渲染方程(Render Equation)
它是某些聪明绝顶人所构想出来的一个精妙的方程式,是如今我们所拥有的用来模拟光的视觉效果最好的模型。
基于物理的渲染所坚定的遵循的是一种被称为 反射率方程(The Reflectance Equation)的渲染方程的特化版本。
辐射率(Radiance),在这里用 L
来表示.
辐射率被用来量化 单一方向上 发射来的 光线的大小或者强度 。
辐射通量:辐射通量Φ
表示的是 一个光源所输出的能量 ,以瓦特为单位。
RGB(或者按通常的称呼:光色)来作为辐射通量表示的简化。
立体角:立体角用 ω
表示.
它可以理解为我们描述投射到单位球上的 一个截面的大小或者面积.
投射到这个 单位 球体上的 截面的面积就被称为立体角(Solid Angle)
可以把立体角想象成为一个带有体积的方向
辐射强度:辐射强度(Radiant Intensity) 表示的是在单位球面上,一个光源向 每单位立体角 所投送的 辐射通量 。
举例来说,假设一个全向光源向所有方向均匀的辐射能量,辐射强度就能帮我们计算出它在一个单位面积(立体角)内的能量大小:
辐射强度的计算公式如下:
其中 I
表示 辐射通量Φ
除以 立体角ω
。
辐射率的方程式:
这个方程表示的是: 一个拥有 辐射通量Φ
的光源在单位面积A, 单位 立体角ω
上的辐射出的总能量:
辐射率是辐射度量学上表示一个区域平面上光线总量的物理量
它受到入射(Incident)(或者来射)光线与平面法线间的夹角θ
的余弦值cosθ的影响
float cosTheta = dot(lightDir, N);
当涉及到辐射率!!!
渲染方程中 L代表通过某个无限小的立体角ωi在某个点上的辐射率
而立体角可以视为 入射线 wi
利用光线和平面间的入射角的余弦值cosθ来计算能量.
用ωo表示观察方向,也就是出射方向
反射率公式计算了 点p在ωo方向上被反射出来的辐射率Lo(p,ωo)的总和。
或者换句话说:Lo表示了从ωo方向上观察,光线投射到点p上反射出来的辐照度。
需要计算的就不只是是单一的一个方向上的入射光,
而是一个以点p为球心的 半球领域Ω内 所有方向上的入射光。
一个半球领域(Hemisphere)可以描述为以平面法线n为轴所环绕的半个球体:
RDF,或者说 双向反射分布函数
BRDF 可以 近似的求出 每束光线对于一个给定材质属性的平面上最终反射出来的光线所作出的贡献.
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表示粗糙度.
几何函数从统计学上近似的求得了微平面间相互遮蔽的比率,这种相互遮蔽会损耗光线的能量。
NDF类似,几何函数采用一个材料的粗糙度参数作为输入参数,粗糙度较高的表面其微平面间相互遮蔽的概率就越高。
将要使用的几何函数是GGX与Schlick-Beckmann近似的结合体,因此又称为Schlick-GGX:
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) 计算得出的。
PBR渲染管线所需要的 每一个表面参数都可以用纹理来定义或者建模
使用纹理可以让我们逐个片段的来控制每个表面上特定的点对于光线是如何响应的:不论那个点是金属的,粗糙或者平滑,也不论表面对于不同波长的光会有如何的反应。
PBR渲染管线当中经常会碰到的纹理列表,还有将它们输入PBR渲染器所能得到的相应的视觉输出:
反照率:反照率(Albedo)纹理 为每一个金属的纹素(Texel)(纹理像素)指定表面颜色或者基础反射率。
法线:法线贴图纹理和我们之前在法线贴图教程中所使用的贴图是完全一样的。
金属度:金属(Metallic)贴图逐个纹素的指定该纹素是不是金属质地的。根据PBR引擎设置的不同,美术师们既可以将金属度编写为灰度值又可以编写为1或0这样的二元值。
粗糙度:粗糙度(Roughness)贴图可以以纹素为单位指定某个表面有多粗糙。采样得来的粗糙度数值会影响一个表面的微平面统计学上的取向度。
AO:环境光遮蔽(Ambient Occlusion)贴图或者说AO贴图为表面和周围潜在的几何图形指定了一个额外的阴影因子。
美术师们可以在纹素级别设置或调整这些基于物理的输入值,还可以以现实世界材料的表面物理性质来建立他们的材质数据。这是PBR渲染管线最大的优势之一,因为不论环境或者光照的设置如何改变 这些表面的性质是不会改变的,这使得美术师们可以更便捷的获取物理可信的结果。在PBR渲染管线中编写的表面可以非常方便的在不同的PBR渲染引擎间共享使用,不论处于何种环境中它们看上去都会是正确的,因此看上去也会更自然。