效果图展示:
参考文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-fresnel-in-your-unreal-engine-materials?application_version=5.4
二、所用知识点扩充
在创建电影或过场动画时,你常常需要想办法更好地突显角色或场景的轮廓。这时你需要用到一种光照技术,称为边沿光照或边缘光照,它的原理是通过添加额外光源来帮助区分角色轮廓与背景。虽然这能够很好地适用于电影,但将额外光源添加到3D场景会增加额外的复杂度,使其很快变得难以管理。
虚幻引擎在材质层面提供了相应的解决方案。 美术师可以使用 菲涅尔(Fresnel) 在角色或道具的材质中模拟边沿光照,更好地控制效果的外观体验。 菲涅尔是一种固有属性,在许多材质中自然存在,其中包括玻璃、水以及一些类型的织物和油漆。本教程中的技术将帮助你更准确地模拟这些材质。
1、菲涅尔
菲涅尔(Fresnel) 这一术语用于说明你看到的光线如何根据视角的变化以不同的强度反射。例如,你站在水池边,低头看脚下的水,你会发现水面的反射不是特别强烈。随着你抬起头,使你的视线与水池中的水面平行,你会开始发现水面越来越波光粼粼。水和玻璃都表现出很强的菲涅尔倾向,即视线垂直于表面时,它们看起来相对透明,视线未垂直于表面时,它们会反射更多光线。
请注意,从正面看时,相框中的玻璃是透明的,从侧面看时,玻璃的反光会更明显。
在虚幻引擎中,菲涅尔材质表达式 会根据表面法线与摄像机方向的点积计算衰减。当表面法线径直指向摄像机时,会输出值0,意味着应该不会发生菲涅尔效果。当表面法线与摄像机垂直时,会输出值1,意味着应该发生完整的菲涅尔效果。结果会限制在[0, 1]范围内,这样就不会在中心看到负值颜色。下图演示了此概念。
在球体中间(标记为0),没有菲涅尔效果。这是因为摄像机径直指向表面法线。朝向球体边缘(标记为1),表面法线趋于与摄像机垂直,菲涅尔效果也越来越明显。 这会造成球体边缘被照亮的感觉。
2、菲涅尔材质表达式
工具(Utility) 下的 菲涅尔 材质表达式是本教程中使用的选项,并且在这两个选项中更易于配置。强烈推荐你使用此版本入手,并仅在更好地理解该节点运作方式之后才使用菲涅尔材质函数。
属性 | 说明 |
---|---|
ExponentIn | 此输入将控制菲涅尔效果的衰减。 |
BaseReflectFractionIn | 这指定了视线垂直于表面时的高光度反射率。将其设置为值1实际上会禁用菲涅尔。 |
法线(Normal) | 你可以输入法线贴图来更改菲涅尔效果的渲染方式。法线贴图必须从切线空间变换为世界空间(参见下文)。 |
有三种方法可调整菲涅尔材质表达式中的值。
-
在材质图表中选择节点时,你可以在 细节(Details) 面板中输入值。
你还可以将常量或标量参数连接到输入。
你可以将法线贴图拖到 法线(Normal) 输入来更改菲涅尔效果的外观。如果你使用法线贴图纹理,必须通过 TransformVector 表达式传递它,然后再将其连接到法线输入。这会将法线贴图从切线空间变换为世界空间。如果不进行此变换,法线贴图可能无法按你所需的方式影响菲涅尔。
3、菲涅尔材质函数
向量操作(Vector Ops) 类别中的 Fresnel_Function 材质函数是高度可自定义的菲涅尔版本,用于提供对菲涅尔效果的多个不同方面的控制。这个新增加的功能有其缺点,因为设置出错可能导致菲涅尔效果的渲染存在瑕疵或错误。
你应该仅在 工具(Utility) 下的菲涅尔材质表达式不能产生你所需的结果时使用此材质函数。
属性 | 说明 |
---|---|
法线向量(V3)(Normal Vector (V3)) | 你可以在此处输入法线来修改菲涅尔效果的渲染。为获得准确的结果,你必须通过变换节点(切线空间到世界空间)来传递法线贴图。 |
摄像机向量(V3)(Camera Vector(V3)) | 手动更改用于确定摄像机和表面法线之间点积的摄像机向量。 |
反转菲涅尔(B)(Invert Fresnel(B)) | 反转菲涅尔的效果。如果你希望菲涅尔仅在中心或边缘应用,这会很有用。 |
能力(S)(Power(S)) | 输入标量以控制菲涅尔效果的范围(或衰减)。输入的数字越大,受影响的区域越小。输入的数字越小,那么菲涅尔节点影响的表面区域越大。 |
使用低开销对比度(B)(Use Cheap Contrast(B)) | 启用此属性后,菲涅尔节点会使用开销更低的方法来计算亮色与暗色之间的对比度。 |
低开销对比度暗色(S)(Cheap Contrast Dark (S)) | 此属性将控制菲涅尔的昏暗程度。这仅在启用 使用低开销对比度(Use Cheap Contrast) 时有效果。 |
低开销对比度亮色(S)(Cheap Contrast Bright (S)) | 此属性将控制菲涅尔效果的明亮程度。这仅在启用 使用低开销对比度(Use Cheap Contrast) 时有效果。 |
限制菲涅尔点积(B)(Clamp Fresnel Dot Product (B)) | 将菲涅尔点积的结果限制在0到1之间。 此属性默认为true,但你可以使用设置为false的 静态布尔(Static Bool) 将其覆盖。 |
4、如何在材质中使用菲涅尔
使用以下步骤可创建要使用菲涅尔的材质。
-
在 内容浏览器(Content Browser) 中 右键点击 并从上下文菜单中的创建基本资产(Create Basic Asset)分段选择 材质(Material) 。 创建材质后,将其命名为 FresnelMaterial 。
-
在 内容浏览器(Content Browser) 中 双击 缩略图,打开新材质。
-
展开 控制板(Palette) 或在材质图表中 右键点击 以显示上下文菜单。搜索以下材质表达式节点并将其添加到图表中。
-
重命名所有标量和向量参数节点,并在细节(Details)面板中设置其默认值。
名称 默认值 菲涅尔颜色(Fresnel Color) 1.0, 0.0, 0.0, 0.0 基础颜色(Base Color) 0.5, 0.5, 0.5, 0 菲涅尔衰减(Fresnel Falloff) 8 粗糙度(Roughness) 0.5
5.将 Multiply 节点添加到图表,然后使用下图作为指南来连接所有材质表达式。
点击工具栏中的 应用(Apply) 来编译材质,然后点击 保存(Save) 。
请记住,在 菲涅尔衰减(Fresnel Falloff) 中输入较大的数字会将菲涅尔效果愈加推向边缘,而输入较小的数字则会使效果更靠近中心。下面是 菲涅尔衰减(Fresnel Falloff) 值从0增加到10的效果展示。请注意,随着数字增加,蓝色会逐渐推向球体边缘。
5、菲涅尔和法线贴图
由于菲涅尔会根据脸部的表面法线计算,所以你可以使用法线贴图来影响菲涅尔效果在材质中的分布。菲涅尔节点的运用原理是检查表面法线是否与摄像机垂直。如果与摄像机垂直,则菲涅尔效果可见。在光滑的球体上,这意味着菲涅尔效果仅在边缘发生。
但是,引入法线贴图时,表面法线会被修改,可能使网格体的轮廓中出现起伏和轮廓线。 这意味着菲涅尔效果可以高亮或突显在表面法线光滑时不可见的细节。
如需直观了解其运作原理,可以参考下面的两张图片。左图(1)显示了菲涅尔节点在使用扁平表面法线时的输出情况。菲涅尔效果仅在球体边缘可见。 右图(2)输入了法线贴图,显著改变了网格体的表面法线。 现在,菲涅尔效果沿法线贴图中定义的轮廓线可见。
下图显示了不同的法线贴图对菲涅尔的影响。
三、效果制作步骤分析:
1、观察场景法线得到的颜色图
当蓝图节点为下图时:
效果图如下:
2、观察场景法线作为fresnel法线参数得到的效果图
当蓝图节点为下图时:
效果图如下:
3、观察环境光遮挡得到的遮罩效果
4、观察场景法线的fresnel与环境光遮挡的正片叠底效果
5、用环境光遮挡选区作为两种颜色的线性插值的alpha
6、自定义深度减去场景深度得到的遮罩样式
作用效果如下图:
7、把自定义深度遮罩选区作为上一个图像的蒙版
实际上我们得到了一个自定义深度的遮罩图。把自定义深度遮罩应用于用环境光遮挡来定义的不同颜色图上。
把墙开启自定义深度通道,效果如下图:
当我们把人物隔离出去时,节点连接图和效果图如下:
8、给被隔离的人物添加颜色
这样会随着角度的不同让角色显示不同的颜色。