Unity Shader 溶解效果(单色+泛光)一

2020-01-21  本文已影响0人  洒一地阳光_217d

Unity Shader系列文章:Unity Shader目录-初级篇

Unity Shader系列文章:Unity Shader目录-中级篇

效果如下:


溶解效果.jpg 材质.png
噪声贴图.png
// 溶解效果(带泛光)
// 实现思路:采样无序图,然后通过其中的某个通道(此处为r)的值,与当前的溶解系数对比,
// 如果主纹理当前的通道值小于溶解系数,则说明当前片元需要被剔除。
// 如果不被剔除,则判断当前值距离消融的比例来设置消融的边缘颜色混合
Shader "Custom/DissolveOneColor"
{
    Properties
    {
        _MainTexture ("Main Texture(RGB)", 2D) = "white" { }
        _DissolveTexture ("Dissolve Texture(R)", 2D) = "white" { }// 噪声图
        _EdgeColor ("EdgeColor", Color) = (1, 1, 1, 1) // 边缘颜色
        _DissolveAmount ("DissolveAmount", Range(0, 1)) = 1 // 溶解系数
        _EdgeWidth ("EdgeWidth", Range(0, 0.3)) = 0.05 // 边缘宽度
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 100
        Cull off

        Pass
        {
            CGPROGRAM
            
            #pragma vertex vert // 声明顶点着色程序函数名
            #pragma fragment frag // 声明片元着色程序函数

            #include "UnityCG.cginc"

            sampler2D _MainTexture;
            sampler2D _DissolveTexture;
            float _DissolveAmount;
            float _ExtrudeAmount;
            float _EdgeWidth;
            fixed4 _EdgeColor;

            // 应用传给顶点着色程序的数据
            struct appdata
            {
                float4 vertex: POSITION; // 模型的顶点坐标
                float2 uv: TEXCOORD; // 模型的纹理坐标
            };

            // 顶点着色程序传递给片元程序的数据
            struct v2f
            {
                float4 pos: SV_POSITION; // 裁剪空间中的顶点坐标
                float2 uv: TEXCOORD; // 模型的纹理坐标
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex); // 模型空间顶点坐标转换为裁剪空间下坐标
                o.uv = v.uv; // 纹理uv坐标
                return o;
            }
            
            fixed4 frag(v2f i): SV_TARGET
            {
                fixed4 dissolveColor = tex2D(_DissolveTexture, i.uv);
                // 溶解贴图上的R通道值和目前的溶解基准值相差多少
                float offsetValue = dissolveColor.r - _DissolveAmount;
                // offsetValue < 0 则放弃此片元不绘制
                clip(offsetValue);

                fixed4 textureColor = tex2D(_MainTexture, i.uv);
                offsetValue += (1 - sign(_DissolveAmount)) * _EdgeWidth;
                float edgeFactor = 1 - saturate(offsetValue / _EdgeWidth);
                return lerp(textureColor, _EdgeColor, edgeFactor);
            }
            ENDCG
            
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读