【Unity云消散】巩固step,lerp和smoothstep

之前在学习HLSL常用函数时就有涉及到范围相关的函数,但是最近做的东西发现step,lerp和smoothstep这三个函数总是一直在用,总是会在用的时候突然忘记他们分别是干啥的,这里就记录一下方便查看吧,形式大部分参考Unity Shader 极简实践3——step,lerp 和 smoothstep 应用

1 step

// x <a,返回0
// x>=0,返回1
step(a,x);

通常用来代替if else。

shader中的表现

要么是0要么是1,非此即彼的感觉,所以如果写进shader中与颜色挂钩,表现出的颜色变化效果很“硬”,颜色变化突兀,没有过渡感。

            fixed4 frag (v2f i) : SV_Target
            {
                // step
                fixed4 col = step(_Amount, length(i.uv - 0.5)) * _Color;
                return col;
            }
            ENDCG

2 lerp

// w是一个百分比,表示从a到b之间按照w来取值
// w = 0,返回a
// w = 1,返回b
lerp(a, b, w);

例如lerp(0, 100, 0.2),返回20

shader中的表现

                // lerp
                fixed4 col = lerp(0, 1, length(i.uv - 0.5)) * _Color;
                return col;

与step相比,lerp是有个过渡的。代码中的i.uv - 0.5表示的是着色点与中心的距离,也就是从中心向外出发,距离越远这个百分比越大,意味着lerp的结果越接近1,从而实现了颜色从中心向外由黑色--> _Color(白色)的效果。 

3 smoothstep

这是稍微复杂一点的范围函数,用来生成0到1的平滑过渡值,如下:如果x在[a,b]范围内,则返回介于0和1之间的平滑插值,使用smoothstep在两个值之间创建平滑过渡。

smoothstep(a, b, x);

这是之前我在HLSL函数那篇文章展示的一个函数图,最下面两条就是smoothstep()

如果两个smoothstep作减法还会有一些波形图效果。

shader中的表现

            fixed4 singleSmoothStep(float _Start, float _End, v2f i) {
                return smoothstep(_Start, _End, length(i.uv - 0.5));
            }

           fixed4 doubleSmoothStep(float _Start, float _End, float _Inner, float _Outer, v2f i) {
                float res = smoothstep(_Start, _Inner, length(i.uv - 0.5));
                float res2 = smoothstep(_Outer, _End, length(i.uv - 0.5));
                return res - res2;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // step
                //fixed4 col = step(_Amount, length(i.uv - 0.5)) * _Color;

                // lerp
                //fixed4 col = lerp(0, 1, length(i.uv - 0.5)) * _Color;

                // smoothstep

                //fixed4 col = singleSmoothStep(_End, _Start, i) * _Color;
                fixed4 col = doubleSmoothStep(_Start, _End, _Inner, _Outer, i) * _Color;
                return col;
            }

波形图和shader中的着色效果一起来看:

singleSmoothStep(0.1,0.35, i)

singleSmoothStep(0.35,0.1, i)

doubleSmoothStep(0.1, 0.5, 0.2, 0.3, i)

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!关于Unity的Shader消散效果,我可以给你一些指导。 在Unity中,你可以使用自定义的Shader来实现消散效果。消散效果通常基于一个纹理,并且通过渐变将纹理逐渐消除。 首先,你需要创建一个自定义的Shader。在Shader的片段着色器中,你可以使用插值的纹理坐标来获取纹理颜色。然后,可以根据需要添加一些控制消散效果的参数。 接下来,你可以使用一个控制器(比如时间或距离)来改变纹理坐标,从而实现纹理的渐变效果。通过改变纹理坐标,你可以将纹理从中心点向四周逐渐消失。 以下是一个简单的示例代码,用于实现基本的消散效果: ```csharp Shader "Custom/DissolveShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _DissolveAmount ("Dissolve Amount", Range(0, 1)) = 0 } SubShader { Pass { Tags { "LightMode" = "ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float _DissolveAmount; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); col.a *= smoothstep(_DissolveAmount - 0.1, _DissolveAmount + 0.1, i.uv.x); return col; } ENDCG } } } ``` 在这个示例代码中,_DissolveAmount 参数控制了消散的程度。你可以根据需要调整这个值来实现不同的效果。 希望这些信息对你有所帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九九345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值