summaryrefslogtreecommitdiff
path: root/VRCSDK3Avatars/Assets/_PoiyomiShaders/Shaders/7.3/Includes/CGI_PoiBulge.cginc
blob: 21f0c00c69f9c8761a0b3fbfccdfb5e569c062d0 (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
37
38
#ifndef POI_BULGE
    #define POI_BULGE
    
    #ifndef POI_CAMERA_DEPTH
        #define POI_CAMERA_DEPTH
        sampler2D _CameraDepthTexture;
    #endif
    
    sampler2D _BulgeMask;
    float _BuldgeFadeLength;
    float _BuldgeHeight;
    
    void bulgyWolgy(inout v2f o)
    {
        float depth = DecodeFloatRG(tex2Dlod(_CameraDepthTexture, float4(o.grabPos.xy / o.grabPos.w, 0, 0)));
        float bulgeMask = tex2Dlod(_BulgeMask, float4(o.uv0.xy, 0, 0));
        depth = Linear01Depth(depth);
        
        float intersect = 0;
        if (depth != 1)
        {
            float diff = distance(depth, Linear01Depth(o.pos.z / o.pos.w));
            if(diff > 0)
            {
                intersect = 1 - smoothstep(0, _ProjectionParams.w * _BuldgeFadeLength, diff);
            }
        }
        float4 offset = intersect * _BuldgeHeight * float4(o.normal, 0);
        
        offset = IsInMirror() ? 0: offset;
        offset *= bulgeMask;
        
        o.worldPos = mul(unity_ObjectToWorld, o.localPos) + offset;
        o.localPos = mul(unity_WorldToObject, o.worldPos);
        o.pos = UnityObjectToClipPos(o.localPos);
    }
    
#endif