1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#ifndef MATCAP
#define MATCAP
UNITY_DECLARE_TEX2D_NOSAMPLER(_Matcap);
UNITY_DECLARE_TEX2D_NOSAMPLER(_MatcapMap); float4 _MatcapMap_ST;
float4 _MatcapColor;
float _MatcapStrength;
float _ReplaceWithMatcap;
float _MultiplyMatcap;
float _AddMatcap;
float3 matcap;
float matcapMask;
float2 getMatcapUV(float3 viewDirection, float3 normalDirection)
{
half3 worldViewUp = normalize(half3(0, 1, 0) - viewDirection * dot(viewDirection, half3(0, 1, 0)));
half3 worldViewRight = normalize(cross(viewDirection, worldViewUp));
half2 matcapUV = half2(dot(worldViewRight, normalDirection), dot(worldViewUp, normalDirection)) * 0.5 + 0.5;
return matcapUV;
}
void calculateMatcap(float3 cameraToVert, float3 normal, float2 uv)
{
float2 matcapUV = getMatcapUV(cameraToVert, normal);
matcap = UNITY_SAMPLE_TEX2D_SAMPLER(_Matcap, _MainTex, matcapUV) * _MatcapColor * _MatcapStrength;
matcapMask = UNITY_SAMPLE_TEX2D_SAMPLER(_MatcapMap, _MainTex, TRANSFORM_TEX(uv, _MatcapMap));
}
void applyMatcap(inout float4 finalColor)
{
finalColor.rgb = lerp(finalColor, matcap, _ReplaceWithMatcap * matcapMask);
finalColor.rgb *= lerp(1, matcap, _MultiplyMatcap * matcapMask);
finalColor.rgb += matcap * _AddMatcap * matcapMask;
}
#endif
|