Shader自学笔记 3.3.2 采样遮罩纹理 使高光部分更加柔和

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Custom/texture/test4" {

//  定义纹理属性 增加法线纹理
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Main Tex", 2D) = "white" {}
        _BumpMap("Normal Map",2D)="bump"{}
        _BumpScale("Bump Scale",Float)=1.0
        _SpecularMask("Specular Mask",2D)="white"{}
        _SpecularScale("Specular Scale",Float)=1.0
        _Specular("Specular",Color)=(1,1,1)
        _Gloss ("Gloss", Range(8.0,256)) = 20
        }
    SubShader {
    Pass{
        Tags { "LightMode"="ForwardBase" }

        CGPROGRAM

        #pragma vertex vert

        #pragma fragment frag

        #include "Lighting.cginc"

        fixed4 _Color;
        sampler2D _MainTex;
//      纹理缩放平移属性
        float4 _MainTex_ST;
        sampler2D _BumpMap;
        float4 _BumpMap_ST;
        float _BumpScale;
        sampler2D _SpecularMask;
        float _SpecularScale;
        fixed4 _Specular;
        float _Gloss;

        struct a2v{
        float4 vertex: POSITION;
//      指定顶点法线
        float3 normal:NORMAL;
//      指定顶点切线
        float4 tangent:TANGENT;
//      语义指定第一个纹理
        float4 texcoord:TEXCOORD0;

        };

        struct v2f{
        float4 pos:SV_POSITION;
        float2 uv:TEXCOORD0;
        float3 lightDir:TEXCOORD1;
        float3 viewDir:TEXCOORD2;
        };

        v2f vert(a2v v){
        v2f o;
        o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
        o.uv.xy=v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;

//      计算副切线
//      float3 binormal=cross(normalize(v.normal),normalize(v.tangent.xyz))*v.tangent.w;
//      构建变换矩阵,将位置坐标从模型空间转换到切线空间
//      float3x3 rotation=float3x3(v.tangent.xyz,binormal,v.normal);
//      或者使用内建方法
        TANGENT_SPACE_ROTATION;
//      转换光源方向从模型空间到切线空间
        o.lightDir=mul(rotation,ObjSpaceLightDir(v.vertex)).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);
        fixed3 tangentNormal;
//      如果纹理不是法线纹理
//      tangentNormal.xy=(packedNormal.xy*2-1)*_BumpScale;
//      tangentNormal.z=sqrt(1.0-saturate(dot(tangentNormal.xy,tangentNormal.xy)));
//      或者使用内建方法
        tangentNormal=UnpackNormal(packedNormal);
        tangentNormal.xy*=_BumpScale;
        tangentNormal.z=sqrt(1.0-saturate(dot(tangentNormal.xy,tangentNormal.xy)));

        fixed3 albedo=tex2D(_MainTex,i.uv).rgb*_Color.rgb;
        fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;
        fixed3 diffuse=_LightColor0.rgb*albedo*max(0,dot(tangentNormal,tangentLightDir));
        fixed3 halfDir=normalize(tangentLightDir+tangentViewDir);
//      BlinnPhon光照模型
//      fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(tangentNormal,halfDir)),_Gloss);
//      获取遮罩纹理,这里只用了红色
        fixed specularMask=tex2D(_SpecularMask,i.uv).r*_SpecularScale;
//      最核心的一句,最后乘以高光遮罩系数
        fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(tangentNormal,halfDir)),_Gloss)*specularMask;


        return fixed4(ambient+diffuse+specular,1.0);
        }
        ENDCG
        }

    }
    FallBack "Specular"
}

Shader自学笔记 3.3.2 采样遮罩纹理 使高光部分更加柔和_第1张图片

你可能感兴趣的:(Shader)