美文网首页
Unity双层液体Shader

Unity双层液体Shader

作者: Joe_Game | 来源:发表于2019-11-07 23:25 被阅读0次
Shader "DoubleLayerLiquid"//双层液体Shader
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        
        [Header(No.0)]
        _Value ("液体填充值", Range(-1,1)) = 0.0
        _Color("液体颜色",Color) = (1,1,1,1)
        _AlphaScale("液体透明度",Range(0,1)) = 1
        
        [Header(No.1)]
        _Value1 ("液体填充值1", Range(0,1)) = 0.0
        _Color1("液体颜色1",Color) = (0,0,0,0)
        _AlphaScale1("液体透明度1",Range(0,1)) = 1
    }
 
    SubShader
    {   
        Tags{"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }

    
        Pass
        {
            Name "BackRender"

            Tags { "LightMode" = "ForwardBase" }
            
            Zwrite Off//关闭深度写入
            Cull Front // 剔除正面
            Blend SrcAlpha OneMinusSrcAlpha


            CGPROGRAM
    
    
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"


            struct appdata
            {
                float4 vertex : POSITION;
                //float3 normal : NORMAL; 
                float2 uv : TEXCOORD0;
            };
    
            struct v2f
            {
                float4 pos : SV_POSITION;
                //float3 worldNormal : TEXCOORD0;    
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };
    
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Value,_Value1;
            float4 _Color, _Color1;
            fixed _AlphaScale,_AlphaScale1;
    
            v2f vert (appdata v)
            {
                v2f o;
    
                o.pos = UnityObjectToClipPos(v.vertex);
                //o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul (unity_ObjectToWorld, v.vertex.xyz);  
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);   

                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col;
                fixed alphaScale;

                //fixed3 worldNormal = normalize(i.worldNormal);
                //fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                fixed4 texColor = tex2D(_MainTex,i.uv);
            
                //阀值以上剔除
                if(i.worldPos.y > _Value + _Value1)
                {
                    clip(-1);
                }
                else if(i.worldPos.y <=_Value)
                {
                    col = _Color;
                    alphaScale = _AlphaScale;
                }
                else if(i.worldPos.y >_Value && i.worldPos.y <= _Value1)
                {
                    col = _Color1;
                    alphaScale = _AlphaScale1;
                }

                fixed3 albedo = texColor.rgb*col.rgb;

                //fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                //fixed3 diffuse = _LightColor0.rgb * albedo * max(0,dot(worldNormal,worldLightDir));

                //这里我加了漫反射和环境光后,感觉效果太暗了,于是只用了贴图和液体的颜色
                //fixed4 finalCol = fixed4(ambient + diffuse,texColor.a*alphaScale);
                fixed4 finalCol = fixed4(albedo,texColor.a*col.a*alphaScale);
                return finalCol;

            }
            ENDCG
        }

        Pass
        {
            Name "FrontRender"
            Tags { "LightMode" = "ForwardBase" }

            Zwrite Off//关闭深度写入
            Cull Back //剔除背面
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
    
    
            #pragma vertex vert
            #pragma fragment frag
            //#include "Lighting.cginc"
            #include "UnityCG.cginc"
    
            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL; 
                float2 uv : TEXCOORD0;
            };
    
            struct v2f
            {
                float4 pos : SV_POSITION;
                //float3 worldNormal : TEXCOORD0;    
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };
    
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Value,_Value1;
            float4 _Color, _Color1;
            fixed _AlphaScale,_AlphaScale1;
    
            v2f vert (appdata v)
            {
                v2f o;
    
                o.pos = UnityObjectToClipPos(v.vertex);
                //o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul (unity_ObjectToWorld, v.vertex.xyz);  
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);   

                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col;
                fixed alphaScale;
                fixed4 finalCol;

                //fixed3 worldNormal = normalize(i.worldNormal);
                //fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                fixed4 texColor = tex2D(_MainTex,i.uv);
            
                //阀值以上剔除
                if(i.worldPos.y > _Value + _Value1)
                {
                    clip(-1);
                }
                else if(i.worldPos.y <=_Value)
                {
                    col = _Color;
                    alphaScale = _AlphaScale;
                }
                else if(i.worldPos.y >_Value && i.worldPos.y <= _Value1)
                {
                    col = _Color1;
                    alphaScale = _AlphaScale1;
                }

                fixed3 albedo = texColor.rgb*col.rgb;

                //fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                //fixed3 diffuse = _LightColor0.rgb * albedo * max(0,dot(worldNormal,worldLightDir));

                //fixed4 finalCol = fixed4(ambient + diffuse,texColor.a*alphaScale);
                finalCol = fixed4(albedo,texColor.a*col.a*alphaScale);

                return finalCol;
            }
            ENDCG
        }
 
    }

    FallBack "Transparent/VertexLit"
}

效果图:


相关文章

网友评论

      本文标题:Unity双层液体Shader

      本文链接:https://www.haomeiwen.com/subject/cambbctx.html