summaryrefslogtreecommitdiff
path: root/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiMatcap.cginc
blob: 4ed825f95682e7fd388259f9b321d02fc48afedc (plain)
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