PBR,或更通常称为基于物理的渲染,是一组渲染技术,它们或多或少基于与物理世界更接近的相同基础理论。由于基于物理的渲染旨在以物理上合理的方式模拟光线,因此与我们的原始光照算法(如 Phong 和 Blinn-Phong)相比,它通常看起来更逼真。它不仅看起来更好,因为它与实际物理非常接近,我们(尤其是艺术家)可以根据物理参数创作表面材质,而无需诉诸廉价的黑客和调整来使照明看起来正确。基于物理参数创作材质的一大优势是,无论光照条件如何,这些材质看起来都是正确的;这在非 PBR 管道中是不正确的。

尽管如此,基于物理的渲染仍然是对现实的近似(基于物理原理),这就是为什么它不称为物理着色,而是基于物理的着色。对于要考虑基于物理的 PBR 光照模型,它必须满足以下 3 个条件(别担心,我们很快就会了解它们):

  1. Be based on the microfacet surface model. 基于微面表面模型
  2. Be energy conserving. 做到节能。
  3. Use a physically based BRDF. 使用基于物理的 BRDF(双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF))。

在接下来的 PBR 章节中,我们将重点关注最初由 Disney 探索并被 Epic Games 用于实时显示的 PBR 方法。 他们的方法基于metallic workflow金属工作流程,得到了很好的记录,被大多数流行的引擎广泛采用,并且在视觉上看起来很棒。 在这些章节结束时,我们将得到如下所示的内容:

请记住,这些章节中的主题相当高级,因此建议您对 OpenGL 和着色器照明有一个很好的了解。 我们还将深入研究一些高等数学。

1.The microfacet model 微面模型

所有的 PBR 技术都基于微平面理论。 该理论描述了任何微观尺度的表面都可以通过称为microfacets微面的微小完美反射镜来描述。 根据表面的粗糙度,这些微小的小镜子的对齐方式可能会有很大差异:

表面越粗糙,每个微面将沿着表面排列得越混乱。 这些微小的镜面排列的效果是,当专门谈论镜面照明/反射时,入射光线更有可能在更粗糙的表面上沿完全不同的方向散射,从而导致更广泛的镜面反射。 相比之下,在光滑的表面上,光线更有可能沿大致相同的方向反射,从而产生更小、更清晰的反射

在微观层面上没有一个表面是完全光滑的,但是由于这些微面足够小,我们无法在每个像素的基础上区分它们,我们在给定粗糙度参数的情况下,在统计上近似表面microfacet微面粗糙度。 基于表面的roughness粗糙度,我们可以计算出与某个向量 h 大致对齐的微平面的比率。 这个向量 h 是位于光线 l 和视图 v 向量中间halfway vector中间向量。 我们之前在高级照明一章中讨论过中途向量,其计算方式为 l 和 v 之和除以其长度

microfacets微平面halfway vector中途矢量对齐的越多,镜面反射就越清晰和越强。 连同在 0 和 1 之间变化的粗糙度参数,我们可以在统计上近似微面的对齐方式:

我们可以看到,较高的粗糙度值显示出更大的镜面反射形状,而光滑表面的镜面反射形状则更小更锐利。

2.Energy conservation(能量守恒)

microfacet approximation微面近似采用一种能量守恒形式:出射光能永远不应超过入射光能(不包括发射表面)。查看上面的图像,我们看到镜面反射区域增加,但随着粗糙度的增加,其亮度也会降低。如果每个像素的镜面强度相同(无论镜面形状的大小),较粗糙的表面会发出更多的能量(粗糙的表面,反射的的像素点会更多),这违反了能量守恒原理。这就是为什么我们在光滑表面上看到镜面反射更强烈而在粗糙表面上更暗淡的原因。

为了保持能量守恒,我们需要明确区分漫反射光和镜面反射光。光线照射到表面的那一刻,它会分裂为折射部分和反射部分反射部分是直接被反射而不进入表面的光;这就是我们所知的镜面光照。折射部分是进入表面并被吸收的剩余光;这就是我们所说的漫反射照明。

通常,并非所有能量都被吸收,并且光会继续沿(大部分)随机方向scatter散射,此时它会与其他粒子碰撞,直到其能量耗尽或再次离开表面。从表面重新出现的光线有助于表面观察到(漫射)颜色。然而,在基于物理的渲染中,我们做了一个简化的假设,即所有折射光都在非常小的撞击区域被吸收和散射,忽略了在远处离开表面的散射光线的影响。考虑到这一点的特定着色器技术称为subsurface scattering次表面散射技术,可显着提高皮肤、大理石或蜡等材料的视觉质量,但会以性能为代价。

反射和折射的另一个微妙之处是金属表面。与非金属表面(也称为电介质)相比,金属表面对光的反应不同。金属表面遵循相同的反射和折射原理,但所有折射光都被直接吸收而不会散射。这意味着金属表面只留下反射光或镜面光金属表面不显示漫反射颜色。由于金属和电介质之间的明显区别,它们在 PBR 管道中的处理方式不同,我们将在本章的后面深入研究。

反射光和折射光之间的这种区别让我们看到了关于能量保存的另一个观察结果:它们是mutually exclusive相互排斥的。任何被反射的光能都将不再被材料本身吸收。因此,作为折射光进入表面的能量直接是我们考虑反射后产生的能量。

我们通过首先计算反射,入射光,镜面反射的能量百分比分数然后直接从镜面反射部分计算折射光的部分:(折射光强+镜面反射光强 = 1

// 计算;镜面反射的光强
float kS = calculateSpecularComponent(...); // reflection/specular fraction
// 计算:折射光(漫反射光)的光强
float kD = 1.0 - kS;                        // refraction/diffuse  fraction

这样我们既知道入射光的反射量,也知道入射光的折射量,同时遵守能量守恒原理。 鉴于这种方法,折射/漫射反射/镜面反射的贡献不可能超过 1.0,从而确保它们的能量总和永远不会超过入射光能量。 这是我们在之前的光照章节中没有考虑到的东西。

3.The reflectance equation (反射方程)

图形 2.4 传统经验光照模型详解(PBR光照计算公式介绍)_wsWind的博客-CSDN博客_pbr公式

这个博客讲的很详细

这给我们带来了一个叫做渲染方程的东西,这是一些非常聪明的人提出的一个复杂的方程,它是目前我们用来模拟光的视觉效果的最佳模型。 基于物理的渲染强烈遵循渲染方程的更专业版本,称为反射方程。 要正确理解 PBR,首先要对reflectance equation反射率方程有一个扎实的理解,这一点很重要:

反射率方程起初看起来令人生畏,但当我们剖析它时,你会发现它慢慢开始变得有意义。为了理解这个方程,我们必须深入研究一些radiometry辐射测量radiometry辐射测量是电磁辐射的测量,包括可见光。我们可以使用几个辐射量来测量表面和方向上的光,但我们将只讨论一个与称为radiance辐射的反射方程相关的单个量,这里用 L 表示。radiance辐射用于量化光的大小或强度来自一个方向。一开始理解起来有点棘手,因为辐射是多个物理量的组合,所以我们将首先关注这些:

3.1 Radiant flux辐射通量辐射通量 Φ 是以瓦特为单位测量的光源的透射能量。

光是多个不同波长的能量总和,每个波长与特定的(可见)颜色相关联。因此,光源的发射能量可以被认为是其所有不同波长的函数。 390nm 到 700nm(纳米)之间的波长被认为是可见光谱的一部分,即人眼能够感知的波长。下面是每个日光波长不同能量的图像

radiant flux辐射通量测量不同波长的这个函数的总面积。 直接将这种波长测量作为输入有点不切实际,因此我们经常简化表示辐射通量,不是作为不同波长强度的函数,而是作为编码为 RGB 的光色三元组(或者我们通常称之为: 浅色)。 这种编码确实会丢失相当多的信息,但这对于视觉方面通常可以忽略不计。

3.2 Solid angle: 立体角(三维立体版本的θ角

表示为 ω,告诉我们投影到unit sphere单位球(半径r=1的球)体上的形状的大小或面积(每个物体的立体角都不一样)。 投影到这个单位球面上的面积称为solid angle立体角; 您可以将solid angle立体角可视化为具有体积的方向

想象成为这个单位球体中心的观察者,并朝形状的方向看; 您从中制作的轮廓的大小是立体角。

3.3 Radiant intensity辐射强度

Radiant intensity辐射强度测量每个Solid angle立体角radiant flux辐射通量(不同波长的这个函数的总面积),或光源在unit sphere单位球体上投影面积上的强度。 例如,给定一个在所有方向上均等辐射的全向光,辐射强度可以为我们提供它在特定区域(Solid angle立体角)上的能量:

辐射强度:的方程定义如下:

其中 I 是Solid angle立体角 ω 上的辐射通量 Φ

With knowledge of radiant flux, radiant intensity, and the solid angle, we can finally describe the equation for radiance. Radiance is described as the total observed energy in an area A over the solid angle ω of a light of radiant intensity Φ:

Radiance辐射度被描述为在区域 A 中观察到的总能量在辐射强度 Φ 的光的立体角 ω 上:

 这个是radiant flux辐射通量。面积乘以立体角乘以cos0。cosθ:光与表面法线的入射角 θ。

由于其实就是 Radiance辐射度L = I(辐射强度) * 

B = dAcos0,代表A在光方向的面积。辐射通量 dΦ / B 还是等于辐射强度I,所以其实Radiance辐射度L = 两个不同的I相乘。

Radiance 辐射度是一个区域中光量的radiometric measure辐射测量,由光与表面法线的入射(或入射)角 θ 缩放为 cosθ:光越弱,直接辐射到表面上越弱,而当它直接辐射到表面时最强 直接垂直于表面。 这类似于我们在基本照明章节中对漫反射照明的感知,因为 cosθ 直接对应于光的方向向量和表面法线之间的点积:

// 入射光与表面法线的点积cos
float cosTheta = dot(lightDir, N);  

Radiance 辐射度方程非常有用,因为它包含了我们感兴趣的大部分物理量。如果我们认为立体角 ω 和面积 A 无限小,我们可以使用辐射度来测量单条光线撞击 a 空间中的单点。 这种关系允许我们计算影响单个(fragment片段)点的单个光线的radiance辐射率; 我们有效地将立体角 ω 转换为direction vector方向向量ω(用来vector存信息),并将 A 转换为point点 p(同样是存信息)。 这样,我们可以直接在着色器中使用Radiance辐射度来计算单个光线对每个fragment片段的贡献。

事实上,当谈到辐射时,我们通常关心点 p 上的所有入射光,它是所有辐射的总和,称为irradiance辐照度。 有了Radiance辐射度irradiance辐照度的知识,我们可以回到反射率方程:

L:Radiance辐射度 

p:  某个点

ωi: 小到可以被看成是向量的Solid angle立体角。

ωo:outgoing direction to the viewer. 朝外,向观察者的Solid angle立体角

Ω: 一个上半球。

n: 点p的法线

其中  = |n||ωi|cos0

 方程含义:

1.反射方程计算点 p 在方向 ωo 上的Radiance辐射总和 Lo(p,ωo),该方向是射向观察者。

2. Lo 测量从 ωo 观察到的点 p 上的irradiance光辐照度的总和,该方向来自观察者。 

(一个是出射辐射,一个是接受辐射,Li是每个微小角度的辐射度,L0所有角度的辐射度之和,可以类比于高数求曲面表面积,ds全部加起来,就等于表面积s了) 

反射率方程是基于irradiance辐照度的,辐照度是我们测量光的所有入射辐照度的总和。 不仅是单个入射光方向,还包括以点 p 为中心的半球 Ω 内的所有入射光方向hemisphere半球可以描述为围绕表面法线 n 排列的半个球体

为了计算一个区域或(在半球的情况下)一个体积内的值的总和,我们使用称为integral积分的数学结构,在反射方程中表示为 ∫ 在半球 Ω 内的所有传入方向 dωi 上。 积分测量函数的面积,可以通过解析或数值计算。 由于渲染方程和反射方程都没有解析解,我们需要对积分进行离散数值求解。 这转化为在半球 Ω 上获取反射率方程的小离散步长的结果,并在步长上平均它们的结果。 这被称为Riemann sum黎曼和,我们可以在代码中粗略地想象如下:

int steps = 100;
float sum = 0.0f;
vec3 P    = ...;
vec3 Wo   = ...;
vec3 N    = ...;
// 积分的d的间隙程度
float dW  = 1.0f / steps;
for(int i = 0; i < steps; ++i)
{vec3 Wi = getNextIncomingLightDir(i);sum += Fr(P, Wi, Wo) * L(P, Wi) * dot(N, Wi) * dW;
}

通过 dW 缩放步长,总和将等于积分函数的总面积或体积。缩放每个离散步骤的 dW 可以被认为是反射方程中的 dωi。在数学上 dωi 是我们计算积分的连续符号,虽然它与代码中的 dW 没有直接关系(因为这是黎曼和的离散步骤),但以这种方式考虑它会有所帮助。请记住,采取离散步骤将始终为我们提供函数总面积的近似值。细心的读者会注意到,我们可以通过增加步数来提高黎曼和的准确性

反射率方程总结了半球 Ω 上所有入射光方向 ωi 的radiance辐射率,经过函数缩放,然后命中点 p,并返回所有的观察者方向上反射光 Lo。入射辐射可以来自我们熟悉的光源,也可以来自测量每个入射方向的辐射的environment map环境地图,我们将在 IBL 章节中讨论。

现在唯一未知的是被称为 BRDFbidirectional reflective distribution function双向反射分布函数的符号,它根据表面的材料特性对入射辐射进行缩放或加权

3.4 BRDF(bidirectional reflective distribution function双向反射分布函数)

BRDF 或bidirectional reflective distribution function双向反射分布函数是一个将入射(光)方向 ωi出射(视图)方向 ωo表面法线 n 和表示微表面粗糙度的表面参数 a 作为输入的函数。给定其材料属性,BRDF 近似于每个单独的光线 ωi 对不透明表面的最终反射光的贡献程度。例如,如果表面有一个完全光滑的表面(~像一面镜子),BRDF 函数将对所有入射光线 ωi (这里可用激光理解更好)返回 0.0,除了与出射光线 ωo 具有相同(反射)角度的光线返回 1.0。

BRDF 基于前面讨论的微平面理论来近似材料的反射和折射特性。为了使 BRDF 在物理上合理,它必须遵守能量守恒定律,即反射光的总和不应超过入射光的量。从技术上讲,Blinn-Phong 被认为是采用相同 ωi 和 ωo (这两者不会改变?)作为输入的 BRDF。然而,Blinn-Phong 不被认为是基于物理的,因为它不遵守能量守恒原理。有几个基于物理的 BRDF 来近似表面对光的反应。但是,几乎所有实时 PBR 渲染管道都使用称为 Cook-Torrance BRDF 的 BRDF。

Cook-Torrance BRDF 包含diffuse漫反射specular镜面反射部分:

这里 是前面提到的被refracted折射入射光能量的比率,而 被反射的比率

3.4.1 BRDF 的左侧表示方程的diffuse漫反射部分

此处表示为兰伯特。 这被称为Lambertian diffuse朗伯漫反射,类似于我们用于漫反射着色的方法,它是一个常数因子,表示为:

calbedo反照率 surface color 表面颜色(想想漫反射表面纹理)。 除以 pi 用于归一化漫射光,因为前面表示的包含 BRDF 的积分按 π 缩放(我们将在 IBL 章节中讨论)。

您可能想知道这个朗伯漫反射与我们之前使用的漫反射光照有何关系:surface color表面颜色乘以表面法线光方向之间的点积。 点积仍然存在,但移出 BRDF,因为我们在 Lo 积分的末尾找到了 n⋅ωi。

BRDF 的漫反射部分存在不同的方程,它们看起来更逼真,但计算量也更大。 然而,正如 Epic Games 得出的结论,Lambertian朗伯漫反射足以满足大多数实时渲染目的

3.4.2 BRDF 的镜面反射部分更高级一些,描述为:

Cook-Torrance 镜面反射 BRDF 由三个函数和分母中的归一化因子组成。 D、F 和 G 符号中的每一个都代表一种函数,该函数近似于表面反射特性的特定部分。这些被定义为Distribution function正态分布函数Fresnel equation菲涅耳方程Geometry function几何函数

  • Normal distribution function: approximates the amount the surface's microfacets are aligned to the halfway vector, influenced by the roughness of the surface; this is the primary function approximating the microfacets.近似于受表面粗糙度影响的microfacets表面微平面与halfway vector中途矢量对齐的数量; 这是近似微面的主要函数。
  • Geometry function: describes the self-shadowing property of the microfacets. When a surface is relatively rough, the surface's microfacets can overshadow other microfacets reducing the light the surface reflects. 描述了微面的自阴影特性。 当表面相对粗糙时,表面的微面会遮盖其他微面,从而减少表面反射的光。
  • Fresnel equation: The Fresnel equation describes the ratio of surface reflection at different surface angles.菲涅耳方程描述了不同表面角度的表面反射率。

这些函数中的每一个都是其物理等效项的近似值,您会发现每个函数的多个版本旨在以不同的方式近似底层物理; 有些更现实,有些更有效。 选择您想要使用的这些函数的任何近似版本都很好。 来自 Epic Games 的 Brian Karis 对这里的多种近似值进行了大量研究。 我们将选择 Epic Game 的 Unreal Engine 4 使用的相同函数,即 D 的 Trowbridge-Reitz GGXF 的 Fresnel-Schlick 近似G 的 Smith 的 Schlick-GGX

3.4.3 Normal distribution function (正态分布函数 代表D的部分)

Normal distribution function正态分布函数 D 在统计上近似于与(halfway)向量 h 精确对齐的microfacets微面的相对表面积。 在给定一些粗糙度参数的情况下,有许多 NDF(Normal distribution function,代表D) 可以在统计上近似微平面的一般对齐方式,我们将使用的一个称为 Trowbridge-Reitz GGX:

h:是测量表面microfacets微平面的中途矢量

a:是表面粗糙度的量度。

如果我们在不同的roughness粗糙度参数上将 h 作为表面法线和光方向之间的中间向量,我们会得到以下视觉结果:

当粗糙度低(因此表面是光滑的)时,高度集中的微平面数量与小半径上的中间向量对齐。 由于这种高浓度,NDF 显示出非常亮的光点。 然而,在粗糙的表面上,微平面排列在更随机的方向上,您会发现更多的中间向量 h 在某种程度上与微平面对齐(但不太集中),从而得到更灰色的结果。

float DistributionGGX(vec3 N, vec3 H, float a)
{float a2     = a*a;float NdotH  = max(dot(N, H), 0.0);float NdotH2 = NdotH*NdotH;float nom    = a2;float denom  = (NdotH2 * (a2 - 1.0) + 1.0);denom        = PI * denom * denom;return nom / denom;
}

3.4.4 Geometry function (几何函数)

Geometry function几何函数用来统计上近似于其微观表面细节相互遮盖的相对表面积,从而导致光线被遮挡。

obstruction:阻碍          shadowing:遮挡,阴影

与 NDF 类似,Geometry function几何函数将材料的roughness粗糙度参数作为输入,其中粗糙的表面具有更高的遮蔽microfacets微面的概率。 我们将使用的几何函数是 GGX 和 Schlick-Beckmann 近似的组合,称为 Schlick-GGX:

这里 k 是 α 的重新映射,基于我们是否将几何函数用于直接照明IBL 照明(Image base lightiing)

请注意,α 的值可能会因您的引擎如何将粗糙度转换为 α 而有所不同。 在接下来的章节中,我们将广泛讨论这种重新映射如何以及在何处变得相关。

为了有效地逼近几何,我们需要同时考虑view direction视图方向geometry obstruction几何障碍)和light direction vector光方向矢量geometry shadowing几何阴影)。 我们可以使用 Smith's method将两者都考虑在内:(view direction  and light direction)

使用 Smith 的方法和 Schlick-GGX 作为 Gsub 在不同的粗糙度 R 上给出以下视觉外观:

几何函数是 [0.0, 1.0] 之间的乘数,1.0(或白色)测量没有microfacet shadowing微面阴影,0.0(或黑色)完全microfacet shadowing微面阴影

在 GLSL 中,几何函数转换为以下代码:

float GeometrySchlickGGX(float NdotV, float k)
{float nom   = NdotV;float denom = NdotV * (1.0 - k) + k;return nom / denom;
}float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
{float NdotV = max(dot(N, V), 0.0);float NdotL = max(dot(N, L), 0.0);float ggx1 = GeometrySchlickGGX(NdotV, k);float ggx2 = GeometrySchlickGGX(NdotL, k);return ggx1 * ggx2;
}

3.4.5 Fresnel equation (菲涅耳方程)

到底是反射光更强还是折射光更强呢?了解过辐射度量学应该知道这里比较的是辐射率(Radiance)的大小。通过菲涅尔效应,当入射光方向接近垂直表面时,大部分的能量会被折射,所以我们能看清水底的东西。而当入射光方向接近平行表面时,大部分的能量会被反射。

The Fresnel equation菲涅耳方程(发音为 Freh-nel)描述了被反射的光与被折射的光的比率,它随着我们观察表面的角度而变化。光线照射到表面的那一刻,基于表面到视角的角度,菲涅耳方程告诉我们被反射的光的百分比。从这个反射比和能量守恒原理我们可以直接得到光的折射部分。

每个表面或材料在直视其表面时都有一定程度的base reflectivity基础反射率,但从某个角度观察表面时,与表面的基础反射率相比,所有反射都变得更加明显。您可以通过查看您的(大概)木制/金属桌子来自己检查这一点,该桌子从垂直视角具有一定程度的基本反射率,但是从几乎 90 度的角度看您的桌子,您会看到反射变成更明显。如果从完美的 90 度角观察,所有表面理论上都会完全反射光线。这种现象被称为Fresnel菲涅耳,并由Fresnel equation菲涅耳方程描述。

菲涅尔方程是一个相当复杂的方程,但幸运的是,菲涅尔方程可以使用 Fresnel-Schlick 菲涅尔-施利克近似来approximation近似

F0 表示表面的base reflectivity 基本反射率,我们使用称为折射率或 IOR 的东西来计算它。 正如您在球体表面上看到的那样,我们越看向表面的掠射角(半视角达到 90 度),Fresnel菲涅耳越强,因此反射越强:

菲涅耳方程有一些微妙之处。 一是菲涅耳-施利克近似仅真正定义用于介电或非金属表面。 对于导体表面(金属),用折射率计算基本反射率并不能正确成立,我们需要对导体完全使用不同的菲涅耳方程。 由于这不方便,我们通过预先计算normal incidence法线概率(F0) 处的角度为0的surface's response表面反应,就好像直接看表面一样。 根据 Fresnel-Schlick 近似,我们根据视角对这个值进行插值,这样我们就可以对金属和非金属使用相同的方程。

(其实就是,为了让金属也能直接套用非金属的菲涅尔公式,用Schlick方法来对the base reflectivity基本反射率进行插值估算。有了金属的the base reflectivity基本反射率的估算值,就能直接套用非金属的菲涅尔公式)

The surface's response at normal incidence表面在垂直入射时的响应,或the base reflectivity基本反射率,可以在像这样的大型数据库中找到,下面列出了一些更常见的值,取自 Naty Hoffman 的课程笔记:

这里有趣的是,对于所有电介质表面,基本反射率永远不会超过 0.17,这是例外而不是规则,而对于导体,基本反射率开始时要高得多,并且(大部分)在 0.5 和 1.0 之间变化。 此外,对于导体(或金属表面),基本反射率是有色的。 这就是为什么 F0 呈现为 RGB 三元组的原因(法向入射的反射率可能因波长而异); 这是我们只能在金属表面看到的东西。

与介电表面相比,金属表面的这些特定属性产生了称为金属工作流程的东西。 在金属工作流程中,我们使用称为metallic workflow金属度的额外参数编写表面材料,该参数描述表面是金属表面还是非金属表面。

从理论上讲,材料的金属性是二元的:要么是金属,要么不是; 不可能两者兼而有之。 然而,大多数渲染管线允许在 0.0 和 1.0 之间线性配置表面的金属度。 这主要是因为缺乏材质纹理精度。 例如,在金属表面上具有小(非金属)灰尘/沙状颗粒/划痕的表面很难用二元金属度值渲染。

通过预先计算电介质和导体(非金属)的 F0,我们可以对两种类型的表面使用相同的 Fresnel-Schlick 近似值,但如果我们有金属表面,我们必须tint the base reflectivity对基础反射率进行着色。 我们一般是这样完成的:

vec3 F0 = vec3(0.04);
F0      = mix(F0, surfaceColor.rgb, metalness);

我们定义了一个近似于大多数电介质表面的基本反射率。 这是另一个近似值,因为 F0 是在最常见的电介质周围平均的。 0.04 的基本反射率适用于大多数电介质,并且无需编写额外的表面参数即可产生物理上合理的结果。 然后,根据表面的金属程度,我们要么采用电介质基础反射率,要么采用 F0 作为表面颜色。 因为金属表面吸收所有折射光,所以它们没有漫反射,我们可以直接使用表面颜色纹理作为它们的基础反射率

在代码中,Fresnel Schlick 近似转换为:

--菲涅尔近似
vec3 fresnelSchlick(float cosTheta, vec3 F0)
{return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}

cosTheta 是表面法线 n 和halfway中间 h(或视图 v)方向之间的点积结果。(halfway之前有记录,一个刚好处于视角方向矢量与光照方向矢量中间的单位向量。)

3.4.6 Cook-Torrance reflectance equation (Cook-Torrance 反射方程)

通过描述 Cook-Torrance BRDF 的每个组件,我们可以将基于物理的 BRDF 包含到现在最终的反射率方程中:

 然而,这个方程在数学上并不完全正确。 您可能还记得Fresnel term菲涅耳项 F 表示在表面上反射的光的比率。 这实际上就是ks,这意味着反射率方程的镜面反射 (BRDF) 部分隐含地包含反射率比率 ks。 鉴于此,我们最终的最终反射率方程变为:(BRDF里面有了ks,不用单独再写了)

 (ks被省略了)

这个等式现在完全描述了一个基于物理的渲染模型,它通常被认为是我们通常理解为基于物理的渲染,或 PBR。 如果您还没有完全理解我们需要如何将所有讨论过的数学组合到代码中,请不要担心。 在接下来的章节中,我们将探索如何利用反射方程在我们的渲染照明中获得更加物理合理的结果,所有的点点滴滴应该慢慢开始融合在一起。

4.Authoring PBR materials (创作 PBR 材质)

了解 PBR 的基础数学模型后,我们将通过描述艺术家通常如何创作我们可以直接输入 PBR 方程的表面的物理属性来完成讨论。 PBR 管道所需的每个表面参数都可以通过纹理定义或建模。 使用纹理可以让我们按片段控制每个特定表面点应如何对光做出反应:该点是金属的、粗糙的还是光滑的,或者表面如何响应不同波长的光。

在下面,您将看到在 PBR 管道中经常找到的纹理列表以及提供给 PBR 渲染器的视觉输出:

Albedo反照率反照率纹理为每个纹素指定表面的颜色,或者如果该纹素是金属的,则指定基本反射率。这在很大程度上类似于我们之前使用的漫反射纹理,但所有光照信息都是从纹理中提取的。漫反射纹理通常在图像内部有轻微的阴影或变暗的裂缝,这是您不希望在反照率纹理中出现的东西;它应该只包含表面的颜色或折射吸收系数)。

Normal法线:法线贴图纹理与我们之前在法线贴图章节中使用的完全一样。法线贴图允许我们为每个片段指定一个独特的法线,以产生表面比其平坦对应物更凹凸不平的错觉。

Metallic金属:金属贴图为每个纹素指定纹素是金属的还是非金属的。根据 PBR 引擎的设置方式,艺术家可以将金属度创作为灰度值或二进制黑色或白色。

Roughness粗糙度:粗糙度贴图以每个纹素为基础指定表面的粗糙程度。粗糙度的采样粗糙度值影响表面的统计微平面方向。较粗糙的表面会获得更广泛和更模糊的反射,而光滑的表面会获得聚焦和清晰的反射。一些 PBR 引擎需要平滑度贴图而不是粗糙度贴图,一些艺术家认为这更直观。然后在采样时将这些值转换为(1.0 - 平滑度)粗糙度。

AO:ambient occlusion环境光遮蔽或 AO 贴图指定了表面和潜在周围几何体的额外阴影系数。例如,如果我们有一个砖表面,反照率纹理应该在砖的缝隙内没有阴影信息。然而,AO 贴图确实指定了这些变暗的边缘,因为光线更难逃逸。在照明阶段结束时考虑环境光遮蔽可以显着提高场景的视觉质量。网格/表面的环境遮挡贴图可以手动生成,也可以在 3D 建模程序中预先计算。

艺术家可以基于每个纹理设置和调整这些基于物理的输入值,并且可以将它们的纹理值基于真实世界材料的物理表面属性。这是 PBR 渲染管线的最大优势之一,因为无论环境或照明设置如何,表面的这些物理属性都保持不变,从而使艺术家的生活更容易获得物理上合理的结果。在 PBR 管道中创作的表面可以很容易地在不同的 PBR 渲染引擎之间共享,无论它们所处的环境如何,它们看起来都是正确的,因此看起来更加自然。

Learn OpenGL 笔记7.1 PBR Theory(physically based rendering基于物理的渲染 理论)相关推荐

  1. 什么是Physically Based Rendring基于物理的渲染?

    什么是Physically Based Rendring基于物理的渲染? PBR不是一种技术,而是一种渲染方式 PBR的优点 什么是Physically Based Shader? 材质的光学特性 微 ...

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

    转载自: https://learnopengl.com/PBR/Theory Learn OpenGL PBR Theory PBR 基于物理的渲染(Physically Based Renderi ...

  3. Physically Based Rendering——史上最容易理解的BRDF中D函数NDF的中文资料

    粗糙度决定了D函数的分布,一般粗糙度是D函数的方差 本文假定读者已经对PBR即Physcially Based Rendering 基于物理的渲染有了初步的了解,对于PBR的入门有很多文章都介绍的不错 ...

  4. 基于物理的渲染PBR(一):pbr的基础理论和推导

    初始PBR 最近刚接触pbr不久,我搜寻了许多文章进行阅读并了解后发现,pbr涉及到的知识点繁琐且不容易理解,所以想在博客上给自己记录并总结一下,方便以后回顾并加深记忆. 这里首先借用知乎上的大佬毛星 ...

  5. PBR 基于物理的渲染

    1. PBR一般概念 1. 什么是PBR PBR(Physicallly-Based-Rendering), 基于物理的渲染,有时也叫PBS(Physicallly-Based-Shading),(其 ...

  6. Physically Based Rendering,PBRT(光线跟踪:基于物理的渲染) 笔记

     提起PBRT(Physically Based Rendering: From Theory to Implementation)这本书, 在图形学业界可是鼎鼎大名, 该书获得2005年软件界J ...

  7. PBR (Physically Based Rendering)概念篇

    一.PBR是什么? Physically Based Rendering:基于物理的渲染 PBR:是一套框架,通过PBR保证整体的色调以及画面的统一 什么是基于物理渲染? 对现实世界中的一种近似,而不 ...

  8. PBR:基于物理的渲染(Physically Based Rendering)+理论相关

    一: 关于能量守恒 出射光线的能量永远不能超过入射光线的能量(发光面除外).如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降.如果不管反射轮廓的大小而让每个像素的镜 ...

  9. 【基于物理的渲染(PBR)白皮书】(五)几何函数相关总结

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/81708753 在基于物理的渲染 ...

最新文章

  1. 用Asp.net还原与恢复sqlserver数据库
  2. 【 FPGA 】FIR滤波器之 多个系数集问题以及 使用非整数实数的系数规范问题
  3. php实现cc攻击防御和防止快速刷新页面示例
  4. 第八周项目实践2 建立连串算法库
  5. cin函数的一点理解
  6. 软考网络工程师--计算机硬件基础
  7. JAVA中string的赋值_Java中关于String赋值的两种形式
  8. 数列分块入门 (1 ~ 7)
  9. Find命令使用详解
  10. 现代控制会用到python嘛_Python 流程控制
  11. 问题:There are no packages available for installation 问题的解决办法
  12. Shape Correspondence and Functional Maps
  13. python自学记录 pydev安装
  14. 《微积分》框架逻辑的简单理解
  15. gulp错误GulpUglifyError: unable to minify JavaScript解决
  16. 华为手机计算机快捷,快速让华为手机变成一台电脑,INNOCN便携显示器的更多玩法...
  17. 【智慧医疗】什么是电子健康记录(EHR)?
  18. 普通电脑用u盘安装服务器系统安装教程,Windows Server 2016使用U盘安装需要哪些步骤 硬盘安装Windows Server 2016图文教程...
  19. Android手机应用开发之手机GPS定位
  20. 论文阅读-A Fast Learning Algorithm for Deep Belief Nets

热门文章

  1. IT业9大最糟糕CEO决策(转载)
  2. 12000字解读安踏:DTC中国化的“热血战纪”
  3. java用户登录注册
  4. 【Mysql】根据经纬度远近排序
  5. oracle集群crs,oracle rac集群 crs常用命令(转)
  6. linux共享实体机硬盘,实现目录共享
  7. MyCP.java蓝墨云班课
  8. 使用Python调整图片尺寸(大小)
  9. 如何给图片降噪?看完你就学会了
  10. 百度、快手、商汤、旷视等重磅嘉宾确认出席AI ProCon 2019,你还剩1天早鸟票特权!...