美文网首页
【Unity Shader入门精要学习】基础纹理(七)

【Unity Shader入门精要学习】基础纹理(七)

作者: 小王子称号发放NPC | 来源:发表于2019-09-15 14:40 被阅读0次

遮罩纹理(mask texture)

遮罩允许我们可以保护某些区域,使他们免于修改。一般流程是:通过采样得到遮罩纹理的素纹值,然后使用其中一个或几个通道的值(如r)和某种表面属性相乘,这样当该通道的值为0时,可以保证表面不受这种属性的影响。遮罩纹理可以像素级别的控制模型表面的各种性质。
例如控制表面高光:

Shader "Unlit/MaskTexure"
{
    Properties
    {
        _Color("Color",Color)=(1.0,1.0,1.0,1.0)        //用来控制漫反射
        _Specular("Specular",Color)=(1.0,1.0,1.0,1.0)
        _Gloss("Gloss",Range(30.0,100.0)) = 30.0
        _MainTex("Main Tex",2D)="white"{}
        _BumpTex("Bump Tex",2D)="Bump"{}
        _BumpTexScale("Bump Scale",float) = -0.8
        _SpecularMaskTex("Specular Mask Tex",2D)="white"{}
        _SpecularMaskScale("Specular Mask Scale",float) = 1.0
    }

    SubShader
    {
        Pass
        {
            Tags{"LightModel"="ForwardBase"}
            CGPROGRAM
            #include "Lighting.cginc"
            #include "UnityCG.cginc"

            #pragma vertex vert
            #pragma fragment frag

            fixed4 _Color;
            fixed4 _Specular;
            float _Gloss;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _BumpTex;
            float4 _BumpTex_ST;
            float _BumpTexScale;
            sampler2D _SpecularMaskTex;
            float _SpecularMaskScale;
            /*
            #define MODEL_2_TANGENT_ROTATION \
            fixed3 binormal = cross(normalize(v.normal),normalize(v.tangent.xyz)) * v.tangent.w; \
            float3x3 rotation = float3x3(v.tangent.xyz,binormal,v.noraml)
            */
            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float4 tangent:TANGENT;
                float4 texcoord:TEXCOORD0;
            };

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 tangentLightDir:TEXCOORD0;
                float3 tangentViewDir:TEXCOORD1;
                float4 uv:TEXCOORD2;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);

                o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                o.uv.zw = v.texcoord.xy * _BumpTex_ST.xy + _BumpTex_ST.zw;

                TANGENT_SPACE_ROTATION;

                o.tangentLightDir = mul(rotation,ObjSpaceLightDir(v.vertex));
                o.tangentViewDir = mul(rotation,ObjSpaceViewDir(v.vertex));

                return o;
            }

            fixed4 frag(v2f i):SV_TARGET
            {
                float3 tangentLightDir = normalize(i.tangentLightDir);
                float3 tangentViewDir = normalize(i.tangentViewDir);

                fixed3 packedNormal = UnpackNormal(tex2D(_BumpTex,i.uv.zw));
                packedNormal.xy *= _BumpTexScale;
                packedNormal.z = sqrt(1-saturate(dot(packedNormal.xy,packedNormal.xy)));

                float albedo = tex2D(_MainTex,i.uv.xy).rgb * _Color.rgb;
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;

                fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(packedNormal,tangentLightDir));

                fixed specuarlMask = tex2D(_SpecularMaskTex,i.uv.xy).r * _SpecularMaskScale;
                fixed halfNormal = normalize(tangentLightDir+tangentViewDir);

                fixed3 specular = _LightColor0.rgb * _Specular * pow(saturate(dot(packedNormal,halfNormal)),_Gloss)*specuarlMask;
                return fixed4(ambient+diffuse+specular,1.0);
            }

            ENDCG
        }
    }

    Fallback "specular"
}

相关文章

网友评论

      本文标题:【Unity Shader入门精要学习】基础纹理(七)

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