Unity3D ShaderGraph遮挡剔除

学习参考:b站Up主M_Studio(麦扣老师)的3DRPG系列教程

为游戏创建一个ShaderGraph,实现人物在被树木等遮挡物遮挡时显示遮挡剔除的效果

如下图所示,游戏人物在移动到树木后面的时候被遮挡住了,无法看到玩家的位置。

1.创建shader graph

鼠标右键创建一个新的shadergraph

基于上面创建的shadergraph右键新建一个材质取名为occlusion
Unity3D ShaderGraph遮挡剔除_第1张图片
双击occlusion shader打开窗口,在graph inspector中勾选Alpha Clip显示设置透明通道
Unity3D ShaderGraph遮挡剔除_第2张图片
需要实现的遮挡效果是人物或者敌人在树或者大的遮挡物后面的时候有一个大致的轮廓显示。

2.添加菲涅尔

使用unity自带的菲涅尔效果,新建Node,搜索Fresnel。菲涅尔效果就是是模型有光圈的效果,它可以替换模型现有的shader,是他在遮挡物的后面也可以看到模型的轮廓样式。
Unity3D ShaderGraph遮挡剔除_第3张图片

创建一个color变量,方便后期它在inspector窗口中进行调整。
Unity3D ShaderGraph遮挡剔除_第4张图片

选中color在右侧的graph inspector窗口中选择node setting进行参数调整。
Unity3D ShaderGraph遮挡剔除_第5张图片

将color拖拽出来,将颜色加到菲尼尔现象中,需要color和菲尼尔发生乘法效果。拖拽菲涅尔Out点添加multiply,把它连接到A点,然后拖拽color变量连接到B点。可以看到下面图片左color已经有了可视化的效果。
Unity3D ShaderGraph遮挡剔除_第6张图片

然后将AB输出的值连接到base color上
Unity3D ShaderGraph遮挡剔除_第7张图片

3.添加噪点的效果

为菲尼尔现象添加噪点的效果使它看起来更加的实在一些。
添加新节点dither,用x参数的数值来调整模型内部实心填充的效果。
Unity3D ShaderGraph遮挡剔除_第8张图片
为x创建一个folat类型的参数dither count,在node setting给它一个默认值0.5,然后将这个值连接到透明通道上。
Unity3D ShaderGraph遮挡剔除_第9张图片

4.设置一个阀值控制alpha

添加一个folat型变量命名为AlphaThreshold,拖拽出来连接到base的阀值上
Unity3D ShaderGraph遮挡剔除_第10张图片

5.选择save asset保存shader graph

此时材质可以在外部进行更改,通过修改参数来调整材质具体显示的效果。

6.游戏中设置渲染管线

当人物移动到遮挡物后面的时候就应用前面所设置的材质,使它只显示一个轮廓。
在渲染管线设置中进行编辑,找到项目中的pipeline settings,选中UniversalRenderPipelineAsset_Renderer添加渲染功能。添加一个render objects
Unity3D ShaderGraph遮挡剔除_第11张图片

设置只有当player图层被遮挡物挡住的时候才会应用新添加的材质,未遮挡的情况下保持原有不变。
Unity3D ShaderGraph遮挡剔除_第12张图片

设置好之后可以发现游戏人物相比较之前发生了变化,人物的各个子物体之间也发生了遮挡剔除的变化
Unity3D ShaderGraph遮挡剔除_第13张图片
Unity3D ShaderGraph遮挡剔除_第14张图片

将player移动到树木的后面,剔除的效果产生了。
Unity3D ShaderGraph遮挡剔除_第15张图片

但目前人物在没有遮挡物的情况下,也产生了提出效果。为了解决这一问题,需要在前景的时候也添加一个render效果,将过滤图层设置为Player,此时人物在前景的时候恢复正常。
Unity3D ShaderGraph遮挡剔除_第16张图片

实现效果如下图:

可以观察到player在经过树木的时候会有一个大致的轮廓。

你可能感兴趣的:(杂,unity,游戏开发,游戏)