7.5基础纹理-遮罩纹理

//基础纹理:遮罩纹理
//通过采样得到遮罩纹理的文素质,然后使用其中某个通道的值来与某种表面属性进行相乘
//使用一张高光遮罩纹理,逐像素的控制模型表面的高光反射强度
Shader "Unity shader book/Chapter 7/Mask Texture" {
    Properties {
        _Color("Color Tint",Color)=(1,1,1,1)
        _MainTex("Main Tex",2D) = "white"{}
        _BumpMap("Bump 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,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;//_MainTex,_BumpMap,_SpecularMask定义公共的纹理属性变量。
        //这种方式节省需要存储的纹理坐标数目,修改主纹理的平铺系数和偏移系数会同时影响3个纹理的裁员

        sampler2D _BumpMap;
        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 = TRANSFORM_TEX(v.texcoord, _MainTex); //纹理贴图的uv +缩放平移

            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);

        fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uv));//对法线贴图进行采样
        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));

        //对遮罩纹理进行采样,选择使用r分量来计算掩码值,然后和_SpecularScale相乘来控制高光反射的强度。
        fixed3 halfDir = normalize(tangentLightDir+ tangentViewDir);
        fixed3 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"
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值