消融shader

这篇博客详细介绍了如何在Unity中创建一个消融效果的Shader。通过使用纹理、阈值和边缘宽度参数,实现物体表面的镂空和边缘颜色渐变。Shader代码包括了顶点和片段着色器,利用tex2D函数和clip指令来控制镂空效果,以及通过Ramp贴图调整边缘颜色。
摘要由CSDN通过智能技术生成

消融shader

记录平时遇到的shader

Shader "MyShader/Dissolve_Basic"
{
   Properties
    {
            _MainColor("MainColor",Color) = (1,1,1,1)
            _MainTex("MainTex",2D) = "white"{}
            _NoiseTex("Noise",2D) = "white"{}
            _Threshold("Threshoed",Range(0.0,1.0)) = 0  //镂空程度
            _EdgeLength("Edge Length",Range(-0.2,0.2)) = 0.0  //边缘宽度
            _RampTex("Ramp",2D) = "white"{} //边缘颜色需要采样的贴图
        

    }
    
    SubShader
    {
        Tags { "Queue"="Geometry" "RenderType"="Opaque" }
        pass
        {
            Cull Off
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "UnityCG.cginc"

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

           struct v2f
           {
                float4 vertex : SV_POSITION;
                float2 uvMainTex : TEXCOORD0;
                float2 uvNoiseTex : TEXCOORD1;
                float2 uvRampTex : TEXCOORD2;
           };

            float4 _MainColor;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _NoiseTex;
            float4 _NoiseTex_ST;
            float _Threshold;
            float _EdgeLength;
            sampler2D _RampTex;
            float4 _RampTex_ST;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uvMainTex = TRANSFORM_TEX(v.uv,_MainTex);
                o.uvNoiseTex = TRANSFORM_TEX(v.uv,_NoiseTex);
                o.uvRampTex = TRANSFORM_TEX(v.uv,_RampTex);
                return o;
            }

            fixed4 frag(v2f i) :SV_Target
            {
                fixed cutout = tex2D(_NoiseTex,i.uvNoiseTex).r; 
                clip(cutout - _Threshold);  // 如果输入向量中的任何元素小于0,则丢弃当前像素    
   
                float degree = saturate( (cutout - _Threshold) / _EdgeLength); //确保0~1
                fixed4 edgeColor = tex2D(_RampTex,float2(degree,degree));
                fixed4 col = tex2D(_MainTex,i.uvMainTex);
                col.rgb = _MainColor.rgb;
                fixed4 final = lerp(edgeColor,col,degree);
                return fixed4(final.rgb,1);
            }
           
           ENDCG 
        }
    }

}

参考链接
https://www.jianshu.com/p/d8b535efa9db

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值