Skip to content

Commit 25eebd9

Browse files
authored
Shadow Overhaul (scp-fs2open#7529)
* Extract shadows into own shader and render pass # Conflicts: # code/def_files/data/effects/main-g.sdr * Consolidate render queue code * More cleanup * Fix missing clear of shadow buffer inter frame * Request capability for viewport layer rendering * instanced shadows * Fix issues * Switch to PCF+PCSS and proper textures for it * Smooth PCSS toggle * Fix for windows * Fix OGL error * Cleanup of old flag * Expose shadow smoothness * Fix missing uniform * Make number of shadow cascades dynamic * Progress on cockpit shadow integration * Wrangle Cockpit and show-ship shadows into correct behaviour * Cleanup * make player ship shadow table options more intuitive * Cleanup * Only read from correct set of shadow maps, also stretch first main-scene map to 0 * Remove now non-necessary validation * Make shadow cascade buffer more typesafe and less wasteful * Don't allocate cockpit cascades if not used * Cleanup * Final fixes * Fix Warnings * clang tidy * Fix missing fallback for shader precaching * That weird FOV multiplier that always ruins your day * Avoid shadow geometry artifacts by using hardware depth clamping * Correctly handle shadow cascade overrides with hardcoded length * GCC9 and its sad state of C++17 support. * Address Feedback # Conflicts: # code/graphics/shadows.cpp
1 parent cc63bfa commit 25eebd9

49 files changed

Lines changed: 1558 additions & 747 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,31 @@ uniform sampler2D ColorBuffer;
1010
uniform sampler2D NormalBuffer;
1111
uniform sampler2D PositionBuffer;
1212
uniform sampler2D SpecBuffer;
13-
uniform sampler2DArray shadow_map;
13+
uniform sampler2DArrayShadow shadow_map;
1414

1515
#ifdef ENV_MAP
1616
uniform samplerCube sEnvmap;
1717
uniform samplerCube sIrrmap;
1818
#endif
1919

2020
layout (std140) uniform globalDeferredData {
21-
mat4 shadow_mv_matrix;
22-
mat4 shadow_proj_matrix[4];
23-
2421
mat4 inv_view_matrix;
2522

26-
float veryneardist;
27-
float neardist;
28-
float middist;
29-
float fardist;
30-
3123
float invScreenWidth;
3224
float invScreenHeight;
33-
3425
float nearPlane;
3526
};
3627

28+
layout (std140) uniform shadowCascadeParams {
29+
int cascade_offset;
30+
int cascade_count;
31+
32+
mat4 shadow_mv_matrix;
33+
mat4 shadow_proj_matrix[NUM_SHADOW_CASCADES];
34+
vec4 cascade_distances[(NUM_SHADOW_CASCADES + 4 - 1) / 4];
35+
vec4 smoothness_factors[(NUM_SHADOW_CASCADES + 4 - 1) / 4];
36+
};
37+
3738
layout (std140) uniform matrixData {
3839
mat4 modelViewMatrix;
3940
mat4 projMatrix;
@@ -259,14 +260,12 @@ void main()
259260

260261
if (enable_shadows) {
261262
vec4 fragShadowPos = shadow_mv_matrix * inv_view_matrix * vec4(position, 1.0);
262-
vec4 fragShadowUV[4];
263-
fragShadowUV[0] = transformToShadowMap(shadow_proj_matrix[0], 0, fragShadowPos);
264-
fragShadowUV[1] = transformToShadowMap(shadow_proj_matrix[1], 1, fragShadowPos);
265-
fragShadowUV[2] = transformToShadowMap(shadow_proj_matrix[2], 2, fragShadowPos);
266-
fragShadowUV[3] = transformToShadowMap(shadow_proj_matrix[3], 3, fragShadowPos);
267-
268-
attenuation *= getShadowValue(shadow_map, -position.z, fragShadowPos.z, fragShadowUV, fardist, middist,
269-
neardist, veryneardist);
263+
vec4 fragShadowUV[NUM_SHADOW_CASCADES];
264+
for (int i = 0; i < NUM_SHADOW_CASCADES; i++) {
265+
fragShadowUV[i] = transformToShadowMap(shadow_proj_matrix[i], i, fragShadowPos);
266+
}
267+
268+
attenuation *= getShadowValue(shadow_map, -position.z, fragShadowUV, cascade_distances, smoothness_factors, cascade_offset, cascade_count);
270269
}
271270

272271
vec3 halfVec = normalize(lightDir + eyeDir);

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

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ layout (std140) uniform modelData {
3131
mat4 viewMatrix;
3232
mat4 projMatrix;
3333
mat4 textureMatrix;
34-
mat4 shadow_mv_matrix;
35-
mat4 shadow_proj_matrix[4];
3634

3735
vec4 color;
3836

@@ -50,7 +48,6 @@ layout (std140) uniform modelData {
5048
int n_lights;
5149
float defaultGloss;
5250

53-
//EXCLUSIVELY used for non-deferred rendering
5451
vec3 ambientFactor;
5552
int desaturate;
5653

@@ -66,7 +63,6 @@ layout (std140) uniform modelData {
6663
int effect_num;
6764
int sBasemapIndex;
6865

69-
7066
vec4 fogColor;
7167

7268
vec3 base_color;
@@ -80,11 +76,6 @@ layout (std140) uniform modelData {
8076
float znear;
8177
float zfar;
8278

83-
float veryneardist;
84-
float neardist;
85-
float middist;
86-
float fardist;
87-
8879
int sGlowmapIndex;
8980
int sSpecmapIndex;
9081
int sNormalmapIndex;
@@ -95,6 +86,16 @@ layout (std140) uniform modelData {
9586
int flags;
9687
};
9788

89+
layout (std140) uniform shadowCascadeParams {
90+
int cascade_offset;
91+
int cascade_count;
92+
93+
mat4 shadow_mv_matrix;
94+
mat4 shadow_proj_matrix[NUM_SHADOW_CASCADES];
95+
vec4 cascade_distances[(NUM_SHADOW_CASCADES + 4 - 1) / 4];
96+
vec4 smoothness_factors[(NUM_SHADOW_CASCADES + 4 - 1) / 4];
97+
};
98+
9899
in VertexOutput {
99100
mat3 tangentMatrix;
100101

@@ -107,7 +108,7 @@ in VertexOutput {
107108
vec4 texCoord;
108109

109110
#prereplace IF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
110-
vec4 shadowUV[4];
111+
vec4 shadowUV[NUM_SHADOW_CASCADES];
111112
vec4 shadowPos;
112113
#prereplace ENDIF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
113114
} vertIn;
@@ -132,17 +133,15 @@ uniform sampler2D sFramebuffer;
132133
uniform sampler2DArray sMiscmap;
133134
#prereplace ENDIF_FLAG_COMPILED MODEL_SDR_FLAG_MISC
134135
#prereplace IF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
135-
uniform sampler2DArray shadow_map;
136+
uniform sampler2DArrayShadow shadow_map;
136137
#prereplace ENDIF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
137138

138139
out vec4 fragOut0;
139140

140-
#ifndef MODEL_SDR_FLAG_SHADOW_MAP
141141
out vec4 fragOut1;
142142
out vec4 fragOut2;
143143
out vec4 fragOut3;
144144
out vec4 fragOut4;
145-
#endif
146145

147146
vec3 FresnelLazarovEnv(vec3 specColor, vec3 view, vec3 normal, float gloss)
148147
{
@@ -203,12 +202,6 @@ vec3 CalculateLighting(vec3 normal, vec3 diffuseMaterial, vec3 specularMaterial,
203202

204203
void main()
205204
{
206-
#ifdef MODEL_SDR_FLAG_SHADOW_MAP
207-
// need depth and depth squared for variance shadow maps
208-
fragOut0 = vec4(vertIn.position.z, vertIn.position.z * vertIn.position.z * VARIANCE_SHADOW_SCALE_INV, 0.0, 1.0);
209-
210-
return;
211-
#else
212205
vec3 eyeDir = vec3(normalize(-vertIn.position).xyz);
213206
vec2 texCoord = vertIn.texCoord.xy;
214207

@@ -337,7 +330,7 @@ void main()
337330
#prereplace IF_FLAG MODEL_SDR_FLAG_LIGHT
338331
float shadow = 1.0;
339332
#prereplace IF_FLAG MODEL_SDR_FLAG_SHADOWS
340-
shadow = getShadowValue(shadow_map, -vertIn.position.z, vertIn.shadowPos.z, vertIn.shadowUV, fardist, middist, neardist, veryneardist);
333+
shadow = getShadowValue(shadow_map, -vertIn.position.z, vertIn.shadowUV, cascade_distances, smoothness_factors, cascade_offset, cascade_count);
341334
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_SHADOWS
342335
baseColor.rgb = CalculateLighting(normal, baseColor.rgb, specColor.rgb, glossData, fresnelFactor, shadow, aoFactors.x);
343336
#prereplace ELSE_FLAG //MODEL_SDR_FLAG_LIGHT
@@ -435,6 +428,4 @@ void main()
435428
fragOut3 = vec4(specColor.rgb, fresnelFactor);
436429
fragOut4 = emissiveColor;
437430
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_DEFERRED
438-
439-
#endif
440431
}

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

Lines changed: 6 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,6 @@
77
layout (triangles) in;
88
// For every triangle line we generate 2 triangles which can be done with 4 vertices so in total we will need 12 vertices
99
layout (triangle_strip, max_vertices = 12) out;
10-
#elif defined(MODEL_SDR_FLAG_SHADOW_MAP)
11-
layout (triangles) in;
12-
layout (triangle_strip, max_vertices = 3) out;
13-
#endif
14-
15-
#ifdef MODEL_SDR_FLAG_SHADOW_MAP
16-
#ifdef GL_ARB_gpu_shader5
17-
layout(invocations = 4) in;
18-
#endif
1910
#endif
2011

2112
#define MAX_LIGHTS 8
@@ -37,8 +28,6 @@ layout (std140) uniform modelData {
3728
mat4 viewMatrix;
3829
mat4 projMatrix;
3930
mat4 textureMatrix;
40-
mat4 shadow_mv_matrix;
41-
mat4 shadow_proj_matrix[4];
4231

4332
vec4 color;
4433

@@ -84,11 +73,6 @@ layout (std140) uniform modelData {
8473
float znear;
8574
float zfar;
8675

87-
float veryneardist;
88-
float neardist;
89-
float middist;
90-
float fardist;
91-
9276
int sGlowmapIndex;
9377

9478
int sSpecmapIndex;
@@ -108,19 +92,12 @@ in VertexOutput {
10892
float fogDist;
10993
#prereplace ENDIF_FLAG_COMPILED MODEL_SDR_FLAG_FOG
11094

111-
#ifdef MODEL_SDR_FLAG_SHADOW_MAP
112-
#if !defined(GL_ARB_gpu_shader5)
113-
float instance;
114-
#endif
115-
float clipModel;
116-
#else
11795
vec4 position;
118-
#endif
11996
vec3 normal;
12097
vec4 texCoord;
12198

12299
#prereplace IF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
123-
vec4 shadowUV[4];
100+
vec4 shadowUV[NUM_SHADOW_CASCADES];
124101
vec4 shadowPos;
125102
#prereplace ENDIF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
126103
} vertIn[];
@@ -137,62 +114,12 @@ out VertexOutput {
137114
vec4 texCoord;
138115

139116
#prereplace IF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
140-
vec4 shadowUV[4];
117+
vec4 shadowUV[NUM_SHADOW_CASCADES];
141118
vec4 shadowPos;
142119
#prereplace ENDIF_FLAG_COMPILED MODEL_SDR_FLAG_SHADOWS
143120
} vertOut;
144121

145-
#ifdef MODEL_SDR_FLAG_SHADOW_MAP
146-
void main(void)
147-
{
148-
#ifdef GL_ARB_gpu_shader5
149-
int instanceID = gl_InvocationID;
150-
#else
151-
int instanceID = int(vertIn[0].instance);
152-
#endif
153-
for(int vert = 0; vert < gl_in.length(); vert++)
154-
{
155-
#prereplace IF_FLAG MODEL_SDR_FLAG_TRANSFORM
156-
if (vertIn[vert].clipModel > 0.9) {
157-
// If the model was clipped in the vertex shader then we do not apply the shadow projection matrix here
158-
gl_Position = gl_in[vert].gl_Position;
159-
} else {
160-
gl_Position = shadow_proj_matrix[instanceID] * gl_in[vert].gl_Position;
161-
}
162-
#prereplace ELSE_FLAG //MODEL_SDR_FLAG_TRANSFORM
163-
gl_Position = shadow_proj_matrix[instanceID] * gl_in[vert].gl_Position;
164-
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_TRANSFORM
165-
166-
vertOut.position = gl_in[vert].gl_Position;
167-
vertOut.normal = vertIn[vert].normal;
168-
vertOut.texCoord = vertIn[vert].texCoord;
169-
170-
gl_Layer = instanceID;
171-
172-
#prereplace IF_FLAG MODEL_SDR_FLAG_NORMAL
173-
vertOut.tangentMatrix = vertIn[vert].tangentMatrix;
174-
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_NORMAL
175-
176-
#prereplace IF_FLAG MODEL_SDR_FLAG_FOG
177-
vertOut.fogDist = vertIn[vert].fogDist;
178-
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_FOG
179-
180-
#prereplace IF_FLAG MODEL_SDR_FLAG_SHADOWS
181-
vertOut.shadowUV[0] = vertIn[vert].shadowUV[0];
182-
vertOut.shadowUV[1] = vertIn[vert].shadowUV[1];
183-
vertOut.shadowUV[2] = vertIn[vert].shadowUV[2];
184-
vertOut.shadowUV[3] = vertIn[vert].shadowUV[3];
185-
vertOut.shadowPos = vertIn[vert].shadowPos;
186-
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_SHADOWS
187-
188-
if (use_clip_plane) {
189-
gl_ClipDistance[0] = gl_in[vert].gl_ClipDistance[0];
190-
}
191-
EmitVertex();
192-
}
193-
EndPrimitive();
194-
}
195-
#elif defined(MODEL_SDR_FLAG_THICK_OUTLINES)
122+
#ifdef MODEL_SDR_FLAG_THICK_OUTLINES
196123
const vec2 pixelOffsetDir[4] = vec2[](
197124
vec2(0.0, 1.0),
198125
vec2(1.0, 1.0),
@@ -232,10 +159,9 @@ out VertexOutput {
232159
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_FOG
233160

234161
#prereplace IF_FLAG MODEL_SDR_FLAG_SHADOWS
235-
vertOut.shadowUV[0] = vertIn[vert].shadowUV[0];
236-
vertOut.shadowUV[1] = vertIn[vert].shadowUV[1];
237-
vertOut.shadowUV[2] = vertIn[vert].shadowUV[2];
238-
vertOut.shadowUV[3] = vertIn[vert].shadowUV[3];
162+
for (int s = 0; s < NUM_SHADOW_CASCADES; s++) {
163+
vertOut.shadowUV[s] = vertIn[vert].shadowUV[s];
164+
}
239165
vertOut.shadowPos = vertIn[vert].shadowPos;
240166
#prereplace ENDIF_FLAG //MODEL_SDR_FLAG_SHADOWS
241167

0 commit comments

Comments
 (0)