Insider Insider
3dnchu 尚无浏览 6 分钟阅读

Mesh Distance Fields的表现探索&Stylized系材质中或许能用到的副产物 – UE Advent Calendar 2023

本文是Unreal Engine (UE)的日历 | Advent Calendar 2023 – Qiita 系列 4的第23天文章。介绍一些面向初学者的小型材质小技巧。

※2023/12/26 – 为 Decal 部分追加补充信息

已经24号了吧?

因为没睡,所以还是23号……

本文的主要对象

  • 正在接触 Unreal Engine 材质编辑器的人
  • 正在寻找现有材质表现的追加要素的人
  • 对 Stylized 表现感兴趣的人

概要

UE5 中引入的 Lumen 需要使用Mesh Distance Fields。在 UE4 时代默认是禁用的这个功能,现在也基本上会被启用并使用的情况变多了。因此这是一份尝试利用“Mesh Distance Fields”信息,在材质上能做些什么的备忘录

做这种事情的时候最开心了呢~

什么是 Mesh Distance Field?

将 3D 网格周围的空间划分为小网格(盒子),并在每个网格内记录到网格表面的距离数值。这个信息会用于阴影生成、光扩散计算等。
关于 Mesh Distance Field 的基础信息,前人已经整理得很充分了。想进一步了解的话,请查看那些文章。

UE5 Mesh Distance Field まとめ本


Unreal Engine のメッシュ ディスタンス フィールド
Unreal Engine 5.3 ドキュメント

顺带一提,使用 Distance Field 的软体等活用方式从 UE4 时代就已经存在了。

Distance Field Soft Bodies – Development / Rendering
Epic Developer Community Forums


【UE4】DistanceToNearestSurfaceを使ってバランスボール作ってみた
トンコツ開発ブログ

Mesh Distance Field 的注意点

Mesh Distance Field 虽然看起来很方便,但有一个规格限制:Skeletal Mesh 不能生成 Mesh Distance Field。这次的方法仅对背景中的静态网格有效。

将 Mesh Distance Field 可视化后可以确认 SkeltalMesh 会消失
SkeltalMesh 不生成 Mesh Distance Field

如果在后处理里使用,就必须用 StencilMask 等方式把 Skeletal Mesh 的区域剔除,否则可能会导致画面异常。期待有一天 Skeletal Mesh 也能生成 Mesh Distance Fields。

这次要介绍的节点

这次将聚焦于 “DistanceFieldApproxAO” 节点、“DistanceToNearestSurface” 节点、“DistanceFieldGradient” 节点这 3 个。

Distance Field Approx AO

DistanceFieldApproxAO

这是一个能轻松使用基于 Distance Field 的 AO(Ambient Occlusion)的代表性节点。

PostProcess
SurfaceMaterial
当想强调 Lumen 不足的 AO 时,可以很方便地活用。

后处理材质和表面材质都可以使用,但表现上会有一点差异,请注意。

这个节点没有文档吗?有人知道吗?是比较新的节点吗?信息太少了……。

用于后处理的简易节点

这是应用在后处理中的例子。

我觉得这可以有很多用途。

也可以作为排线的素材来有效利用。

总之,Distance Field Approx AO 本身用途还是挺多的,也很方便,不过这次就只做简单介绍。

Distance Field Gradient

据说它会在标准化后输出对象在距离场中移动的 X、Y、Z 方向。详细请看文档页面。

Unreal Engine の Utility マテリアル表現式 | Unreal Engine 5.3 ドキュメント
DistanceFieldGradient

按说明进行标准化后连接试试。

PostProcess
SurfaceMaterial
结果就变成这样了。
这个节点同样可以用于后处理材质和表面材质。

这法线信息看起来有点柔软。如果直接使用会怎样呢?

从 World Space 变换到 Tangent Space,然后直接接到 Normal。

使用 Distance Field Gradient 的 Soft Normal
得到了柔和的法线。

想着如果拿来涂抹会不会能做点什么,于是做出了这个。

Fake Soft Edge Paint #UE5 pic.twitter.com/0VW4hoMc1S

— 3D人-3dnchu- CG情報ブログ (@ymt3d) December 18, 2023

意外地反响很大,不过其实也没做什么了不起的东西。

节点很简单,就是这样的感觉。

实用性不明……
想着能不能在 Decal 里活用,于是尝试了这个

Distance Field Gradient Soft Normal Decal

柔和的法线把锐利的边缘融化掉了。

Decal
Distance Field Gradient Soft Normal Decal

湿润感提升了呢。其实这样的话,如果旋转 Decal,法线会变得不正常。
所以作为对策

取消 Tangent Space Normal 的勾选
删除 Transform 节点
这样就做出了能使用柔和法线的 Decal。

感觉这还能在别的地方派上很多用场!先写到这里。

Distance To Nearest Surface

让材质能够在关卡任意位置对 Global Distance Field 进行采样。据说是这样。详细请看文档页面。

Unreal Engine の Utility マテリアル表現式 | Unreal Engine 5.3 ドキュメントDistanceToNearestSurface

简单接一下试试

PostProcess
SurfaceMaterial
得到了稍微更浓一些的 Distance Field 信息。
这个也可以用于后处理材质和表面材质。

稍微调整一下。

PostProcess
SurfaceMaterial
给 WorldPosition 加上 Normal 信息。

PostProcess
SurfaceMaterial
变成了接近 “DistanceFieldApproxAO” 的结果。
这样就能更稳定地使用了。

如果要改造后使用,这个比 “DistanceFieldApproxAO” 似乎更有便利性。

制作可用于 Stylized 表现的 Distance Field Shadow

前言有点长了,这才是这次的主题。接下来要改造前面那个 Distance Field AO。

SurfaceMaterial
PostProcess
在原本连接 Normal 的部分中,加入光线方向(SkyAtmosphereLightDirection)。

这样就能把光线方向反映到阴影里了。

接着把 Normal 部分替换为刚才的 “DistanceFieldGradient+Normalize”。

得到了更柔和的 Shadow。

后面的细节就略过了,不过把这个 AO 叠成 3 层,给渐变增加宽度试试看。

做出了柔和的着色。

接下来就可以把这个作为素材,用在各种地方了对吧。

降低阶调

比如作为色调稍有不同的 toon shader 来使用

或者和排线结合……

等等

因为即使在投射出来的阴影中也能追加明暗,所以或许可以添加各种细节。
StylizedPP 也会在近期更新!

StylizedPP 更新中
计划在 Advent Calendar 时公开 #UE5 pic.twitter.com/GADHOhi1jS

— 3D人-3dnchu- CG情報ブログ (@ymt3d) December 11, 2023

总之,就是这样,Mesh Distance Field 看起来能有很多用途!以上,结束!

最后收尾得很随便呢

睡了……