Shader学习——遮罩纹理

核心

效果图

Shader学习——遮罩纹理_第1张图片
遮罩纹理
Shader "Unlit/015"
{
    Properties
    {
        _MainTex ("MainTex", 2D )= "white" {}
        _BumpMap ("normal Map", 2D) = "bump"{}
        _BumpScale("Bump Scale",float) = 1
        _SpecularMask("Specular Mask", 2D) = "white" {}
        _SpecularScale("Specular Scale", float) = 1
        _Diffuse("Diffuse",Color) = (1,1,1,1)
        _Specular("Specular",Color) = (1,1,1,1)
        _Gloss("Gloss",Range(1,256)) = 5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _BumpMap;
            float4 _BumpMap_ST;
            sampler2D _SpecularMask;
            float4 _SpecularMask_ST;
            float _SpecularScale;
            float _BumpScale;
            fixed4 _Diffuse;
            fixed4 _Specular;
            float _Gloss;

            struct v2f
            {
                float4 vertex :SV_POSITION;
                fixed3 lightDir: TEXCOORD0;
                float3 viewDir: TEXCOORD1;
                float4 uv : TEXCOORD2;
                float2 maskUv: TEXCOORD3;
            };

            v2f vert (appdata_tan v)
            {
                v2f o;
                //顶点位置
                o.vertex = UnityObjectToClipPos(v.vertex);
                
                //UV =顶点纹理坐标进行缩放+偏移
                o.uv.xy =TRANSFORM_TEX(v.texcoord, _MainTex);
                o.uv.zw =TRANSFORM_TEX(v.texcoord, _BumpMap);
                //法线贴图UV =顶点纹理坐标进行缩放+偏移
                o.maskUv =TRANSFORM_TEX(v.texcoord, _SpecularMask);

                //内置宏,用于得到模型空间到切线空间的变换矩阵rotation
                TANGENT_SPACE_ROTATION;

                //求切线空间光源方向=矩阵乘积(变换矩阵,模型空间下光照方向).xyz;
                o.lightDir = mul(rotation,ObjSpaceLightDir (v.vertex)).xyz;
                //求切线空间视角方向=矩阵乘积(变换矩阵,模型空间下视角方向).xyz;
                o.viewDir = mul(rotation,ObjSpaceViewDir (v.vertex)).xyz;
            
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {   
                //切线空间光源方向
                fixed3 tangentLightDir = normalize(i.lightDir);
                //切线空间中视角方向
                fixed3 tangentViewDir = normalize(i.viewDir);
                //采样
                fixed4 packedNormal = tex2D(_BumpMap,i.uv.zw);
            
                //切线中法线方向,设置成normalMap的
                fixed3 tangentNormal = UnpackNormal(packedNormal);
                tangentNormal.xy *= _BumpScale;
                
                //纹素值=对纹理进行采样(采样纹理,float2纹理坐标)
                fixed3 albedo = tex2D(_MainTex,i.uv).rgb;

                        
                //漫反射光=入射光线强度*纹素值*材质的漫反射系数*取值为正数(切线光源方向 · 切线法线方向)
                fixed3 diffuse = _LightColor0.rgb * albedo * _Diffuse.rgb * (dot(tangentLightDir,tangentNormal)*0.5+0.5);

                //环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                
                //高光遮罩
                fixed specularMask = tex2D(_SpecularMask, i.maskUv).r * _SpecularScale;

                //半角方向
                fixed3 halfDir =normalize(tangentLightDir + tangentViewDir);
                //BlinnPhong高光反射=入射光线颜色强度*材质的高光反射系数*n次平方(取值为正数(切线法线方向 · 半角方向),n)* 高光遮罩;
                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(tangentNormal,halfDir)),_Gloss) * specularMask;

                fixed3 color = ambient + diffuse + specular;

                return fixed4(color,1);
            }
            ENDCG
        }
    }
}

你可能感兴趣的:(Shader学习——遮罩纹理)