summaryrefslogtreecommitdiff
path: root/VRCSDK3Worlds/Assets/_PoiyomiShaders/Shaders/Pro/Includes/CGI_PoiOutlineFrag.cginc
blob: 7009c001feb932d91c372f9656cdf0cf8390b442 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
float _OutlineRimLightBlend;
float _OutlineLit;
float _OutlineTintMix;
float2 _MainTexPan;
float _MainTextureUV;

float4 frag(v2f i, uint facing: SV_IsFrontFace): COLOR
{
    float4 finalColor = 1;
    UNITY_BRANCH
    if (_commentIfZero_EnableOutlinePass)
    {
        UNITY_SETUP_INSTANCE_ID(i);
        
        float3 finalEmission = 0;
        float4 albedo = 1;
        
        poiMesh.uv[0] = i.uv0.xy;
        poiMesh.uv[1] = i.uv0.zw;
        poiMesh.uv[2] = i.uv1.xy;
        poiMesh.uv[3] = i.uv1.zw;
        
        calculateAttenuation(i);
        InitializeMeshData(i, facing);
        initializeCamera(i);
        calculateTangentData();
        
        float4 mainTexture = UNITY_SAMPLE_TEX2D(_MainTex, TRANSFORM_TEX(poiMesh.uv[_MainTextureUV], _MainTex) + _Time.x * _MainTexPan);
        half3 detailMask = 1;
        calculateNormals(detailMask);
        
        #ifdef POI_DATA
            calculateLightingData(i);
        #endif
        #ifdef POI_LIGHTING
            calculateBasePassLightMaps();
        #endif
        
        float3 uselessData0;
        float3 uselessData1;
        initTextureData(albedo, mainTexture, uselessData0, uselessData1, detailMask);
        
        
        fixed4 col = mainTexture;
        float alphaMultiplier = smoothstep(_OutlineFadeDistance.x, _OutlineFadeDistance.y, distance(getCameraPosition(), i.worldPos));
        float OutlineMask = tex2D(_OutlineMask, TRANSFORM_TEX(poiMesh.uv[_OutlineMaskUV], _OutlineMask) + _Time.x * _OutlineMaskPan).r;
        clip(OutlineMask * _LineWidth - 0.001);
        
        col = col * 0.00000000001 + tex2D(_OutlineTexture, TRANSFORM_TEX(poiMesh.uv[_OutlineTextureUV], _OutlineTexture) + _Time.x * _OutlineTexturePan );
        col.a *= albedo.a;
        col.a *= alphaMultiplier;
        
        #ifdef POI_RANDOM
            col.a *= i.angleAlpha;
        #endif
        
        poiCam.screenUV = calcScreenUVs(i.grabPos);
        col.a *= _LineColor.a;
        
        UNITY_BRANCH
        if(_Mode == 1)
        {
            applyDithering(col);
        }
        
        clip(col.a - _Cutoff);
        
        #ifdef POI_MIRROR
            applyMirrorRenderFrag();
        #endif
        
        UNITY_BRANCH
        if(_OutlineMode == 1)
        {
            #ifdef POI_MIRROR
                applyMirrorTexture(mainTexture);
            #endif
            col.rgb = mainTexture.rgb;
        }
        else if(_OutlineMode == 2)
        {
            col.rgb = lerp(col.rgb, poiLight.color, _OutlineRimLightBlend);
        }
        col.rgb *= _LineColor.rgb;
        
        if(_OutlineMode == 1)
        {
            col.rgb = lerp(col.rgb, mainTexture.rgb, _OutlineTintMix);
        }
        
        finalColor = col;
        
        #ifdef POI_LIGHTING
            UNITY_BRANCH
            if(_OutlineLit)
            {
                finalColor.rgb *= calculateFinalLighting(finalColor.rgb, finalColor);
            }
        #endif
        finalColor.rgb += (col.rgb * _OutlineEmission);
    }
    else
    {
        clip(-1);
    }
    return finalColor;
}