• glTF 中基于物理的渲染(PBR)


    推荐:使用 NSDT场景编辑器快速搭建3D应用场景

    什么是PBR

    基于物理的渲染 (PBR) 是指尝试模拟光线以渲染逼真图像的技术。顾名思义,这些技术侧重于我们对物理学的理解,以模拟光如何与具有不同物理特性的表面相互作用。由于这些交互发生在非常精细的级别上,因此PBR技术通常使用统计模型来增加渲染的真实感和复杂性。

    PBR已经存在了好几年,但最初计算成本太高,无法成为实时应用程序的可行选择。然而,随着计算能力的不断进步,它越来越成为实时图形的行业标准。事实上,我们今天看到的许多实时软件,如虚幻引擎4、Unity 5、Frostbite和许多其他软件,都使用基于物理的渲染技术来为用户提供创建高度逼真的3D场景的能力。

    本文的目的是在讨论PBR和glTF之间的关系之前,提供PBR理论背后的一些直觉,并涵盖一些数学基础。

    我们如何在PBR中对光-物体相互作用进行建模?

    PBR最核心的物理定律是能量守恒定律。该定律指出,孤立系统内的能量总量保持不变,但这与渲染有何关系?在PBR中,辐射是守恒定的能量,这意味着场景中任何点的入射光量等于该点反射,透射和吸收光的总和。

    在任何环境中,都很容易看到几个复杂表面的例子,这些表面似乎与光相互作用的方式不同。例如,镜子反射完美的图像,塑料有光泽,黑板是哑光的。所有这些独特的属性都可以通过考虑称为双向散射分布函数(BSDF)的一般数学函数来建模。这些函数根据表面所包含的属性描述光在与表面接触时如何散射。更具体地说,它们遵循统计模型来告诉用户入射光在特定传出方向上散射的可能性。

    BSDF 听起来是一个非常复杂的术语,所以让我们分解它并解释它的各个部分......

    • 双向是指在表面上的任何一点,光进入和熄灭的概念。
    • 散射描述了从一个方向照射到表面上的光最终可以分裂成一系列方向。例如,光可以通过从表面反射或通过表面在某些方向上透射而散射。
    • 最后,如何使用分布函数描述光散射的细节,这需要根据表面的物理特性如何在某些方向上分布光。这可以是任何东西,从所有方向的相等散射到单个方向的完美反射。

    为了帮助更好地理解BSDF的种类,我们可以考虑两种一般类型...

    • BRDF(双向反射分布函数)专门对应于描述光如何从表面反射BSDF。这种反射光是指我们看到的直接来自表面的颜色。在这一点上,问一些类似以下内容的事情是正常的:如果我用白光照射香蕉,为什么它看起来是黄色而不是白色?这是因为并非所有光都只是从表面反射。当表面反射某些颜色(波长)的光时,它们吸收或传输剩余的能量。对于香蕉,黄色光谱中的波长主要被反射,而其他波长被吸收。
    • BTDF(双向透射率分布函数)专门对应于描述光如何通过表面传输BSDF。这可以在玻璃和塑料等例子中看到,我们可以看到穿过表面的光。

    存在其他类型的密度函数来解释诸如次表面散射(光线进入材料并在其他位置和方向再次退出之前反弹的效应)等效应。

    有哪些反射模型?

    有四种具有反射分布函数 (BRDF) 的一般表面类型,用于描述光向所有方向散射的概率:

    • 漫反射 – 向各个方向均匀散射光线的表面,例如,黑板的颜色均匀
    • 有光泽的镜面反射 – 优先在一组反射方向上散射光线并显示模糊反射的表面,例如塑料上的镜面反射高光
    • 完美镜面反射 – 在单个出射方向上散射光的表面,使得入射光的角度等于相对于表面法线的出射光,例如,镜子的完美反射
    • 镜反射 – 主要沿光源入射方向将光线散射回去的表面,例如天鹅绒上的镜面高光

    然而,现实中的表面不太可能只遵循这些模型之一。因此,大多数材料可以建模为这些材料的复杂组合。

    对于每种类型的反射,分布可以是各向同性的或各向异性的。

    • 各向同性 – 当物体绕其法线旋转时,反射的光量在某一点上不会改变。对于我们在日常生活中看到的大多数表面来说,情况都是如此。
    • 各向异性 – 当物体绕其法线旋转时,光量在某一点上会发生变化。这是因为表面上的小凸起和凹槽大多朝向同一方向,而不是随机定向,这会导致细长和模糊的反射。这可以在某些材料中看到,例如拉丝金属和天鹅绒。

    BTDF呢?

    反射分布的类型也适用于透射(不包括逆向反射),但反过来讨论光在穿过表面后如何传播。光穿过材料后传播的方向通常取决于材料本身的特性。

    为了讨论这与反射有何不同,请考虑穿过表面的单条光线,例如完美镜面透射的情况。对于完美的镜面透射,光继续传播的角度取决于介质的折射率。这遵循斯涅尔定律,该定律使用等式描述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微面分布模型。

    有了这些微观面的知识,我们可以模拟光和相邻脊之间的一些有趣的几何相互作用。请考虑以下三种情况:

    1. 相邻的微面会阻挡从另一个微面反射的光,从而导致遮蔽
    2. 相邻的微面会阻挡入射光,从而导致阴影
    3. 相邻的微面可以反射来自另一个微面反射的光,从而引起相互反射

    模拟这三种现象有助于增强表面上粗糙度的真实感。

    什么是材料?

    材料是用于对由 BRDF 和 BTDF 混合物指定的表面进行建模的高级描述。这些 BSDF 被指定为有助于构建材质视觉属性的参数。例如,我们可以通过提供漫反射值来描述光如何与表面相互作用,并提供标量粗糙度值来描述其纹理来描述哑光材质。要从哑光转向塑料,我们可以简单地在哑光材质中添加一个有光泽的镜面反射值,以重现塑料上可以看到的镜面反射高光。

    描述材质后,我们可以在整个 3D 场景中的网格上使用此材质。您可以创建单个材质并将其分配给场景中的每个对象,但这会使应用程序变得相当无聊。使用基于物理的材质,我们可以创建复杂的材质,使场景栩栩如生,并为用户提供视觉上引人注目的体验。

    为了更好地了解我们可以通过这种抽象创建什么,这里列出了一些常见材料以及它们的描述可能需要什么......

    • 镜子 - 完美的镜面反射
    • 金属 - 导体菲涅耳方程描述的漫反射和镜面反射
    • 透明玻璃 - 镜面反射和透射的组合
    • 彩色玻璃 - 与透明玻璃一样的镜面反射和透射,但增加了漫反射以考虑颜色

    glTF从何而来?

    如您所知,glTF 是一种 3D 文件格式,允许高效传输和加载 3D 场景,包括材质。

    随着实时应用中对PBR材料需求的增加,很明显,用于描述这些材料的语言几乎没有一致性。例如,虚幻引擎4中使用的基于物理的材质的参数是基色、粗糙度、金属色和镜面反射,而狨猴则使用反照率、微表面和反射率。这在使用不同应用程序的艺术家和开发人员之间造成了语言障碍,并使用户难以在他们之间轻松导入和导出文件。

    考虑到这一点,glTF 旨在以一致的方式将 PBR 引入运行时引擎,这种方式易于实现且足以满足大多数用例。这允许开发人员重用导出器和管道工具,而不是创建特定于应用程序的导出器和管道工具。

    原文链接:glTF 中基于物理的渲染(PBR) (mvrlink.com)

  • 相关阅读:
    【最详细】最新最全Java虚拟机(JVM)面试题(51道)
    浅谈配置元件之HTTP Cookie管理器
    【网络是怎么连接的】第二章(中):一个网络包的发出
    Spring 事务相关
    vant的作用及其使用方法
    SwiftUI Swift 内功之 Swift 中的属性观察者 didSet 与 willSet
    新建SpringCloud电商前端Vant项目
    二、Javascript类型[数组、对象]
    时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解
    分享78个Python源代码总有一个是你想要的
  • 原文地址:https://blog.csdn.net/ygtu2018/article/details/132900913