找回密码
 立即注册
查看: 278|回复: 0

【unity Shader 菜鸡教程】练习2 角色死亡溶解效果

[复制链接]
发表于 2022-9-21 06:40 | 显示全部楼层 |阅读模式
练习2要求
角色溶解效果,带边缘光效果。



角色死亡溶解

额外做的一个劣质的冰冻效果



劣质冰冻效果

<hr/>要点:
clip
clip(dissolveTex.r - _Dissolve);
// clip(val)clip函数,当函数内的val小于0时,该片段的渲染会被舍弃掉。舍弃之后,就会看到溶解镂空的效果。
那这个镂空效果应该怎么处理呢。这里用了张噪声图 dissolveTex ,以及一个变量_Dissolve



噪声图

_Dissolve 的范围从0-1变化,通过 dissolveTex.r - _Dissolve,可以得到,从噪声图的黑色部分开始,逐渐向白色部分镂空(舍弃片段)。就可以得到溶剂效果。
smoothstep
smoothste 可以用来生成0到1的平滑过渡值,它也叫平滑阶梯函数
float smoothstep(float a, float b, float x)
{
    x = clamp((x - a) / (b- a), 0.0, 1.0);
    return x * x * (3 - 2 * x);
}当a<b 时。得到一条 a-b范围内朝向向上  0~1 的平滑曲线。


这有什么用呢。这意味着取a/b两个数,可以通过这两个数来获取一个0~1的返回值,并且这个0~1的跨越宽度就是a/b两者之差。
fixed2 rampUV = smoothstep(_Dissolve,_Dissolve + _Width,dissolveTex.r);
fixed4 dissRamp = tex2D(_DissolveRamp,rampUV);rampUV  得到的是0~1,作为纹理的uv采样值。那么这张纹理在显示上,它的宽度就是 _Width。




可能表达能力还是有问题,说得不清楚。可以结合参考的网址看看。
想着既然可以溶解,是不是也可以反过来,做一个渐显的效果。所以就有了类似冰冻效果的想法。
[Toggle(USE_ICE_TEX)]_UseIce("UseIce",int) = 0   // 定义变体对应的 勾选
......
#pragma multi_compile _ USE_ICE_TEX         // USE_ICE_TEX  变体名称
......

#if USE_ICE_TEX
     // 如果勾选了,执行这个if 判断语句内
#else
     // 否则,执行这里的逻辑
#endif

// 或者只要if
#if USE_ICE_TEX
#endif这里用来变体来判断使用溶解还是使用冰冻效果。
附上代码。
// 角色溶解
Shader "Study/Chapter3/RoleDissolve"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _DissolveTex("DissTex",2D) = "white" {}
        _Dissolve("DissolValue",Range(0,1.1)) = 0
        _DissolveRamp("DissolRamp",2D) = "white" {}
        _Width("Width",Range(0,0.15)) = 0.1
        [Toggle(USE_ICE_TEX)]_UseIce("UseIce",int) = 0
        _IceTex("IceTex",2D) = "white" {}
        _IceVal("IceVal",Range(0,3)) = 1.2
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile _ USE_ICE_TEX
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float2 uv2 : TEXCOORD1;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _DissolveTex;
            float4 _DissolveTex_ST;
            sampler2D _DissolveRamp;
            sampler2D _IceTex;
            float4 _IceTex_ST;
            float _Dissolve;
            float _Width;
            float _IceVal;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
                o.uv.zw = TRANSFORM_TEX(v.uv, _DissolveTex);
                #if USE_ICE_TEX
                      o.uv2 = TRANSFORM_TEX(v.uv, _IceTex);
                #endif
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 mainTex = tex2D(_MainTex, i.uv.xy);
                fixed4 dissolveTex = tex2D(_DissolveTex,i.uv.zw);
                #if USE_ICE_TEX

                #else
                        clip(dissolveTex.r - _Dissolve);       
                #endif
               
                fixed4 col = fixed4(1,1,1,1);
                               
                #if USE_ICE_TEX
                        fixed4 iceTex = tex2D(_IceTex,i.uv2);
                       //  dissolveTex.r <= _Dissolve 时返回1
                       // 噪音图,随着 _Dissolve 变大,从黑色部分出发, val 从 0->1 变化
                        fixed val = step(dissolveTex.r,_Dissolve);
                        // 随着 _Dissolve 变大 ,mainTex 主纹理的颜色逐渐变少  ->   mainTex * (1-val) = 0
                        // 颜色间常用 + 或者 * 来混合 来达到想要的效果
                        col =  mainTex * (1-val) +  val * (mainTex * (1-_IceVal) + iceTex * _IceVal) ;
                #else
                        fixed2 rampUV = smoothstep(_Dissolve,_Dissolve + _Width,dissolveTex.r);
                        fixed4 dissRamp = tex2D(_DissolveRamp,rampUV);
                        col = mainTex + dissRamp;
                #endif

                return col;
            }
            ENDCG
        }
    }
}
打游戏很积极,写东西憋不出来.....不常写,不常用,不思考,东西就都忘了
工程:LZJian/UnityShaderCourse    目录:Chapter3 包括第三章的代码

参考:
smoothstep函数_SmoothStep是个啥?这是数学的魅力!_是Allen呀的博客-CSDN博客
风格化 + PBR - 恶毒的狗 | Bad Fat Dog
Unity中SmoothStep介绍和应用: 溶解特效优化

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-7-2 09:20 , Processed in 0.113525 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表