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