效果是参考Halo系列的尝试做一个明亮,艳丽的球形盾的材质,如下图;
在创建之前需要有我们在maya里面制作的六边形球体。
全部材质节点生图。
1
初始设置
首先在新建的ue5项目里面导入资源,模型和贴图
在我们进入材质编辑器之前,将我们的静态网格物体拖到创建的一个简单的测试场景中,并应用一个新创建的名为M_Bubble 的材质。
在我们进行时,我将使用此环境来演示我们的 Material 功能。您可能想考虑创建自己的,因为当您的环境实际上有一些要折射的东西时,使用折射会容易得多。
2
创建材质
打开我们的M_Bubble材质,我们要做的第一件事是将我们的 Shading Model 设置为Unlit,然后勾选Two Sided复选框。
将我们的 Shading Model 设置为 Unlit 意味着我们的材质不会受到光照的影响,因此它不会收到阴影,并且在充足的阳光或漆黑的环境中看起来是一样的。而且性能也非常好。
3
EmissiveColor
让我们给我们的M_Bubble材质一些颜色看看。由于我们使用的是lit的材质,因此我们会将颜色信息输入emissive通道。
节点的这部分相对简单,但将成为我们分层更多功能的基础。它由两部分组成。
菲涅尔部分是我们生成一个可定制的菲涅尔效果,然后乘以一个TwoSidedSign ,以便只有我们的盾牌的外壳受到影响。当我们将材质设置为透明时,该节点的这种效果将在下一步中变得更加明显。
默认情况下,菲涅尔节点将使用像素世界法线作为输入,这意味着它会像法线贴图一样受到逐像素效果的影响。我选择使用网格的顶点法线来强调几何体中存在的六边形形状。
如果您使用硬边或平滑的顶点法线,您将获得截然不同的结果。在本教程中,我将使用硬边的法线信息,因为看起来效果更好。
Emissive Color部分将使用菲涅耳的输出到线性插值两种颜色,填充和边缘之间的色调。我将这些值中的后者提高到32以使其发光。根据您项目的后期处理设置,您可能需要将其调高以获得相同的效果
4
不透明度Opacity
返回细节面板,将材质的混合模式设置为半透明。如果一开始看起来有点难看,请不要担心。双面透明度通常需要稍微修饰一下才能看到效果。
该Depth Fade部分采用了一些新的节点:
CameraDepthFade是一个内置的材质函数,它根据相机与物体表面的距离输出一个从 0 到 1 的值。
Depth Fade 还输出一个从 0 到 1 的值,这次基于对象表面与其后面的任何东西之间的距离。
结合起来,这两个节点将允许我们通过在材质与不透明几何体(如地板)相交时轻轻淡出材质来减少丑陋的交叉点,并避免在相机穿过其表面时出现视觉爆裂。
Opacity部分很简单,只是将fresnel和depth fade混合在了一起。我们使用菲涅尔部分在最小和最大不透明度值之间进行插值(因此网格外部的边缘更不透明,球体内的效果更微妙),然后我们通过depth fade部分乘以结果。
会注意到,当我们将模式切换为半透明时,我们失去了很多比较好的红光。这是正常和在预料之内的,但并不理想。当我们在本系列的后续部分中为 Bubble Shield 添加一些功能时,我们将回过头来添加一些光照来解决这个问题。这不是我们可以通过材质编辑器解决的问题。
5
折射Refraction
现在我们进入有趣的事情。力场材料的折射部分有更多内容。
虚幻(以及许多其他游戏引擎)在自半透明方面存在问题,即可以通过自身看到对象。所以会存在渲染顺序的问题。
这是一个非常古老的问题,我们今天不打算解决,但是当我们试图在我们的 Bubble Shield的外侧和内侧获得可辨别的折射而不让它看起来像一团糟时,它确实出现了。
我们要做的是确保,如果我们从球外面往里面看,内表面上折射不会看起来很明显。这样外面的六边形图案仍然可以被制作出来,并且可以辨别出球内的人。
整个graph第一部分主要是找出我们相对于盾牌表面的位置。这些节点正在计算从相机到盾牌表面最近点的距离,并且由于我们还可以使用ObjectLocalBounds材质函数计算球体的半径,因此我们可以使用该信息来判断相机是否在在球体内部或外部。
通过clamp这个值,然后使用它在两个标量参数之间进行混合,我们可以确保无论我们在屏蔽的哪一侧,屏蔽那一侧的折射都会正确呈现,而另一侧将落入背景。当我们穿过球时,这些值将轻轻混合,以从任何位置获得最佳结果。
材质的其余折射部分非常简单,我们添加了一个outer refraction值,并通过我们创建的遮罩纹理来调整整个事物。
最后,我们反转opacity(因为对于折射,值1.0意味着根本没有折射),并将其用作最终 lerp 中的 alpha。我们这样做只是为了当它与另一个网格相交或当相机穿过它时,折射也会像其他材料一样淡出。
6
Normal
添加法线贴图对于效果来说并不是绝对必要的,但有贴图的话可以加上去。
我们在这里所做的只是使用Normal 强度值在我们的纹理和0,0,1值之间进行调整。这与FlattenNormal函数的工作原理相同。
最后对材质节点进行整理,暴露标记和分类材质参数。
转自 ThePoly