矢量置换贴图(VDM)的应用

作者:炫云 2024-01-16

一、简介

置换(Displacement)在传统上被用于沿着网格面的法线方向偏移顶点。当我们尝试将岩石或砖块等材质应用于简单的四边形时,通过偏移其顶点,尽管能得到一定的效果,但由于四边形的顶点数量有限,效果往往不尽如人意。然而,当我们对网格进行细分时,我们能够得到更为接近真实效果的置换纹理。但这里有一个问题,那就是常规的置换纹理只包含了高度数据,这使得顶点只能在单一方向上被偏移。而Amplify Shader Editor中的Vector Displacement Mapping功能正好能解决这一问题。

由于资源限制,传统的displacement在游戏中并不常见,开发人员更偏爱Parallax Mapping等手段,因为它能提供出色的视觉体验。然而,令人惊奇的是,在实时VFX中,displacement或offsetting却是非常普遍的。

值得注意的是,地形是游戏中一个特殊的例子,因为几乎所有的地形都是通过常规的height displacement技术来创建的。

Vector Displacement Mapping的使用更为罕见,通常应用于电影和其他离线渲染领域,并以某种形式的细分相结合,因为,置换网格需要更高的顶点数,才能准确渲染其细节。这通常出现在更加精细的角色中,无论是人物还是有鳞片的龙。VDM 是渲染超精细模型,同时仍能够使用相对简化网格,最高效方法之一。

VDM 实际上可以被视为几何图像的一种形式,这是一种应用在UE 5中的Nanite而流行起来的技术。

二、Vector Displacement Mapping应用场景

矢量位移贴图不仅仅用于渲染,它还大量用于资产制作。这是将雕刻细节当作印章,重新应用的好方法,以确保设计之间的一致性。您实际上可以使用 ZBrush 和 Mudbox 创建您自己的 VDM Stamp。

您可以像 Nicolas Swijngedau 一样在他出色的恐怖 VDM 笔刷包中进行混合搭配。

以这个蘑菇为例:如果没有矢量位移,您只能使用displacement,而且效果不一定好,但使用了VDM,您实际上可以实现更接近原始雕刻的效果。

三、VDMs和Amplify Shader Editor的实践

我们一直在寻找一种可能的简化工作流程,使用户能够实时使用到 VDM,而不会被技术要求所困扰。事实证明,最麻烦的部分实际上是获取可以在Unity 3D等引擎中使用的数据。一旦我们掌握了如何使用 Mudbox 创建 VDM,我们就开始尝试使用 Amplify Shader Editor for Unity。

VDM 实际上色器编辑器中设置非常简单,并且完全基于节点,因此尝试起来很愉快。

我们首先可以试下我们在示例中看到的 “蘑菇”。同样要注意的是,我们特意使用极端示例(低面数四边形到高面数多边形)。用户仍然可以使用与高多边形网格非常相似的低多边形网格。

这种矢量位移贴图(VDM)特别适用于单个对象,但同样也适用于复杂模型。我们甚至可以利用抠图着色器隐藏不需要的底层四边形。由于我们使用的是 Tessellation,我们还可以根据摄像机距离进行自由的控制LOD。

我们对结果十分满意,但为了更加贴近实际应用,我们决定进行下一步尝试。于是,一台屏幕上带有噪点的电视成为了我们的下一个目标。

我们首先构建一个带有 UV 的低面数电视,然后,将其带到 Mudbox 进行细节设计。每个元素都在单独的层中完成,以便我们可以单独导出它们,以供以后在着色器中进行操作。

在这个特殊效果中,我们将正面、侧面烘焙成单独的EXR 纹理,然后,根据命令与基础电视纹理混合在一起。

您在这里看到的实际上是法线值和displacement值之间的简单 Lerp。

四、如何在 Mudbox 中创建 VDM并将其导入 Unity

第一步应该是测试您的创作工具,以确保导出的map可以在 Unity 中使用。我们的编辑器包包含了一个 HDRP 示例,可帮助您入门,但可以使用 Amplify Shader Editor 轻松将其转换为其他渲染器。

1. 首先在 Mudbox 中创建一个 Plane,将其命名为 low。

2. 克隆Plane,命名为high。

3. 在高处雕刻一些东西,例如耳朵。

4. 选择底部,跳转到“Extract Maps”。

5. 切换“Vector Displacement”,在列表中设置高模,选择“Absolute Tangent”,并确保将其保存为 32 位 EXR。

6. 还要确保切换法线贴图,提取并使用细分方法烘焙它(法线纹理可以是8bit)。

Mudbox 方面就是这样。在编辑器中执行以下步骤:

1. 导入 32 位 EXR VDM 纹理和法线贴图。

2. 确保Unity中的法线贴图纹理参数设置为“Normal Map”。

3. 禁用 EXR VDM 上的 sRGB(颜色纹理)。

4. 确保您的项目设置为线性,否则,Unity 会通过限制 EXR 0-1 来弄乱您的负值。

5. 将法线拖放到画布中Amplify Shader Editor。

6.添加EXR VDM纹理;您需要添加一个append节点,以便可以将绿色通道交换为蓝色通道,还需要添加一个Transform Direction节点,以便可以从切线转到对象。

7. 如果您的位移显示为“关闭”,请尝试添加“比例乘数”节点。0,10 似乎适用于大多数适用于 Unity 的模型。

这些是基础知识。如果一切按预期进行,您最终应该得到如下结果:

我们使用 Substance Painter 对墙壁进行了一些额外的步骤,这是一种快速、轻松地为物体添加纹理的方法。

1. 我们导出了网格的低、中、高多边形版本。

2.使用Substance Painter生成不破坏的基底墙(可选)。

3.并导入损坏的中多边形来创建我们损坏的材质版本(我们使用相应的损坏的高多边形版本来生成地图)。

这是墙壁效果的完整指南:

五、可以使用的地方

虽然您可以通过基于距离的曲面细分,获得免费的LOD控制,但曲面细分本身目前是密集型的模型。我们相信,可以肯定的是,下一代 GPU 将通过使用网格着色器大大提高曲面细分性能和几何成像的效果。

目前,将其添加到常见的游戏中,目前可能不可行;但是,该技术在不受常规游戏性能约束的更封闭的场景中,还是有许多其他用途。

在尝试使用 VDM 时,会想到几个示例,例如具有复杂表面(外星人、生物、恐龙等)的详细角色、复杂的角色服装、高度细节的风景装饰品、科幻面板、墙壁/地面损坏贴花;还有那些常规置换或视差映射通常无法实现的细节的实际场景,甚至是洞穴墙壁的平铺 VDM 纹理等等领域。