漸變紋理 和 遮罩紋理

  • 漸變紋理 

紋理不僅可以定義一個物體的顏色,也可以用來存儲任何表面屬性。比如用漸變紋理 來控制漫反射光照結果。可以通過使用不同的漸變紋理 來控制物體的漫反射光照。

Shader "Custom/RampTexture"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        //漸變紋理
        _RampTex ("Ramp Tex", 2D) = "white" {}
        _Specular("Specular",Color)=(1,1,1,1)
        _Gloss ("Gloss", Range(8,256)) = 20
        
    }
    SubShader
    {
       pass
       {
           Tags{"LightMode"="ForwardBase"}
           CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"

            fixed4 _Color ;
            sampler2D _RampTex;
            float4 _RampTex_ST;
            fixed4 _Specular;
            float _Gloss;

            struct a2v
            {
                float4 vertex :POSITION;
                float3 normal:NORMAL;
                float4 texcoord:TEXCOORD0;

            };

            struct v2f
            {
                float4 pos:SV_POSITION;
                float3 worldNormal:TEXCOORD0;
                float3 worldPos:TEXCOORD1;
                float2 uv:TEXCOORD2;
            };

            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.worldNormal=UnityObjectToWorldNormal(v.normal);
                o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;
                //計算經過平鋪 和偏移後的紋理座標
                o.uv=TRANSFORM_TEX(v.texcoord,_RampTex);
                return o;
            }   

            fixed4 frag(v2f i):SV_Target
            {
                fixed3 worldNormal=normalize(i.worldNormal);
                fixed3 worldLightDir=normalize(UnityWorldSpaceLightDir(i.worldPos));
                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
                //half Lambert
                fixed  halfLambert=0.5 * dot(worldNormal,worldLightDir)+0.5;
                fixed3 diffuseColor=tex2D(_RampTex,fixed2(halfLambert,halfLambert)).rgb * _Color.rgb;

                fixed3 diffuse=_LightColor0.rgb*diffuseColor;
                fixed3 viewDir=normalize(UnityWorldSpaceViewDir(i.worldPos));
                fixed3 halfDir=normalize(worldLightDir+viewDir);
                fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);

                return fixed4(ambient+diffuse+specular,1);
            }
           ENDCG
       }
    }
    FallBack "Specular"
}

通過使用不同的漸變紋理,來改變 模型風格

第一張圖使用的是 紫色到淺黃色的 漸變紋理。第二張漸變紋理是 中間分界線 微微發紅,插畫中陰影處是用這樣的色調。

第三張通常被用於 卡通風格,色調突變 沒有平滑過渡,模擬卡通中的陰影色塊。

  • 遮罩紋理

允許我們可以保護某些區域不被修改。比如我們 想讓 模型的某些區域反光強度強烈一些,某些區域弱一點,這時我們就可以採用一張遮罩紋理來控制光照。還有就是在製作地形材質的時候需要混合多張圖片,例如草地的紋理,表現石子的紋理,裸露土地的紋理等,使用遮罩紋理可以控制如何混合這些紋理。

是用遮罩紋理流程:通過採樣得到遮罩紋理的紋素值,然後使用其中某個或者 某幾個通道的值(比如 texel.r)來與某種表面屬性進行相乘,這樣當該通道的值爲0的時候,可以保護表面不受屬性的影響。

Shader "Custom/MaskTexture"
{ 
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Main Tex", 2D) = "white" {}
        _BumpMap("Normal Map",2D)="bump" {}
        _BumpScale("Bump Scale",Float)=1
        _SpecularMask("Specular Mask",2D)="white"{}
        _SpecularScale("Specular Scale",Float)=1
        _Specular("Specular",Color)=(1,1,1,1)
        _Gloss ("Gloss", Range(8,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;
            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=UnityObjectToClipPos(v.vertex);
                o.uv.xy=v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;
                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-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);
                //獲取遮罩值 ,採用r 分量來計算掩碼值,來控制高光反射強度
                fixed3 specularMask=tex2D(_SpecularMask,i.uv).r *_SpecularScale;
                //計算高光部分,和高光遮罩
                fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(tangentNormal,halfDir)),_Gloss)*specularMask;
                //fixed3 specular=_LightColor0.rgb*_Specular.rgb*pow(max(0,dot(tangentNormal,halfDir)),_Gloss);

                //return fixed4(ambient+diffuse,1);
                return fixed4(ambient+diffuse+specular,1);
            }
           ENDCG
       }
    }
    FallBack "Specular"
}

通過使用高光遮罩紋理 依次得到下面的效果。

可以讓我們 更加精細的控制光照細節,得到更好的效果。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章