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];
133138in vec4 fragShadowPos;
134139uniform 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
146142in vec4 fragPosition;
147143in vec3 fragNormal;
@@ -151,140 +147,13 @@ out vec4 fragOut1;
151147out vec4 fragOut2;
152148out 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-
246150vec3 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
288157void 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+
337206void 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);
0 commit comments