用途
在原有基础上,强化或者弱化某方面的显示
思路
使用一张类似明暗的灰图,原有uv颜色的基础上, 乘以这个比例,达到针对性改变亮度变化的效果。
fixed3 specularMask = tex2D( _MaskTex, f.uv ).r * _MaskScale;
fixed3 specular = _LightColor0.rgb * _Specular * pow(saturate( dot( halfDir,tangentNormal )), _Gloss ) * specularMask;
实现
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Custom/MaskTexture" { //9
Properties{
_Color("ColorTint",Color) =(1,1,1,1)
_MainTex("MainTex", 2D) = "white" {}
_Specular("Specular", Color) = (1,1,1,1)
_Gloss("Gloss", Range(2,200)) = 20
_BumpTex("BumpTex", 2D) = "bump" {}
_BumpScale("BumpScale", Float) = 1.0
_MaskTex("MaskTex", 2D) = "white" {}
_MaskScale("MaskScale", Float)= 1.0
}
SubShader{
Pass{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Color;
sampler2D _MainTex;
fixed4 _Specular;
float _Gloss;
sampler2D _BumpTex;
float _BumpScale;
sampler2D _MaskTex;
float _MaskScale;
float4 _MainTex_ST;
struct a2v {
float4 vertex : POSITION;
float3 normal :NORMAL;
float4 tangent : TANGENT;
float4 texcoord:TEXCOORD;
};
struct v2f{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 viewDir : TEXCOORD1;
float3 lightDir : TEXCOORD2;
};
v2f vert(a2v v) {
v2f f;
f.pos = UnityObjectToClipPos(v.vertex);
f.uv = _MainTex_ST.xy * v.texcoord.xy + _MainTex_ST.zw;
TANGENT_SPACE_ROTATION;
f.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex));
f.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
return f;
}
fixed4 frag( v2f f) : SV_Target{
fixed3 tangentLightDir = normalize(f.lightDir);
fixed3 tangentViewDir = normalize(f.viewDir);
fixed3 tangentNormal = UnpackNormal(tex2D( _BumpTex,f.uv ));
tangentNormal.xy *= _BumpScale;
tangentNormal.z = sqrt( 1 - saturate( dot( tangentNormal.xy,tangentNormal.xy ) ) );
fixed3 albedo = tex2D( _MainTex, f.uv ).rgb * _Color.rgb;
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;
fixed3 halfDir = normalize( tangentViewDir + tangentLightDir );
fixed3 specularMask = tex2D( _MaskTex, f.uv ).r * _MaskScale;
fixed3 specular = _LightColor0.rgb * _Specular * pow(saturate( dot( halfDir,tangentNormal )), _Gloss ) * specularMask;
fixed3 diffuse = _LightColor0.rgb * albedo * dot( tangentLightDir, tangentNormal );
return fixed4( specular + ambient + diffuse,1);
};
ENDCG
}
}
FallBack "Diffuse"
}