summaryrefslogtreecommitdiff
path: root/VRCSDK3Avatars/Assets/_PoiyomiShaders/Shaders/7.3/Includes/CGI_PoiMetal.cginc
blob: 1088cdf4a8b110d3f0439687a1d44f416d408092 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#ifndef POI_METAL
    #define POI_METAL
    
    samplerCUBE _CubeMap;
    float _SampleWorld;
    POI_TEXTURE_NOSAMPLER(_MetallicMask);
    POI_TEXTURE_NOSAMPLER(_SmoothnessMask);
    float _Metallic;
    float _InvertSmoothness;
    float _Smoothness;
    float _EnableMetallic;
    float3 _MetalReflectionTint;
    POI_TEXTURE_NOSAMPLER(_MetallicTintMap);
    
    float3 finalreflections;
    float metalicMap;
    float3 reflection;
    float roughness;
    float lighty_boy_uwu_var;
    
    bool shouldMetalHappenBeforeLighting()
    {
        float4 envSample = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, poiCam.reflectionDir, roughness * UNITY_SPECCUBE_LOD_STEPS);
        bool probeExists = !(unity_SpecCube0_HDR.a == 0 && envSample.a == 0);
        return probeExists && !_SampleWorld;
    }
    
    float3 fresnelRelflection()
    {
        half3 dotNV = 1 - abs(poiLight.nDotV);
        half f = dotNV * dotNV * dotNV * dotNV;
        //f *= i_sold.fresnel;
        return lerp(lerp(DielectricSpec.rgb, albedo.rgb, metalicMap), saturate(1 - roughness + metalicMap), f);
    }
    
    void ApplyMetallics(inout float4 finalColor)
    {
        #ifdef FORWARD_BASE_PASS
            metalicMap = POI2D_SAMPLER_PAN(_MetallicMask, _MainTex, poiMesh.uv[_MetallicMaskUV], _MetallicMaskPan) * _Metallic;
            float smoothnessMap = (POI2D_SAMPLER_PAN(_SmoothnessMask, _MainTex, poiMesh.uv[_SmoothnessMaskUV], _SmoothnessMaskPan));
            
            #ifdef POI_BLACKLIGHT
                if (_BlackLightMaskMetallic != 4)
                {
                    metalicMap *= blackLightMask[_BlackLightMaskMetallic];
                    smoothnessMap *= blackLightMask[_BlackLightMaskMetallic];
                }
            #endif
            
            if(_InvertSmoothness == 1)
            {
                smoothnessMap = 1 - smoothnessMap;
            }
            smoothnessMap *= _Smoothness;
            roughness = 1 - smoothnessMap;
            
            
            Unity_GlossyEnvironmentData envData;
            envData.roughness = roughness;
            envData.reflUVW = BoxProjection(
                poiCam.reflectionDir, poiMesh.worldPos.xyz,
                unity_SpecCube0_ProbePosition,
                unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax
            );
            float3 probe0 = Unity_GlossyEnvironment(
                UNITY_PASS_TEXCUBE(unity_SpecCube0), unity_SpecCube0_HDR, envData
            );
            envData.reflUVW = BoxProjection(
                poiCam.reflectionDir, poiMesh.worldPos.xyz,
                unity_SpecCube1_ProbePosition,
                unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax
            );
            
            float interpolator = unity_SpecCube0_BoxMin.w;
            UNITY_BRANCH
            if(interpolator < 0.99999)
            {
                float3 probe1 = Unity_GlossyEnvironment(
                    UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0),
                    unity_SpecCube0_HDR, envData
                );
                reflection = lerp(probe1, probe0, interpolator);
            }
            else
            {
                reflection = probe0;
            }
            
            float reflecty_lighty_boy_uwu_var_2 = 1.0 / (roughness * roughness + 1.0);
            
            half4 tintMap = POI2D_SAMPLER_PAN(_MetallicTintMap, _MainTex, poiMesh.uv[_MetallicTintMapUV], _MetallicTintMapPan);
            finalColor.rgb *= (1 - metalicMap * tintMap.a);
            finalColor.rgb += reflecty_lighty_boy_uwu_var_2 * reflection.rgb * fresnelRelflection() * _MetalReflectionTint * tintMap.rgb * tintMap.a;
        #endif
    }
    
    void ApplyMetallicsFake(inout float4 finalColor)
    {
        #ifdef FORWARD_BASE_PASS
            metalicMap = POI2D_SAMPLER_PAN(_MetallicMask, _MainTex, poiMesh.uv[_MetallicMaskUV], _MetallicMaskPan) * _Metallic;
            float smoothnessMap = (POI2D_SAMPLER_PAN(_SmoothnessMask, _MainTex, poiMesh.uv[_SmoothnessMaskUV], _SmoothnessMaskPan));
            
            #ifdef POI_BLACKLIGHT
                if(_BlackLightMaskMetallic != 4)
                {
                    metalicMap *= blackLightMask[_BlackLightMaskMetallic];
                    smoothnessMap *= blackLightMask[_BlackLightMaskMetallic];
                }
            #endif
            
            if(_InvertSmoothness == 1)
            {
                smoothnessMap = 1 - smoothnessMap;
            }
            smoothnessMap *= _Smoothness;
            roughness = 1 - smoothnessMap;
            
            reflection = texCUBElod(_CubeMap, float4(poiCam.reflectionDir, roughness * UNITY_SPECCUBE_LOD_STEPS));
            
            float reflecty_lighty_boy_uwu_var_2 = 1.0 / (roughness * roughness + 1.0);
            half4 tintMap = POI2D_SAMPLER_PAN(_MetallicTintMap, _MainTex, poiMesh.uv[_MetallicTintMapUV], _MetallicTintMapPan);
            finalColor.rgb *= (1 - metalicMap * tintMap.a);
            finalColor.rgb += reflecty_lighty_boy_uwu_var_2 * reflection.rgb * fresnelRelflection() * _MetalReflectionTint * tintMap.rgb * tintMap.a;
        #endif
    }
#endif