summaryrefslogtreecommitdiff
path: root/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/VoxelCubed/Includes/PoiRefraction.cginc
blob: 6da9a05aa8fcdf448fa34c90d27b481c06b1b70b (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
39
40
41
42
43
44
45
46
47
48
49
#ifndef REFRACTION
    #define REFRACTION
    
    sampler2D _PoiGrab;
    float _IndexOfRefraction;
    float _RefractionOpacity;
    UNITY_DECLARE_TEX2D_NOSAMPLER(_RefractionOpacityMask); float4 _RefractionOpacityMask_ST;

    float3 refraction;
    float refractionOpacityMask;
    
    inline float4 Refraction(v2f i, float indexOfRefraction/*, float chomaticAberration*/)
    {
        float4 screenPos = i.screenPos;
        #if UNITY_UV_STARTS_AT_TOP
            float scale = -1.0;
        #else
            float scale = 1.0;
        #endif
        float halfPosW = screenPos.w * 0.5;
        screenPos.y = (screenPos.y - halfPosW) * _ProjectionParams.x * scale + halfPosW;
        #if SHADER_API_D3D9 || SHADER_API_D3D11
            screenPos.w += 0.00000000001;
        #endif
        float2 projScreenPos = (screenPos / screenPos.w).xy;
        float3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
        float3 refractionOffset = ((((indexOfRefraction - 1.0) * mul(UNITY_MATRIX_V, float4(i.normal, 0.0))) * (1.0 / (screenPos.z + 1.0))) * (1.0 - dot(i.normal, worldViewDir)));
        float2 cameraRefraction = float2(refractionOffset.x, - (refractionOffset.y * _ProjectionParams.x));
        return tex2D(_PoiGrab, (projScreenPos + cameraRefraction));
        /*
        float4 redAlpha = tex2D(_GrabTexture, (projScreenPos + cameraRefraction));
        float green = tex2D(_GrabTexture, (projScreenPos + (cameraRefraction * (1.0 - chomaticAberration)))).g;
        float blue = tex2D(_GrabTexture, (projScreenPos + (cameraRefraction * (1.0 + chomaticAberration)))).b;
        return float4(redAlpha.r, green, blue, redAlpha.a);
        */
    }
    
    void calculateRefraction(v2f i)
    {
        refraction = Refraction(i, _IndexOfRefraction).rgb;
        refractionOpacityMask = UNITY_SAMPLE_TEX2D_SAMPLER(_RefractionOpacityMask, _MainTex, TRANSFORM_TEX(i.uv, _RefractionOpacityMask));
    }
    
    void applyRefraction(inout float4 finalColor)
    {
        finalColor.rgb = lerp(refraction, finalColor, _RefractionOpacity * refractionOpacityMask);
    }
    
#endif