Skip to content

Commit 30404d4

Browse files
committed
Move shadow functions into separate shader file
1 parent c8e3e01 commit 30404d4

3 files changed

Lines changed: 99 additions & 95 deletions

File tree

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

Lines changed: 4 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2+
#include "shadows.sdr"
3+
14
#define MAX_LIGHTS 8
25
#define LT_DIRECTIONAL 0
36
#define LT_POINT 1
@@ -140,8 +143,6 @@ uniform sampler2DArray shadow_map;
140143
#define ENV_ALPHA_FACTOR 0.3
141144
#define GLOW_MAP_INTENSITY 1.5
142145
#define AMBIENT_LIGHT_BOOST 1.0
143-
#define VARIANCE_SHADOW_SCALE 1000000.0
144-
#define VARIANCE_SHADOW_SCALE_INV 1.0/VARIANCE_SHADOW_SCALE
145146
#define SRGB_GAMMA 2.2
146147
in vec4 fragPosition;
147148
in vec3 fragNormal;
@@ -151,98 +152,6 @@ out vec4 fragOut1;
151152
out vec4 fragOut2;
152153
out vec4 fragOut3;
153154

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-
246155
vec3 FresnelLazarovEnv(vec3 specColor, vec3 view, vec3 normal, float gloss)
247156
{
248157
// Fresnel for environment lighting
@@ -428,7 +337,7 @@ void main()
428337
#endif
429338
float shadow = 1.0;
430339
#ifdef FLAG_SHADOWS
431-
shadow = getShadowValue();
340+
shadow = getShadowValue(shadow_map, -fragPosition.z, fragShadowPos.z, fragShadowUV, fardist, middist, neardist, veryneardist);
432341
#endif
433342
#ifdef FLAG_LIGHT
434343
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+
}

code/source_groups.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ set(file_root_def_files_data_effects
187187
def_files/data/effects/post-v.sdr
188188
def_files/data/effects/shadowdebug-f.sdr
189189
def_files/data/effects/shadowdebug-v.sdr
190+
def_files/data/effects/shadows.sdr
190191
def_files/data/effects/tonemapping-f.sdr
191192
def_files/data/effects/video-f.sdr
192193
def_files/data/effects/video-v.sdr

0 commit comments

Comments
 (0)