Unity Shader 最简单的消融溶解效果

Unity Shader 最简单的消融溶解效果

效果演示

请添加图片描述

需要的贴图资源

渐变纹理
渐变纹理
噪点图
噪点图

代码展示

主要是使用了 Shader 中的 Clip() 函数,使用 Surface 表面着色器。

Shader "Custom/dissolve"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}  //主纹理
		_NoisePatternTex("NoisePatternTex",2D) = "white"{} //黑白噪声纹理 影响笑容的位置
		_Threshold("Threshold",Range(0,1)) = 0 //消融阈值
		_EdgeLength("EdgeLength", Range(0,0.2)) = 0.1 //边缘过渡部分的值
		_GradientTex("GradientTex", 2D) = "white"{} //渐变图,过渡部分用
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
 
        sampler2D _MainTex;
		sampler2D _NoisePatternTex;
		half _Threshold;
		sampler2D _GradientTex;
		half _EdgeLength;
 
        struct Input
        {
            float2 uv_MainTex;
			float2 uv_NoisePatternTex;
        };
 
        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)
 
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            //纹理贴图采样
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) ;
            o.Albedo = c.rgb;
            //获得噪声图的颜色 r 值
			float cutoutValue = tex2D(_NoisePatternTex, IN.uv_NoisePatternTex).r;
            //clip函数会将参数小于0的像素点直接丢弃掉
			clip(cutoutValue - _Threshold);
            //saturate(x)的作用是如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1。若x在0到1之间,则直接返回x的值.
			float temporary = saturate((cutoutValue - _Threshold) / _EdgeLength);
			fixed4 edgeColor = tex2D(_GradientTex,float2(temporary,temporary));
			fixed4 resultColor = lerp(edgeColor, fixed4(0,0,0,0), temporary);
			o.Emission = resultColor.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

调整Threshold值,效果如图所示。
在这里插入图片描述
在自己的脚本中进行动态控制即可实现死亡溶解效果

    void ChangeValue(float value)
    {
        Material m = this.transform.GetComponent<SkinnedMeshRenderer>().materials[0];
        m.SetFloat("_Threshold", value);
    }
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!要在Unity中实现椭圆形消融效果,可以通过编写自定义的着色器(Shader)来实现。下面是一个简单的示例代码,可以将该代码放在一个名为"EllipticalDissolve"的着色器文件中: ``` Shader "Custom/EllipticalDissolve" { Properties { _MainTex ("Texture", 2D) = "white" {} _DissolveParams ("Dissolve Parameters", Vector) = (0, 0, 0, 0) } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} 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; float4 _DissolveParams; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : SV_Target { // 计算像素到中心点的距离 float2 center = _DissolveParams.xy; float2 uvPosition = i.uv - center; uvPosition *= float2(_ScreenParams.w / _ScreenParams.z, 1); float distance = length(uvPosition); // 计算椭圆形的半径 float2 ellipseRadius = _DissolveParams.zw * 0.5; // 根据距离和椭圆形半径,控制像素的透明度 float alpha = smoothstep(ellipseRadius.x, ellipseRadius.y, distance); // 根据透明度混合原始纹理和背景色 fixed4 texColor = tex2D(_MainTex, i.uv); fixed4 bgColor = fixed4(0, 0, 0, 1); // 背景色可以根据需要进行调整 fixed4 finalColor = lerp(texColor, bgColor, alpha); return finalColor; } ENDCG } } } ``` 使用该着色器时,需要设置"_DissolveParams"参数来控制椭圆形的位置和大小。其中,"_DissolveParams"的x和y分量表示椭圆形的中心点坐标(范围为0到1),而z和w分量则表示椭圆形的x轴和y轴半径(同样范围为0到1)。 你可以在材质上应用这个自定义着色器,并在脚本中更新"_DissolveParams"参数来实现椭圆形消融效果。希望这能帮到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我在人間凑数的日子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值