glTF-教程/glb-教程
基于物理的渲染:从理论到 glTF
Mohamad Moneimne,宾夕法尼亚大学
什么是PBR?
基于物理的渲染 (PBR) 是指尝试模拟光线以渲染逼真的图像的技术。顾名思义,这些技术侧重于我们对物理学的理解,以模拟光如何与具有不同物理特性的表面相互作用。由于这些交互发生在非常精细的层面上,因此 PBR 技术通常使用统计模型来增加渲染的真实感和复杂性。
PBR 已经存在了好几年,但最初计算成本太高,无法成为实时应用程序的可行选择。然而,随着计算能力的不断进步,它日益成为实时图形领域的行业标准。事实上,我们今天看到的许多实时软件,如虚幻引擎 4、Unity 5、Frostbite 和许多其他软件,都使用基于物理的渲染技术来为用户提供创建高度逼真的 3D 场景的能力。
本文的目的是在讨论 PBR 和 glTF 之间的关系之前提供一些 PBR 理论背后的直觉,并涵盖一些数学基础。
glb下载官网 教程:基于物理的渲染,你也可以!,作者:Joe “Earthquake” Wilson
我们如何在 PBR 中对光与物体的交互进行建模?
PBR 最核心的物理定律是能量守恒定律。该定律指出,孤立系统内的能量总量保持不变,但这与渲染有何关系呢?在PBR中,辐射度是守恒的能量,这意味着场景中任何点的入射光量等于该点的反射光、透射光和吸收光的总和。
在任何环境中,都很容易看到几个复杂表面的例子,这些表面似乎与光以不同的方式相互作用。例如,镜子反射出完美的图像,塑料是闪亮的,黑板是哑光的。所有这些独特的属性都可以通过考虑称为双向散射分布函数 (BSDF) 的通用数学函数来建模。这些函数描述光在与表面接触时如何根据表面所具有的属性进行散射。更具体地说,它们遵循统计模型来告诉用户入射光在特定出射方向上散射的可能性。
BSDF 听起来像是一个非常复杂的术语,因为它的实际含义,所以让我们分解它并解释它的各个部分......
-
双向是指在表面上的任何一点,光线进入和光线出去的概念。
-
散射描述了从一个方向照射到表面上的光最终可以分裂成一系列方向。例如,光可以通过从表面反射或通过表面在某些方向上透射而散射。
-
最后,使用分布函数描述光散射的细节,这需要根据表面的物理特性,光如何可能在某些方向上分布。这可以是任何东西,从所有方向的相等散射到单个方向的完美反射。
为了帮助更好地理解发生的 BSDF 类型,我们可以考虑两种一般类型......
-
BRDF(双向反射率分布函数)特别对应于描述光如何从表面反射的 BSDF。这种反射光是指我们看到的直接来自表面的颜色。在这一点上,问如下问题是正常的:如果我用白光照射香蕉,为什么它看起来是黄色而不是白色?这是因为并非所有的光都只是从表面反射出来。当表面反射某些颜色(波长)的光时,它们会吸收或传输剩余的能量。对于香蕉来说,黄色光谱中的波长主要被反射,而其他波长被吸收。
-
BTDF(双向透射率分布函数)特别对应于描述光如何通过表面传输的 BSDF。这可以在玻璃和塑料等示例中看到,我们可以看到穿过表面的光。
还有其他类型的密度函数可以解释效果,例如次表面散射(光线进入材质并反射,然后再次以其他位置和方向退出的效果)。
反射模型有哪些?
有四种具有反射分布函数 (BRDF) 的一般表面类型,用于描述光向各个方向散射的概率:
-
漫反射 – 向各个方向均匀散射光线的表面,例如,黑板的均匀颜色
-
光面反射 – 优先在一组反射方向上散射光线并显示模糊反射的表面,例如,塑料上的镜面反射高光
-
完美镜面反射 – 在单个出射方向上散射光的表面,使入射光的角度相对于表面法线相等于出射光,例如,镜子的完美反射
-
逆反射 – 主要沿光源入射方向散射光线的表面,例如,天鹅绒上的镜面高光
添加图片注释,不超过 140 字(可选)
</img>
然而,现实中的表面不太可能只遵循这些模型之一。因此,大多数材质可以建模为这些材质的复杂组合。
对于每种类型的反射,分布可以是各向同性的或各向异性的。
-
各向同性 – 当物体绕其法线旋转时,反射的光量在某一点不会改变。对于我们在日常生活中看到的大多数表面来说都是如此。
-
各向异性 – 当对象绕其法线旋转时,光量在某个点上会发生变化。发生这种情况是因为表面上的小凸起和凹槽大多朝向同一方向而不是随机方向,这会导致拉长和模糊的反射。这可以在某些材料中看到,例如拉丝金属和天鹅绒。
BTDF 呢?
反射分布的类型也适用于透射(不包括逆向反射),但反过来讨论光在穿过表面后如何传播。光穿过材料后传播的方向通常取决于材料本身的属性。
为了讨论这与反射有何不同,请考虑穿过表面的单个光线,就像完美镜面反射的情况一样。为了实现完美的镜面透射,光继续传播的角度取决于介质的折射率。这遵循斯涅尔定律,该定律使用以下方程进行描述n1θ1= n2θ2.
添加图片注释,不超过 140 字(可选)
</img>
其中 n 是第一和第二介质的折射率,θ 是光照射然后穿过表面时相对于法线的角度。这意味着,如果两种介质的折射率相同,则光线继续保持完全笔直。然而,如果指数不同,光一旦传递到下一个介质,就会向不同的方向弯曲。一个很好的例子是从空气中移动到水中的光如何弯曲,导致我们在水中看到的扭曲。
这与完美镜面反射不同,在完美镜面反射中,入射角将始终等于出射角。
反射和透射多少光?
对于基于物理的渲染器来说,了解表面上反射或透射的光量非常重要。正是这些效应的组合,描述了蜂蜜和彩色玻璃等物质,它们都有颜色并且可以透视。
这些量彼此直接相关,并由菲涅耳方程描述。这些方程描述了两种类型的介质,即电介质和导体。
-
电介质:这些介质是玻璃、塑料和陶瓷等介质,无需导电即可传输电力(即绝缘体)。我们可以使用以下方程来近似这些表面反射和传输的能量......
添加图片注释,不超过 140 字(可选)
</img> 哪里r||是平行偏振光的菲涅尔反射率和r⟂是垂直偏振光的反射率。下标对应于入射 (i) 和传输 (t) 方向。 对于非偏振光,菲涅尔反射率可以建模为Fr= 0.5(r||2+ r⟂2).然后,由于能量守恒,菲涅耳透射率可以建模为Ft= 1 - Fr.
-
导体:这些是能够以一定容量传输热量和电力的介质。一些例子包括大多数(但不是全部)金属,例如铜、银和金。与电介质不同,导体不透光。相反,它们吸收一些入射光,这些入射光会转化为热量。吸收光的量使用导体的吸收系数 k 来描述。这些使用以下术语进行近似......
添加图片注释,不超过 140 字(可选)
</img> 菲涅尔反射率建模为Fr= 0.5(r||2+ r⟂2).
所有表面的粗糙度都相同吗?
能够显示表面的粗糙度或光滑度非常有用,而无需直接创建几何体或提供凹凸贴图。相反,表面可以建模为小微面的集合,其中表面越粗糙,其锯齿状微面就越多。这些微面可以被认为是物体表面上的小脊,在非常精细的水平上改变表面法线,这为渲染图像增加了很多真实感。表面上微刻面的分布可以使用统计模型来描述,其示例包括 Oren-Nayar 模型、Torrance-Sparrow 模型和 Blinn 微面分布模型。
有了这些微观面的知识,我们可以模拟光线和相邻脊之间一些有趣的几何相互作用。考虑以下三种情况:
-
相邻的微面会阻挡从另一个微面反射的光,从而导致掩蔽。
-
相邻的微面会阻挡入射光,导致阴影。
-
相邻的微面可以反射来自另一个微面反射的光,从而引起相互反射。
添加图片注释,不超过 140 字(可选)
</img><
添加图片注释,不超过 140 字(可选)
/img><
添加图片注释,不超过 140 字(可选)
/img>
模拟这三种现象有助于增强表面粗糙度的真实感。
什么是材料?
材料是用于对 BRDF 和 BTDF 混合物指定的表面进行建模的高级描述。这些 BSDF 被指定为有助于构建材料视觉属性的参数。例如,我们可以通过提供漫反射值来描述光线如何与表面相互作用,并提供标量粗糙度值来描述其纹理来描述哑光材质。要从遮罩切换到塑料,我们可以简单地向遮罩材质添加一个光泽镜面反射值,以重新创建可以在塑料上看到的镜面反射高光。
描述材质后,我们可以在整个 3D 场景的网格体上使用此材质。您可以创建单个材质并将其分配给场景中的每个对象,但这将使应用程序变得相当无聊。使用基于物理的材质,我们可以创建复杂的材质,使场景栩栩如生,并为用户提供视觉上引人注目的体验。
为了更好地了解我们可以用这个抽象创建什么,这里列出了一些常见材料以及它们的描述可能需要什么......
-
镜子 - 完美的镜面反射
-
金属 - 导体的菲涅尔方程描述的漫反射和镜面反射
-
透明玻璃 - 镜面反射和透射的组合
-
彩色玻璃 - 与透明玻璃一样的镜面反射和透射,但添加了漫反射以考虑颜色
glTF 从何而来?
您可能知道,glTF 是一种 3D 文件格式,可以高效传输和加载 3D 场景,包括材质。
随着实时应用中对 PBR 材料的需求不断增加,很明显,用于描述这些材料的语言几乎没有一致性。例如,虚幻引擎4中使用的基于物理的材质的参数是基色、粗糙度、金属和镜面反射,而Marmoset则使用反照率、微表面和反射率。这在使用不同应用程序的艺术家和开发人员之间造成了语言障碍,并使用户难以在他们之间轻松导入和导出文件。
考虑到这一点,glTF 旨在以一种易于实现且足以满足大多数用例的一致方式将 PBR 引入运行时引擎。这允许开发人员重用导出器和管道工具,而不是创建特定于应用程序的工具。
引用
-
基于物理的渲染,你也可以!,作者:Joe “Earthquake” Wilson
-
基于物理的渲染,第二版:从理论到实现,作者:Matt Pharr 和 Greg Humphreys
-
康奈尔大学 CS667 散射讲义,作者:Steve Marschner