Skip to content

Commit 77b6648

Browse files
authored
Merge pull request scp-fs2open#1613 from asarium/opengl/shaderIncludes
Add support for includes in shader files
2 parents 09ca5d3 + c4dd593 commit 77b6648

6 files changed

Lines changed: 228 additions & 186 deletions

File tree

code/def_files/data/effects/deferred-f.sdr

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2+
#include "lighting.sdr"
3+
14
in vec3 beamVec;
25
in vec3 lightPosition;
36
out vec4 fragOut0;
@@ -27,49 +30,6 @@ layout (std140) uniform lightData {
2730
int lightType;
2831
};
2932

30-
#define SPEC_INTENSITY_POINT 5.3 // Point light
31-
#define SPEC_INTENSITY_DIRECTIONAL 3.0 // Directional light
32-
#define SPECULAR_FACTOR 1.75
33-
#define SPECULAR_ALPHA 0.1
34-
#define SPEC_FACTOR_NO_SPEC_MAP 0.6
35-
#define ENV_ALPHA_FACTOR 0.3
36-
#define GLOW_MAP_INTENSITY 1.5
37-
#define AMBIENT_LIGHT_BOOST 1.0
38-
vec3 FresnelSchlick(vec3 specColor, vec3 light, vec3 halfVec)
39-
{
40-
return specColor + (vec3(1.0) - specColor) * pow(1.0 - clamp(dot(light, halfVec), 0.0, 1.0), 5.0);
41-
}
42-
vec3 SpecularBlinnPhong(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, float specPower, float fresnel, float dotNL)
43-
{
44-
return mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnel) * ((specPower + 2.0) / 8.0 ) * pow(clamp(dot(normal, halfVec), 0.0, 1.0), specPower) * dotNL;
45-
}
46-
vec3 SpecularGGX(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, vec3 view, float gloss, float dotNL)
47-
{
48-
float roughness = clamp(1.0f - gloss, 0.0f, 1.0f);
49-
float alpha = roughness * roughness;
50-
51-
float dotNH = clamp(dot(normal, halfVec), 0.0f, 1.0f);
52-
float dotNV = clamp(dot(normal, view), 0.0f, 1.0f);
53-
54-
float alphaSqr = alpha * alpha;
55-
float pi = 3.14159f;
56-
float denom = dotNH * dotNH * (alphaSqr - 1.0f) + 1.0f;
57-
float distribution = alphaSqr / (pi * denom * denom);
58-
59-
vec3 fresnel = FresnelSchlick(specColor, light, halfVec);
60-
61-
float alphaPrime = roughness + 1.0f;
62-
float k = alphaPrime * alphaPrime / 8.0f;
63-
float g1vNL = 1.0f / (dotNL * (1.0f - k) + k);
64-
float g1vNV = 1.0f / (dotNV * (1.0f - k) + k);
65-
float visibility = g1vNL * g1vNV;
66-
67-
return distribution * fresnel * visibility * dotNL;
68-
}
69-
vec4 SpecularLegacy(vec4 specColor, vec3 normal, vec3 halfVec, float specPower)
70-
{
71-
return specColor * pow(clamp(dot(normal, halfVec), 0.0, 1.0), specPower);
72-
}
7333
void main()
7434
{
7535
vec2 screenPos = gl_FragCoord.xy * vec2(invScreenWidth, invScreenHeight);
@@ -124,6 +84,6 @@ void main()
12484
vec3 halfVec = normalize(lightDir + eyeDir);
12585
float NdotL = clamp(dot(normal.xyz, lightDir), 0.0, 1.0);
12686
vec4 fragmentColor = vec4(color * (diffuseLightColor * NdotL * attenuation), 1.0);
127-
fragmentColor.rgb += SpecularGGX(specColor.rgb, lightDir, normal.xyz, halfVec, eyeDir, gloss, NdotL).rgb * specLightColor * attenuation;
87+
fragmentColor.rgb += SpecularGGX(specColor.rgb, lightDir, normal.xyz, halfVec, eyeDir, gloss, fresnel, NdotL).rgb * specLightColor * attenuation;
12888
fragOut0 = max(fragmentColor, vec4(0.0));
12989
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
const float SPEC_INTENSITY_POINT = 5.3 ;// Point light
3+
const float SPEC_INTENSITY_DIRECTIONAL = 3.0 ;// Directional light
4+
const float SPECULAR_FACTOR = 1.75;
5+
const float SPECULAR_ALPHA = 0.1;
6+
const float SPEC_FACTOR_NO_SPEC_MAP = 0.6;
7+
const float ENV_ALPHA_FACTOR = 0.3;
8+
const float GLOW_MAP_INTENSITY = 1.5;
9+
const float AMBIENT_LIGHT_BOOST = 1.0;
10+
11+
vec3 FresnelSchlick(vec3 specColor, vec3 light, vec3 halfVec)
12+
{
13+
return specColor + (vec3(1.0) - specColor) * pow(1.0 - clamp(dot(light, halfVec), 0.0, 1.0), 5.0);
14+
}
15+
16+
vec3 SpecularBlinnPhong(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, float specPower, float fresnel, float dotNL)
17+
{
18+
return mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnel) * ((specPower + 2.0) / 8.0 ) * pow(clamp(dot(normal, halfVec), 0.0, 1.0), specPower) * dotNL;
19+
}
20+
21+
vec3 SpecularGGX(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, vec3 view, float gloss, float fresnelFactor, float dotNL)
22+
{
23+
float roughness = clamp(1.0f - gloss, 0.0f, 1.0f);
24+
float alpha = roughness * roughness;
25+
26+
float dotNH = clamp(dot(normal, halfVec), 0.0f, 1.0f);
27+
float dotNV = clamp(dot(normal, view), 0.0f, 1.0f);
28+
29+
float alphaSqr = alpha * alpha;
30+
float pi = 3.14159f;
31+
float denom = dotNH * dotNH * (alphaSqr - 1.0f) + 1.0f;
32+
float distribution = alphaSqr / (pi * denom * denom);
33+
34+
vec3 fresnel = mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnelFactor);
35+
36+
float alphaPrime = roughness + 1.0f;
37+
float k = alphaPrime * alphaPrime / 8.0f;
38+
float g1vNL = 1.0f / (dotNL * (1.0f - k) + k);
39+
float g1vNV = 1.0f / (dotNV * (1.0f - k) + k);
40+
float visibility = g1vNL * g1vNV;
41+
42+
return distribution * fresnel * visibility * dotNL;
43+
}

code/def_files/data/effects/main-f.sdr

Lines changed: 7 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
2+
#include "shadows.sdr"
3+
4+
#include "lighting.sdr"
5+
16
#define MAX_LIGHTS 8
27
#define LT_DIRECTIONAL 0
38
#define LT_POINT 1
@@ -133,15 +138,6 @@ in vec4 fragShadowUV[4];
133138
in vec4 fragShadowPos;
134139
uniform sampler2DArray shadow_map;
135140
#endif
136-
#define SPEC_INTENSITY_POINT 5.3 // Point light
137-
#define SPEC_INTENSITY_DIRECTIONAL 3.0 // Directional light
138-
#define SPECULAR_FACTOR 1.75
139-
#define SPEC_FACTOR_NO_SPEC_MAP 0.6
140-
#define ENV_ALPHA_FACTOR 0.3
141-
#define GLOW_MAP_INTENSITY 1.5
142-
#define AMBIENT_LIGHT_BOOST 1.0
143-
#define VARIANCE_SHADOW_SCALE 1000000.0
144-
#define VARIANCE_SHADOW_SCALE_INV 1.0/VARIANCE_SHADOW_SCALE
145141
#define SRGB_GAMMA 2.2
146142
in vec4 fragPosition;
147143
in vec3 fragNormal;
@@ -151,140 +147,13 @@ out vec4 fragOut1;
151147
out vec4 fragOut2;
152148
out vec4 fragOut3;
153149

154-
#ifdef FLAG_SHADOWS
155-
vec2 sampleShadowMap(vec2 uv, vec2 offset_uv, int cascade, float shadowMapSizeInv)
156-
{
157-
return texture(shadow_map, vec3(uv + offset_uv * shadowMapSizeInv, float(cascade))).xy;
158-
}
159-
160-
float computeShadowFactor(vec2 moments, float bias)
161-
{
162-
float shadow = 1.0;
163-
if((moments.x - bias) > fragShadowPos.z)
164-
{
165-
// variance shadow mapping using Chebychev's Formula
166-
float variance = moments.y * VARIANCE_SHADOW_SCALE - moments.x * moments.x;
167-
float mD = moments.x - bias - fragShadowPos.z;
168-
shadow = variance / (variance + mD * mD);
169-
shadow = clamp(shadow, 0.0, 1.0);
170-
}
171-
return shadow;
172-
}
173-
174-
float sampleNoPCF(int cascade)
175-
{
176-
return computeShadowFactor(sampleShadowMap(fragShadowUV[cascade].xy, vec2(0.0, 0.0), cascade, 1.0/1024.0), 0.05);
177-
}
178-
179-
float samplePoissonPCF(int cascade)
180-
{
181-
if(cascade > 3 || cascade < 0) return 1.0;
182-
vec2 poissonDisc[16];
183-
poissonDisc[0] = vec2(-0.76275, -0.3432573);
184-
poissonDisc[1] = vec2(-0.5226235, -0.8277544);
185-
poissonDisc[2] = vec2(-0.3780261, 0.01528688);
186-
poissonDisc[3] = vec2(-0.7742821, 0.4245702);
187-
poissonDisc[4] = vec2(0.04196143, -0.02622231);
188-
poissonDisc[5] = vec2(-0.2974772, -0.4722782);
189-
poissonDisc[6] = vec2(-0.516093, 0.71495);
190-
poissonDisc[7] = vec2(-0.3257416, 0.3910343);
191-
poissonDisc[8] = vec2(0.2705966, 0.6670476);
192-
poissonDisc[9] = vec2(0.4918377, 0.1853267);
193-
poissonDisc[10] = vec2(0.4428544, -0.6251478);
194-
poissonDisc[11] = vec2(-0.09204347, 0.9267113);
195-
poissonDisc[12] = vec2(0.391505, -0.2558275);
196-
poissonDisc[13] = vec2(0.05605913, -0.7570801);
197-
poissonDisc[14] = vec2(0.81772, -0.02475523);
198-
poissonDisc[15] = vec2(0.6890262, 0.5191521);
199-
float maxUVOffset[4];
200-
maxUVOffset[0] = 1.0/300.0;
201-
maxUVOffset[1] = 1.0/250.0;
202-
maxUVOffset[2] = 1.0/200.0;
203-
maxUVOffset[3] = 1.0/200.0;
204-
vec2 sum = sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[0], cascade, maxUVOffset[cascade])*(1.0/16.0);
205-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[1], cascade, maxUVOffset[cascade])*(1.0/16.0);
206-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[2], cascade, maxUVOffset[cascade])*(1.0/16.0);
207-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[3], cascade, maxUVOffset[cascade])*(1.0/16.0);
208-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[4], cascade, maxUVOffset[cascade])*(1.0/16.0);
209-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[5], cascade, maxUVOffset[cascade])*(1.0/16.0);
210-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[6], cascade, maxUVOffset[cascade])*(1.0/16.0);
211-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[7], cascade, maxUVOffset[cascade])*(1.0/16.0);
212-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[8], cascade, maxUVOffset[cascade])*(1.0/16.0);
213-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[9], cascade, maxUVOffset[cascade])*(1.0/16.0);
214-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[10], cascade, maxUVOffset[cascade])*(1.0/16.0);
215-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[11], cascade, maxUVOffset[cascade])*(1.0/16.0);
216-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[12], cascade, maxUVOffset[cascade])*(1.0/16.0);
217-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[13], cascade, maxUVOffset[cascade])*(1.0/16.0);
218-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[14], cascade, maxUVOffset[cascade])*(1.0/16.0);
219-
sum += sampleShadowMap(fragShadowUV[cascade].xy, poissonDisc[15], cascade, maxUVOffset[cascade])*(1.0/16.0);
220-
return computeShadowFactor(sum, 0.1);
221-
}
222-
223-
float getShadowValue()
224-
{
225-
// Valathil's Shadows
226-
float depth = -fragPosition.z;
227-
int cascade = 4;
228-
cascade -= int(step(depth, fardist));
229-
cascade -= int(step(depth, middist));
230-
cascade -= int(step(depth, neardist));
231-
cascade -= int(step(depth, veryneardist));
232-
float cascade_start_dist[5];
233-
cascade_start_dist[0] = 0.0;
234-
cascade_start_dist[1] = veryneardist;
235-
cascade_start_dist[2] = neardist;
236-
cascade_start_dist[3] = middist;
237-
cascade_start_dist[4] = fardist;
238-
if(cascade > 3 || cascade < 0) return 1.0;
239-
float dist_threshold = (cascade_start_dist[cascade+1] - cascade_start_dist[cascade])*0.2;
240-
if(cascade_start_dist[cascade+1] - dist_threshold > depth)
241-
return samplePoissonPCF(cascade);
242-
return mix(samplePoissonPCF(cascade), samplePoissonPCF(cascade+1), smoothstep(cascade_start_dist[cascade+1] - dist_threshold, cascade_start_dist[cascade+1], depth));
243-
}
244-
#endif
245-
246150
vec3 FresnelLazarovEnv(vec3 specColor, vec3 view, vec3 normal, float gloss)
247151
{
248152
// Fresnel for environment lighting
249153
// Equation referenced from Dimitar Lazarov's presentation titled Physically Based Rendering in Call of Duty: Black Ops
250154
return specColor + (vec3(1.0) - specColor) * pow(1.0 - clamp(dot(view, normal), 0.0, 1.0), 5.0) / (4.0 - 3.0 * gloss);
251155
}
252156

253-
vec3 FresnelSchlick(vec3 specColor, vec3 light, vec3 halfVec)
254-
{
255-
return specColor + (vec3(1.0) - specColor) * pow(1.0 - clamp(dot(light, halfVec), 0.0, 1.0), 5.0);
256-
}
257-
258-
vec3 SpecularBlinnPhong(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, float specPower, float fresnel, float dotNL)
259-
{
260-
return mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnel) * ((specPower + 2.0) / 8.0 ) * pow(clamp(dot(normal, halfVec), 0.0, 1.0), specPower) * dotNL;
261-
}
262-
263-
vec3 SpecularGGX(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, vec3 view, float gloss, float fresnelFactor, float dotNL)
264-
{
265-
float roughness = clamp(1.0f - gloss, 0.0f, 1.0f);
266-
float alpha = roughness * roughness;
267-
268-
float dotNH = clamp(dot(normal, halfVec), 0.0f, 1.0f);
269-
float dotNV = clamp(dot(normal, view), 0.0f, 1.0f);
270-
271-
float alphaSqr = alpha * alpha;
272-
float pi = 3.14159f;
273-
float denom = dotNH * dotNH * (alphaSqr - 1.0f) + 1.0f;
274-
float distribution = alphaSqr / (pi * denom * denom);
275-
276-
vec3 fresnel = mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnelFactor);
277-
278-
float alphaPrime = roughness + 1.0f;
279-
float k = alphaPrime * alphaPrime / 8.0f;
280-
float g1vNL = 1.0f / (dotNL * (1.0f - k) + k);
281-
float g1vNV = 1.0f / (dotNV * (1.0f - k) + k);
282-
float visibility = g1vNL * g1vNV;
283-
284-
return distribution * fresnel * visibility * dotNL;
285-
}
286-
287-
#ifdef FLAG_LIGHT
288157
void GetLightInfo(int i, out vec3 lightDir, out float attenuation)
289158
{
290159
lightDir = normalize(lights[i].position.xyz);
@@ -333,7 +202,7 @@ vec3 CalculateLighting(vec3 normal, vec3 diffuseMaterial, vec3 specularMaterial,
333202
}
334203
return diffuseMaterial * (lightAmbient + lightDiffuse) + lightSpecular;
335204
}
336-
#endif
205+
337206
void main()
338207
{
339208
#ifdef WORKAROUND_CLIPPING_PLANES
@@ -428,7 +297,7 @@ void main()
428297
#endif
429298
float shadow = 1.0;
430299
#ifdef FLAG_SHADOWS
431-
shadow = getShadowValue();
300+
shadow = getShadowValue(shadow_map, -fragPosition.z, fragShadowPos.z, fragShadowUV, fardist, middist, neardist, veryneardist);
432301
#endif
433302
#ifdef FLAG_LIGHT
434303
baseColor.rgb = CalculateLighting(normal, baseColor.rgb, specColor.rgb, glossData, fresnelFactor, shadow, aoFactors.x);
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
2+
const float VARIANCE_SHADOW_SCALE = 1000000.0;
3+
const float VARIANCE_SHADOW_SCALE_INV = 1.0/VARIANCE_SHADOW_SCALE;
4+
5+
vec2 sampleShadowMap(sampler2DArray shadow_map, vec2 uv, vec2 offset_uv, int cascade, float shadowMapSizeInv)
6+
{
7+
return texture(shadow_map, vec3(uv + offset_uv * shadowMapSizeInv, float(cascade))).xy;
8+
}
9+
10+
float computeShadowFactor(float shadowDepth, vec2 moments, float bias)
11+
{
12+
float shadow = 1.0;
13+
if((moments.x - bias) > shadowDepth)
14+
{
15+
// variance shadow mapping using Chebychev's Formula
16+
float variance = moments.y * VARIANCE_SHADOW_SCALE - moments.x * moments.x;
17+
float mD = moments.x - bias - shadowDepth;
18+
shadow = variance / (variance + mD * mD);
19+
shadow = clamp(shadow, 0.0, 1.0);
20+
}
21+
return shadow;
22+
}
23+
24+
float sampleNoPCF(sampler2DArray shadow_map, float shadowDepth, int cascade, vec4 shadowUV[4])
25+
{
26+
return computeShadowFactor(shadowDepth, sampleShadowMap(shadow_map, shadowUV[cascade].xy, vec2(0.0, 0.0), cascade, 1.0/1024.0), 0.05);
27+
}
28+
29+
float samplePoissonPCF(sampler2DArray shadow_map, float shadowDepth, int cascade, vec4 shadowUV[4])
30+
{
31+
if(cascade > 3 || cascade < 0) return 1.0;
32+
vec2 poissonDisc[16];
33+
poissonDisc[0] = vec2(-0.76275, -0.3432573);
34+
poissonDisc[1] = vec2(-0.5226235, -0.8277544);
35+
poissonDisc[2] = vec2(-0.3780261, 0.01528688);
36+
poissonDisc[3] = vec2(-0.7742821, 0.4245702);
37+
poissonDisc[4] = vec2(0.04196143, -0.02622231);
38+
poissonDisc[5] = vec2(-0.2974772, -0.4722782);
39+
poissonDisc[6] = vec2(-0.516093, 0.71495);
40+
poissonDisc[7] = vec2(-0.3257416, 0.3910343);
41+
poissonDisc[8] = vec2(0.2705966, 0.6670476);
42+
poissonDisc[9] = vec2(0.4918377, 0.1853267);
43+
poissonDisc[10] = vec2(0.4428544, -0.6251478);
44+
poissonDisc[11] = vec2(-0.09204347, 0.9267113);
45+
poissonDisc[12] = vec2(0.391505, -0.2558275);
46+
poissonDisc[13] = vec2(0.05605913, -0.7570801);
47+
poissonDisc[14] = vec2(0.81772, -0.02475523);
48+
poissonDisc[15] = vec2(0.6890262, 0.5191521);
49+
float maxUVOffset[4];
50+
maxUVOffset[0] = 1.0/300.0;
51+
maxUVOffset[1] = 1.0/250.0;
52+
maxUVOffset[2] = 1.0/200.0;
53+
maxUVOffset[3] = 1.0/200.0;
54+
vec2 sum = sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[0], cascade, maxUVOffset[cascade])*(1.0/16.0);
55+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[1], cascade, maxUVOffset[cascade])*(1.0/16.0);
56+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[2], cascade, maxUVOffset[cascade])*(1.0/16.0);
57+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[3], cascade, maxUVOffset[cascade])*(1.0/16.0);
58+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[4], cascade, maxUVOffset[cascade])*(1.0/16.0);
59+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[5], cascade, maxUVOffset[cascade])*(1.0/16.0);
60+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[6], cascade, maxUVOffset[cascade])*(1.0/16.0);
61+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[7], cascade, maxUVOffset[cascade])*(1.0/16.0);
62+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[8], cascade, maxUVOffset[cascade])*(1.0/16.0);
63+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[9], cascade, maxUVOffset[cascade])*(1.0/16.0);
64+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[10], cascade, maxUVOffset[cascade])*(1.0/16.0);
65+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[11], cascade, maxUVOffset[cascade])*(1.0/16.0);
66+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[12], cascade, maxUVOffset[cascade])*(1.0/16.0);
67+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[13], cascade, maxUVOffset[cascade])*(1.0/16.0);
68+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[14], cascade, maxUVOffset[cascade])*(1.0/16.0);
69+
sum += sampleShadowMap(shadow_map, shadowUV[cascade].xy, poissonDisc[15], cascade, maxUVOffset[cascade])*(1.0/16.0);
70+
return computeShadowFactor(shadowDepth, sum, 0.1);
71+
}
72+
73+
float getShadowValue(sampler2DArray shadow_map, float depth, float shadowDepth, vec4 shadowUV[4], float fardist,
74+
float middist, float neardist, float veryneardist)
75+
{
76+
// Valathil's Shadows
77+
int cascade = 4;
78+
cascade -= int(step(depth, fardist));
79+
cascade -= int(step(depth, middist));
80+
cascade -= int(step(depth, neardist));
81+
cascade -= int(step(depth, veryneardist));
82+
float cascade_start_dist[5];
83+
cascade_start_dist[0] = 0.0;
84+
cascade_start_dist[1] = veryneardist;
85+
cascade_start_dist[2] = neardist;
86+
cascade_start_dist[3] = middist;
87+
cascade_start_dist[4] = fardist;
88+
if(cascade > 3 || cascade < 0) return 1.0;
89+
float dist_threshold = (cascade_start_dist[cascade+1] - cascade_start_dist[cascade])*0.2;
90+
if(cascade_start_dist[cascade+1] - dist_threshold > depth)
91+
return samplePoissonPCF(shadow_map, shadowDepth, cascade, shadowUV);
92+
return mix(samplePoissonPCF(shadow_map, shadowDepth, cascade, shadowUV), samplePoissonPCF(shadow_map, shadowDepth, cascade+1, shadowUV),
93+
smoothstep(cascade_start_dist[cascade+1] - dist_threshold, cascade_start_dist[cascade+1], depth));
94+
}

0 commit comments

Comments
 (0)