shader 学习记录

学习shader笔记 记录~ unity版本 2017.4.1 

shader具体内容:

basecolor , second tex blend , snow blend , invert color , detail map , uv aniamtion , ramp map ,envCap , flow map , shader 自定义开关

比较基础,所以不写注释了~ 

shader 学习记录

shader 学习记录

 

源码:

Shader "Custom/wbshader (Support lightmap, Fog)" {

Properties {

    _MainTex ("Base (RGB)", 2D) = "white" {}

 

    _SecondTex("Second Tex",2D) = "white" {}

    

    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,1)

 

    [Space(10)]

 

    [Toggle] _SNOWBLEND ("Snow blend", Float) = 0

 

    [Space(10)]

 

    [ShowWhenHasKeyword(_SNOWBLEND_ON)]_Color ("Match Color ", Color) = (0.22, 0.707, 0.071, 0)

 

    [ShowWhenHasKeyword(_SNOWBLEND_ON)]_WeightVector ("Weight (r: 方向 g: 顶点色A b: 颜色图)", Vector) = (0.15, 0.5, 0.33,1)

 

    [ShowWhenHasKeyword(_SNOWBLEND_ON)]_SmoothEdge ("Smooth", Range (0.01, 1)) = 0.1

 

    [ShowWhenHasKeyword(_SNOWBLEND_ON)]_SnowThreshold ("Threshold", Range (0.01, 1)) = 0.1

 

    [ShowWhenHasKeyword(_SNOWBLEND_ON)]_ThresholdOffset ("Threshold Offset", Range (0, 1)) = 0.1

 

    [Space(10)]

 

    [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend Mode", Float) = 1

[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend Mode", Float) = 1

[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Float) = 0

[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 0

[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull Mode", Float) = 1

    [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0

    [PowerSlider(3.0)] _Shininess ("Shininess", Range (0.01, 1)) = 0.08

 

    [Space(5)]

 

    [Toggle] _Invert ("Invert color?", Float) = 0

 

    [Space(5)]

 

    [Toggle] _DETAIL ("Detail Map", Float) = 0

 

    [Space(5)]

 

    [ShowWhenHasKeyword(_DETAIL_ON)] _DetailTex ("Detail Map (RGB)", 2D) = "grey" {}

    [ShowWhenHasKeyword(_DETAIL_ON)] _DetailRepeat("Detail Repeat", float) = 10

    [ShowWhenHasKeyword(_DETAIL_ON)] _DetailAmount("Detail Amount", float) = 0.3

    [ShowWhenHasKeyword(_DETAIL_ON)] _DetailColor("Detail Color", Color) = (0.5,0.5,0.5,1)

 

    [Space(5)]

 

    [Toggle] _UVANIMATION ("UV Animation", Float) = 0

 

    [Space(5)]

 

    [ShowWhenHasKeyword(_UVANIMATION_ON)] _Speed("UV动画速度",Float) = 1

    [ShowWhenHasKeyword(_UVANIMATION_ON)] _UVScale("UV缩放",Float)= 1

 

    [Space(5)]

 

    [Toggle] _CHARACTER ("Character Setting", Float) = 0

 

    //[Space(10)]

 

//  [ShowWhenHasKeyword(_CHARACTER_ON)] _EnvCap ("EnvCap (RGB)", 2D) = "white" {}

//  [ShowWhenHasKeyword(_CHARACTER_ON)] _RmapMap ("RampMap (RGB)", 2D) = "white" {}

//  [ShowWhenHasKeyword(_CHARACTER_ON)] _FlowLight ("Flow Light (RGB)", 2D) = "white" {}

    

    [ShowWhenHasKeyword(_CHARACTER_ON)]_EnvMap ("EnvCap (RGB)", 2D) = "white" {}

    [ShowWhenHasKeyword(_CHARACTER_ON)]_RampMap ("RampMap (RGB)", 2D) = "white" {}

    [ShowWhenHasKeyword(_CHARACTER_ON)]_FlowLightMap ("Flow Light (RGB)", 2D) = "white" {}

    [ShowWhenHasKeyword(_CHARACTER_ON)]_MaskMap ("Mask Map",2D ) = "white" {}

 

    [ShowWhenHasKeyword(_CHARACTER_ON)]_FlowColor ("流光颜色, (A控制叠加方式)", Color) = (1,0.6,0.2,1)

    [ShowWhenHasKeyword(_CHARACTER_ON)]_FlowMultiplier ("流光强度", float) = 4

    [ShowWhenHasKeyword(_CHARACTER_ON)]_FlowThreshold ("FlowThreshold", float) = .75

}

 

SubShader {

    

        Blend [_SrcBlend] [_DstBlend]

ZWrite [_ZWrite]

ZTest [_ZTest]

Cull [_Cull]

        

        pass

        {

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

 

            #pragma shader_feature _INVERT_ON

 

            #pragma shader_feature _DETAIL_ON

 

            #pragma shader_feature _CHARACTER_ON

 

            #pragma shader_feature _UVANIMATION_ON

 

            #pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY

 

            #include "UnityCG.cginc"

            sampler2D _MainTex;

 

            sampler2D _SecondTex;

 

            half4 _TintColor;

            float4 _MainTex_ST;

            float4 _SecondTex_ST;

 

            #if _SNOWBLEND_ON

                float4 _Color;

 

                float4 _WeightVector;

 

                float _SmoothEdge;

 

                float _SnowThreshold;

 

                float _ThresholdOffset;

            #endif

 

            float _Shininess;

 

            #if _DETAIL_ON

                sampler2D _DetailTex;

                float _DetailRepeat;

                float _DetailAmount;

                float4 _DetailColor;

#endif

 

            #if _CHARACTER_ON

                sampler2D _EnvMap;

                sampler2D _RampMap;

                sampler2D _FlowLightMap;

                sampler2D _MaskMap;

 

                float4 _FlowColor;

                float4 _FlowLightMap_ST;

 

                half _Scroll2X;

                half _Scroll2Y;

 

                float _FlowMultiplier;

                float _FlowThreshold;

#endif

 

            #if _UVANIMATION_ON

                float _Speed;

                float _UVScale;

#endif

 

            struct appdata

            {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

                float3 normal : NORMAL;

                fixed4 color : COLOR;

                float4 texcoord : TEXCOORD1;

            };

            struct v2f

            {

                float4 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

                half4 capCoord : TEXCOORD2;

                half4 faceUV : TEXCOORD3;

                float3 normal :TEXCOORD1;

                half4 lightDirAndLM : TEXCOORD4;

                half3 mask :TEXCOORD5;

            };

 

            v2f vert (appdata v)

            {

                v2f o;

                o.vertex = UnityObjectToClipPos(v.vertex);

                o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);

                o.uv.zw = TRANSFORM_TEX(v.uv, _SecondTex);

 

                #if _UVANIMATION_ON

                    float2 uv = float2(v.uv.x * _UVScale + _Time.y * _Speed,v.uv.y);//增加UV动画和UVscale

                    o.uv.xy = TRANSFORM_TEX(uv, _MainTex).xy;                   

                #endif

 

                half3 normalInView = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);

                o.capCoord.xy = half2((normalize(normalInView).xy * 0.25) + 0.25) + half2( 0.5, 0) * (1- v.color.r);       //R: lowerLf

            

                o.capCoord.zw = o.capCoord + half2(0, 0.5);

 

                #if _CHARACTER_ON

                o.faceUV.xy = TRANSFORM_TEX(v.texcoord, _FlowLightMap) + frac( half2(_Scroll2X, _Scroll2Y) * _Time.x);

                #endif

 

                o.lightDirAndLM.xyz = (ObjSpaceLightDir(v.vertex));

                o.lightDirAndLM.w = 0.5;

 

                return o;

            }

            

            fixed4 frag (v2f i) : SV_Target

            {

                // sample the texture

                fixed4 col = tex2D(_MainTex, i.uv.xy);

 

                

 

                #if _DETAIL_ON

                    half3 detail = tex2D(_DetailTex, i.uv * _DetailRepeat) * 2;

                    // debug

                    //detail = lerp(detail, half3(1,1,1), wokAltitudeFogParams.w);

                    col.rgb *= detail * _DetailAmount + (1-_DetailAmount).xxx * _DetailColor;

                #endif

 

                #if _INVERT_ON

    col = 1 - col;

#endif


 

                col *= _TintColor;

 

                fixed4 secCol = tex2D(_SecondTex, i.uv.zw);

 

                #if _SNOWBLEND_ON

 

                    half colorMatch = 1 - length(col.rgb - _Color.rgb);

 

                    half3 weights = half3(i.mask.gb, colorMatch);

 

                    half weight = saturate( dot( weights, _WeightVector ) );

 

                    half colorAmount = (weight - _SnowThreshold) / _SmoothEdge;

 

                    half value = weight - _SnowThreshold;

                    half amount = saturate( (value - _ThresholdOffset) / _SmoothEdge );

 

                    col.rgb = lerp( col, secCol, saturate( amount * secCol.a));

 

                #endif

 

#if _OVERLAY_ADD

    col += secCol;

#elif _OVERLAY_MULTIPLY

    col *= secCol;

#endif

 

                #if _CHARACTER_ON

                    half y = 1.5;

 

                    half2 nDotLUV = 0.5 * half2( dot( normalize (i.normal), normalize(i.lightDirAndLM.xyz)) +1, y ) ;

 

                    half4 rampColor = tex2D(_RampMap, nDotLUV );    

 

                    half2 flowUV = i.faceUV.xy;

 

                    half3 mask = tex2D(_MaskMap, i.uv );

 

                    half3 matcap = tex2D( _EnvMap ,i.capCoord.xy ) * mask.g;

                    matcap += tex2D( _EnvMap ,i.capCoord.zw) * mask.b;

 

                    col.xyz += matcap;

 

                    half4 lightFlow = tex2D (_FlowLightMap, flowUV );

 

                    float v = saturate(saturate(mask.r - _FlowThreshold));

                    lightFlow *= v * _FlowMultiplier;

 

                    col += lightFlow * lerp(half4(1,1,1,1), col, _FlowColor.a) * _FlowColor;   

 

                    col *= (rampColor *2);

                #endif

 

                

 

                col *= _Shininess;

 

                return col;

            }

 

            ENDCG

        }

        

}


 

}