[技术] 使用Shader Graph着色器视图制作交互式顶点特效

------------------------------------------------本文转载于unity官方老论坛-----------------------------------------------------------

Unity的开发团队使用Shader Graph着色器视图和轻量级渲染管线LWRP制作了一个交互式顶点替换特效的演示示例,以帮助开发者学习使用这些功能来设计效果。

我们将在本文中详细介绍特效的制作流程,并提供Shader Graph着色器的演示项目,请访问云盘下载演示项目。

百度云链接:https://pan.baidu.com/s/1I37Ormz8UfOoL0CkzzIzcg
提取码: msrd

演示项目

下图是演示项目中的球体拥有基于着色器的替换特效,当我们按下空格键时会激活该效果,在游戏中我们通常会把这种效果指定到相关游戏事件。

本文,我们将介绍如何使用Shader Graph着色器视图制作该着色器,然后结合空格键按键触发器。我们的目标是帮助开发者了解如何在Shader Graph着色器视图中设计效果,并通过C#脚本进行交互。

演示项目包含:着色器、控制着色器的脚本、预配置轻量级渲染管线LWRP资源和一个示例场景,以便开发者进行使用。

在这里插入图片描述
安装着色器视图和LWRP资源包
首先,我们来看看如何设置Shader Graph着色器视图和轻量级渲染管线LWRP。

我们打开Package Manager资源包管理器,分别选择Lightweight RP资源包和Shader Graph资源包,并单击Install按钮进行安装。
在这里插入图片描述
安装好Lightweight RP后,我们需要在项目中创建新的管线资源。请依次选择Create->Rendering->Lightweight Render Pipeline Asset。

然后,我们启用管线资源,点击菜单Edit->Project Settings->Graphics,把LightweightRenderPipelineAsset拖动到Scriptable Render Pipeline Settings属性栏。

小提示:如果你使用了我们提供的下载资源,则该步骤已经完成。

在这里插入图片描述
现在安装好轻量级渲染管线后,我们可以创建新的Shader Graph着色器视图。在项目窗口中创建新视图,请点击Create->Shader->PBR Graph。

PBR Graph可以创建一个从Unity基于物理的渲染系统接收输入信息的新着色器,这样我们的着色器就可以使用阴影和反射等功能。

创建好着色器后,我们把它添加到新材质,并把该材质附加到示例场景中的球体,将材质拖到球体上即可。

实现顶点替换功能
为了实现顶点替换效果,我们会沿着法线替换网格的顶点,通过修改PBR Master输出节点的输出Position来完成。

我们会在每个顶点的基本对象位置上使用Add节点进行替换。通过使Normal Vector节点和基本对象位置相加,我们可以看到所有顶点都向外延伸,使球体看起来更大。

为了使替换效果更丰富,我们会使用Simple Noise节点,半随机地乘以法线向量的替换结果。

在这里插入图片描述
当点击Save Asset时,我们可以在场景视图看到球体现在会基于Simple Noise来替换。
在这里插入图片描述
因为Simple Noise会基于UV空间采样,所以替换结果中存在着缝隙。为了修复缝隙,我们只要给Simple Noise使用对象空间而不是UV空间,添加Space属性设为Object的Position节点即可。在这里插入图片描述
为了制作出波动效果,我们会滚动调整Position输出,把它和Time节点相加,然后再发送到Simple Noise节点。我们也可以使用Multiply节点和Time节点来使滚动速度变化。

在这里插入图片描述
使用C#代码控制着色器视图属性

为了控制替换特效,我们会在Shader Graph着色器视图中公开来一个新的着色器属性。着色器属性允许我们通过在检视窗口输入数值,或者通过使用C#脚本为着色器提供输入内容。

我们创建一个名称为Amount的新Vector1属性,并把Reference改为_Amount。Reference字段是我们将通过脚本访问和修改替换效果时所使用的字符串名称。

如果我们不修改Reference字段的内容,它会使用自动生成的值。如果Reference字段的字符串和脚本的字符串不完全匹配,我们将无法通过脚本处理属性,所以一定要仔细检查二者是否匹配,包括字符串的大小写。

在这里插入图片描述
我们会在Multiply节点使用Amount着色器属性,使Simple Noise节点输出和Amount属性相乘,然后再把结果和法线向量相乘。这样可以让我们调整噪声,然后把噪声应用到顶点位置。现在Amount变量控制我们在网格替换每个节点的程度。

在这里插入图片描述
为了控制Amount变量,我们创建了一个C#脚本,命名为DisplacementControl,并把其附加到DisplacementSphere游戏对象。

该脚本会控制_Amount变量,并与MeshRenderer组件指定材质所创建的属性进行交互。我们在meshRender变量中保存了MeshRenderer组件的引用,并且声明新的浮点变量displacementAmount。

我们在Update函数使用Lerp函数来插补displacementAmount变量为数值0。然后设置着色器变量_Amount为displacementAmount变量保存的数值,这样将更新Shader Graph的_Amount变量,使其随时间平滑调整为0。
在这里插入图片描述
我们使用Unity的默认“Jump” 输入键,默认被指定到空格键,在按下空格键时,它会将displacementAmount数值设置为1。
在这里插入图片描述
现在,当我们在场景中进入运行模式时,我们可以看到按下空格键后,displacementAmount被设为数值1,然后慢慢插值为0。

使用着色器视图制作Voronoi发光效果

我们使用Voronoi Noise节点,使该节点乘以Color节点,这样会对发光效果实现部分调整,在效果中加入黑点。
然后,我们使用Lerp节点接收另一个Color节点作为基本颜色,并在Lerp节点的T输入使用Amount变量,这将允许我们使用Amount变量在基本Color节点和Voronoi Noise颜色节点之间进行混合。
在这里插入图片描述
然后,我们将使用前面类似的设置来滚动发光。我们使用Position节点,并设置为Object,将其与Time节点相加,然后连接输出到Voronoi Noise节点的UV槽。
在这里插入图片描述
为了添加额外的变化,我们也可以添加第二个发光层,使用由Time额外层滚动的Simple Noise节点,并使二个Noise输出相乘,这样会给我们第二个噪声层并添加视觉效果。
在这里插入图片描述
因为这个发光效果是通过Lerp节点中的Amount变量调整的,所以我们可以在运行模式看到,当按下空格键时,球体会激活顶点替换和发光效果,然后缓慢恢复正常状态。
在这里插入图片描述
为了添加额外的修饰,我们还在DisplacementControl脚本链接了一个简单的粒子系统。

小结
如果你希望尝试这些功能,我们提供了完整项目,包含所有资源、网格、着色器和示例场景,请点击[阅读原文]进行下载,我们期待看到你使用它创作出的炫酷作品。

更多Unity教程,尽在Unity官方中文论坛(UnityChina.cn)!

----------本文转载于unity官方老论坛

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
制作溶解特效的过程如下: 1. 创建一个空的Unlit Shader Graph(或者其他类型的Shader Graph,根据实际需求而定)。 2. 在Shader Graph中创建一个Texture2D类型的属性,用于存储溶解贴图。 3. 添加一个Color节点,将溶解贴图作为输入,将其作为颜色输出。 4. 使用一个Lerp节点,将颜色节点输出的颜色和黑色(或者其他颜色)进行插值,根据溶解贴图的灰度值来控制插值因子。这样,在溶解贴图的黑色区域,颜色节点输出的颜色将被完全舍弃,而在白色区域,颜色节点输出的颜色将完全保留。 5. 将Lerp节点的输出连接到输出节点的Albedo输入,完成溶解特效制作。 下面是一个简单的Shader Graph代码示例: ``` Shader "Custom/Dissolve" { Properties { _MainTex ("Texture", 2D) = "white" {} _DissolveTex ("Dissolve Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; sampler2D _DissolveTex; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 texColor = tex2D(_MainTex, i.uv); fixed dissolve = tex2D(_DissolveTex, i.uv).r; fixed factor = smoothstep(0.25, 0.75, dissolve); return lerp(texColor, fixed4(0,0,0,0), factor); } ENDCG } } FallBack "Diffuse" } ``` 这个Shader Graph创建了一个名为“Custom/Dissolve”的Shader,其中包含两个属性:_MainTex和_DissolveTex。在Pass中,使用了一个Lerp节点来控制溶解特效,其中smoothstep函数用于平滑过渡效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值