Shader "Unlit/Matcap" { Properties { _MainTex ("Texture", 2D) = "white" {} _Matcap("Mapcap",2D) = "white"{} _MatcapPower("MatcapPower", Float) = 2 _MatcapAdd("MapcapAdd",2D) = "white"{} _MatcapAddPower("MatcapAddPower", Float) = 2 _RampTex("RampTex",2D) = "white"{} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal :NORMAL; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 normal_world:TEXCOORD1; float3 pos_world:TEXCOORD2; }; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _Matcap; float _MatcapPower; sampler2D _MatcapAdd; float _MatcapAddPower; sampler2D _RampTex; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.normal_world = mul(float4(v.normal,0), unity_WorldToObject); o.pos_world = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } fixed4 frag (v2f i) : SV_Target { //主贴图 float4 tex_color = tex2D(_MainTex,i.uv); //Matcap 计算采样的uv 使用 float3 normal_world = normalize(i.normal_world); float3 normal_view = mul(UNITY_MATRIX_V, float4(normal_world,0)); float2 map_cap_uv = (normal_view.xy + float2(1,1)) * 0.5; float4 mapcap_color = tex2D(_Matcap, map_cap_uv) * _MatcapPower; //叠加的 Matcap float4 matcap_add = tex2D(_MatcapAdd, map_cap_uv) * _MatcapAddPower; //用菲涅尔来采样渐变图 1-0 float3 view_world = normalize(_WorldSpaceCameraPos.xyz - i.pos_world); half NdotV = saturate(dot(normal_world,view_world)); half sample = 1 - NdotV; float4 ramp_color = tex2D(_RampTex, float2(sample,sample)); float4 final_color = mapcap_color * tex_color * ramp_color + matcap_add; return final_color; } ENDCG } } }
Matcap贴图