# 前言

最近学了一个照片溶解特效,感觉很炫酷,也可以作为后续项目花里胡哨的基础,便在此将学习过程记录一下吧~

话不多说,先看看最终效果~

# 创建和配置项目

选择 3D(URP)项目,然后点击 Create Project 即可创建项目。

打开 Unity,File-->Build Settings, 选择 Android,点击 Switch Platform

在 Build Settings 窗口中,选择 Player Settings, 然后按照下面对应的设置进行配置

# 导入 NRSDK

将 NRSDKForUnity_Release_1.10.2 拖入到 Assets 文件夹中,点击 Import 即可导入

在 Scenes 文件夹下创建个新场景,删除默认的相机,将 NRCameraRig 和 NRInput 拖拽到场景中

# 创建 Shader

在 Assets 下创建 Materials 文件夹,在 Materials 文件夹上右键,点击 Create -> Shader Graph -> URP -> Lit Shader Graph,命名为 Dissolve,双击打开

小 Tip:双击选项卡可以最大化选项卡,再次双击可以恢复

首先创建 4 个可以暴露的属性,注意创建属性的类型

然后将 MainTex 拖拽到画板里,从节点拉出一根线然后在空白书松开,选择 Sample Texture 2D,双击创建新节点,然后把 RGBA 连接到 Base Color

勾选 Graph Inspector 窗口里的 Alpha Clip,可以看到片元着色器就会多出两个属性,透明度和透明度裁剪阈值,我们的溶解特效就是根据这两个属性实现的。具体来讲就是随机一个高斯噪声,根据噪声透明度和阈值裁剪照片,将透明度小于该值的像素点裁剪掉,通过将阈值从小变到大,从而实现溶解特效。

在画板空白处右键,选择 Simple Noise 节点创建,将 X 值调为 30 左右,然后将 Out 连接到 Alpha 变量上

为了溶解特效更加炫酷,可以将溶解边缘增加发光效果,具体节点和连接如下

小 Tip:可以框选住一些节点,然后右键选择 Group Selection,可以将这些节点合并成一个节点,方便一起拖拽

可以在右侧 Graph Inspector 窗口的 Node Settings 里将 AlphaThreshold 模式变为滑动条模式,并给一个默认值 0.5,就可以看到 Step 节点下面的预览图像为二值化后的图像了

RimColor 将模式变为 HDR,然后默认颜色可以设为红色,这样就可以将溶解边缘设为红色的发光了

然后再将最后的 Out 连接到片元着色器的 Emission 上,这样溶解边缘发光的 Shader 就配置好啦

边缘发光的宽度可以通过 RimWidth 属性控制,可以将 RimWidth 也设为滑动条模式,然后范围设为 0 到 5,默认值为 2

至此,溶解特效的 Shader 就配置好啦,点击左上角的 Save Asset 保存,然后双击选项卡退出最大化

# 创建材质

在 Assets 里的 Dissolve Shader 上右键,点击 Create -> Material,命名为 Mat_Dissolve

然后在场景中创建一个 Quad,双击可以聚焦到这个物体,然后将 Mat_Dissolve 拖拽到这个物体上,就可以看到这个物体的材质变成了 Mat_Dissolve

现在溶解特效就已经可以看出来了

可以将 Quad 的 Z 值设为 3,即物体在镜头外 3 米的地方,这样就可以在 Game 窗口里看到物体了

将 NRSDK 里自带的 Image 拖拽到我们在 Shader 里设置的 MainTex 属性上

然后拖拽 AlphaThreshold 就可以看到效果了

想要看到炫光还需要一点配置

首先在场景处右键,选择 Volume -> Global Volume,然后配置文件选择默认已有的 SampleSceneProfile 即可

然后将 LeftCamera,CenterCamera,RightCamera 的 Post Processing 都打上勾,即启用后处理配置

然后再回到 Quad,可以在 RimColor 里调整炫光强度

至此,照片溶解特效就配置好啦

# 编写脚本

在 Assets 下创建 Scripts 文件夹,然后在 Scripts 文件夹上右键,点击 Create -> C# Script,命名为 Dissolve,双击打开代码编辑器,代码内容如下

using System.Collections;
using UnityEngine;
public class Dissolve : MonoBehaviour
{
    private static readonly int mAlphaThreshold = Shader.PropertyToID("_AlphaThreshold");
    public void StartDissolve()
    {
        StartCoroutine(DissolveEffect());
    }
    private IEnumerator DissolveEffect()
    {
        // 获取当前物体的 MeshRenderer 组件
        MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
        // 获取当前物体的材质
        Material material = meshRenderer.material;
        // 将材质的溶解值缓慢从 0 变为 1,持续 2s
        for (float i = 0; i < 2; i += Time.deltaTime)
        {
            material.SetFloat(mAlphaThreshold, i);
            yield return null;
        }
        // 重新设置溶解值为 0
        material.SetFloat(mAlphaThreshold, 0);
    }
}

在 Quad 上添加一个 Button 组件,并将 Dissolve 脚本先拖拽到 Quad 物体上,然后把 Quad 拖拽到 On Click 事件里,然后选择 Dissolve -> StartDissolve

这样,当控制器的射线点击到 Quad 上时,就会触发溶解特效了

最后就是构建成手机 App,然后将 Air2 眼镜切换为 3D 模式,运行应用就可以看到效果啦

完结撒花~

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

宇凌喵 微信支付

微信支付

宇凌喵 支付宝

支付宝