|
@@ -356,6 +356,13 @@ void main() {
|
|
|
|
|
|
#VERSION_DEFINES
|
|
|
|
|
|
+/* Specialization Constants */
|
|
|
+
|
|
|
+layout(constant_id = 0) const bool sc_use_forward_gi = false;
|
|
|
+layout(constant_id = 1) const bool sc_use_light_projector = false;
|
|
|
+layout(constant_id = 2) const bool sc_use_light_soft_shadows = false;
|
|
|
+layout(constant_id = 3) const bool sc_use_directional_soft_shadows = false;
|
|
|
+
|
|
|
#include "scene_forward_clustered_inc.glsl"
|
|
|
|
|
|
/* Varyings */
|
|
@@ -450,12 +457,8 @@ layout(location = 0) out vec4 frag_color;
|
|
|
|
|
|
#include "scene_forward_lights_inc.glsl"
|
|
|
|
|
|
-#ifdef USE_FORWARD_GI
|
|
|
-
|
|
|
#include "scene_forward_gi_inc.glsl"
|
|
|
|
|
|
-#endif //USE_FORWARD_GI
|
|
|
-
|
|
|
#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
|
|
|
|
|
#ifndef MODE_RENDER_DEPTH
|
|
@@ -963,9 +966,9 @@ void main() {
|
|
|
ambient_light += textureLod(sampler2DArray(lightmap_textures[ofs], material_samplers[SAMPLER_LINEAR_CLAMP]), uvw, 0.0).rgb;
|
|
|
}
|
|
|
}
|
|
|
-#elif defined(USE_FORWARD_GI)
|
|
|
+#else
|
|
|
|
|
|
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_SDFGI)) { //has lightmap capture
|
|
|
+ if (sc_use_forward_gi && bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_SDFGI)) { //has lightmap capture
|
|
|
|
|
|
//make vertex orientation the world one, but still align to camera
|
|
|
vec3 cam_pos = mat3(scene_data.camera_matrix) * vertex;
|
|
@@ -1037,7 +1040,7 @@ void main() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_VOXEL_GI)) { // process voxel_gi_instances
|
|
|
+ if (sc_use_forward_gi && bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_VOXEL_GI)) { // process voxel_gi_instances
|
|
|
|
|
|
uint index1 = instances.data[instance_index].gi_offset & 0xFFFF;
|
|
|
vec3 ref_vec = normalize(reflect(normalize(vertex), normal));
|
|
@@ -1068,9 +1071,8 @@ void main() {
|
|
|
specular_light = spec_accum.rgb;
|
|
|
ambient_light = amb_accum.rgb;
|
|
|
}
|
|
|
-#else
|
|
|
|
|
|
- if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_GI_BUFFERS)) { //use GI buffers
|
|
|
+ if (!sc_use_forward_gi && bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_GI_BUFFERS)) { //use GI buffers
|
|
|
|
|
|
vec2 coord;
|
|
|
|
|
@@ -1101,7 +1103,7 @@ void main() {
|
|
|
ambient_light = mix(ambient_light, buffer_ambient.rgb, buffer_ambient.a);
|
|
|
specular_light = mix(specular_light, buffer_reflection.rgb, buffer_reflection.a);
|
|
|
}
|
|
|
-#endif
|
|
|
+#endif // !USE_LIGHTMAP
|
|
|
|
|
|
if (scene_data.ssao_enabled) {
|
|
|
float ssao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r;
|
|
@@ -1228,14 +1230,13 @@ void main() {
|
|
|
|
|
|
float shadow = 1.0;
|
|
|
|
|
|
-#ifdef USE_SOFT_SHADOWS
|
|
|
//version with soft shadows, more expensive
|
|
|
if (directional_lights.data[i].shadow_enabled) {
|
|
|
- float depth_z = -vertex.z;
|
|
|
+ if (sc_use_directional_soft_shadows && directional_lights.data[i].softshadow_angle > 0) {
|
|
|
+ float depth_z = -vertex.z;
|
|
|
|
|
|
- vec4 pssm_coord;
|
|
|
- vec3 shadow_color = vec3(0.0);
|
|
|
- vec3 light_dir = directional_lights.data[i].direction;
|
|
|
+ vec3 shadow_color = vec3(0.0);
|
|
|
+ vec3 light_dir = directional_lights.data[i].direction;
|
|
|
|
|
|
#define BIAS_FUNC(m_var, m_idx) \
|
|
|
m_var.xyz += light_dir * directional_lights.data[i].shadow_bias[m_idx]; \
|
|
@@ -1243,168 +1244,105 @@ void main() {
|
|
|
normal_bias -= light_dir * dot(light_dir, normal_bias); \
|
|
|
m_var.xyz += normal_bias;
|
|
|
|
|
|
- if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
+ uint blend_index = 0;
|
|
|
|
|
|
- BIAS_FUNC(v, 0)
|
|
|
+ if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix1 * v);
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
+ BIAS_FUNC(v, 0)
|
|
|
+
|
|
|
+ vec4 pssm_coord = (directional_lights.data[i].shadow_matrix1 * v);
|
|
|
+ pssm_coord /= pssm_coord.w;
|
|
|
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
float range_begin = directional_lights.data[i].shadow_range_begin.x;
|
|
|
float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
vec2 tex_scale = directional_lights.data[i].uv_scale1 * test_radius;
|
|
|
shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+ blend_index++;
|
|
|
}
|
|
|
|
|
|
- shadow_color = directional_lights.data[i].shadow_color1.rgb;
|
|
|
-
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
+ if (blend_index < 2 && depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
|
|
|
- BIAS_FUNC(v, 1)
|
|
|
+ BIAS_FUNC(v, 1)
|
|
|
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
+ vec4 pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);
|
|
|
+ pssm_coord /= pssm_coord.w;
|
|
|
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
float range_begin = directional_lights.data[i].shadow_range_begin.y;
|
|
|
float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
vec2 tex_scale = directional_lights.data[i].uv_scale2 * test_radius;
|
|
|
- shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+ float s = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
+
|
|
|
+ if (blend_index == 0) {
|
|
|
+ shadow = s;
|
|
|
+ } else {
|
|
|
+ //blend
|
|
|
+ float blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z);
|
|
|
+ shadow = mix(shadow, s, blend);
|
|
|
+ }
|
|
|
+
|
|
|
+ blend_index++;
|
|
|
}
|
|
|
|
|
|
- shadow_color = directional_lights.data[i].shadow_color2.rgb;
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
+ if (blend_index < 2 && depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
|
|
|
- BIAS_FUNC(v, 2)
|
|
|
+ BIAS_FUNC(v, 2)
|
|
|
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
+ vec4 pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);
|
|
|
+ pssm_coord /= pssm_coord.w;
|
|
|
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
float range_begin = directional_lights.data[i].shadow_range_begin.z;
|
|
|
float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
vec2 tex_scale = directional_lights.data[i].uv_scale3 * test_radius;
|
|
|
- shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
- }
|
|
|
-
|
|
|
- shadow_color = directional_lights.data[i].shadow_color3.rgb;
|
|
|
+ float s = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
|
|
|
- } else {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
-
|
|
|
- BIAS_FUNC(v, 3)
|
|
|
-
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
+ if (blend_index == 0) {
|
|
|
+ shadow = s;
|
|
|
+ } else {
|
|
|
+ //blend
|
|
|
+ float blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z);
|
|
|
+ shadow = mix(shadow, s, blend);
|
|
|
+ }
|
|
|
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
- float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
- float range_begin = directional_lights.data[i].shadow_range_begin.w;
|
|
|
- float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
- vec2 tex_scale = directional_lights.data[i].uv_scale4 * test_radius;
|
|
|
- shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+ blend_index++;
|
|
|
}
|
|
|
|
|
|
- shadow_color = directional_lights.data[i].shadow_color4.rgb;
|
|
|
- }
|
|
|
-
|
|
|
- if (directional_lights.data[i].blend_splits) {
|
|
|
- vec3 shadow_color_blend = vec3(0.0);
|
|
|
- float pssm_blend;
|
|
|
- float shadow2;
|
|
|
-
|
|
|
- if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
+ if (blend_index < 2) {
|
|
|
vec4 v = vec4(vertex, 1.0);
|
|
|
- BIAS_FUNC(v, 1)
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
- float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
- float range_begin = directional_lights.data[i].shadow_range_begin.y;
|
|
|
- float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
- vec2 tex_scale = directional_lights.data[i].uv_scale2 * test_radius;
|
|
|
- shadow2 = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
- } else {
|
|
|
- shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
- }
|
|
|
+ BIAS_FUNC(v, 3)
|
|
|
|
|
|
- pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z);
|
|
|
- shadow_color_blend = directional_lights.data[i].shadow_color2.rgb;
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
- BIAS_FUNC(v, 2)
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);
|
|
|
+ vec4 pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);
|
|
|
pssm_coord /= pssm_coord.w;
|
|
|
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
- float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
- float range_begin = directional_lights.data[i].shadow_range_begin.z;
|
|
|
- float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
- vec2 tex_scale = directional_lights.data[i].uv_scale3 * test_radius;
|
|
|
- shadow2 = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
- } else {
|
|
|
- shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
- }
|
|
|
-
|
|
|
- pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z);
|
|
|
+ float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
+ float range_begin = directional_lights.data[i].shadow_range_begin.w;
|
|
|
+ float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
+ vec2 tex_scale = directional_lights.data[i].uv_scale4 * test_radius;
|
|
|
+ float s = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
|
|
|
- shadow_color_blend = directional_lights.data[i].shadow_color3.rgb;
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
- BIAS_FUNC(v, 3)
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
- if (directional_lights.data[i].softshadow_angle > 0) {
|
|
|
- float range_pos = dot(directional_lights.data[i].direction, v.xyz);
|
|
|
- float range_begin = directional_lights.data[i].shadow_range_begin.w;
|
|
|
- float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle;
|
|
|
- vec2 tex_scale = directional_lights.data[i].uv_scale4 * test_radius;
|
|
|
- shadow2 = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale);
|
|
|
+ if (blend_index == 0) {
|
|
|
+ shadow = s;
|
|
|
} else {
|
|
|
- shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+ //blend
|
|
|
+ float blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z);
|
|
|
+ shadow = mix(shadow, s, blend);
|
|
|
}
|
|
|
-
|
|
|
- pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z);
|
|
|
- shadow_color_blend = directional_lights.data[i].shadow_color4.rgb;
|
|
|
- } else {
|
|
|
- pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached)
|
|
|
}
|
|
|
|
|
|
- pssm_blend = sqrt(pssm_blend);
|
|
|
-
|
|
|
- shadow = mix(shadow, shadow2, pssm_blend);
|
|
|
- shadow_color = mix(shadow_color, shadow_color_blend, pssm_blend);
|
|
|
- }
|
|
|
-
|
|
|
- shadow = mix(shadow, 1.0, smoothstep(directional_lights.data[i].fade_from, directional_lights.data[i].fade_to, vertex.z)); //done with negative values for performance
|
|
|
-
|
|
|
#undef BIAS_FUNC
|
|
|
- }
|
|
|
-#else
|
|
|
- // Soft shadow disabled version
|
|
|
+ } else { //no soft shadows
|
|
|
|
|
|
- if (directional_lights.data[i].shadow_enabled) {
|
|
|
- float depth_z = -vertex.z;
|
|
|
+ float depth_z = -vertex.z;
|
|
|
|
|
|
- vec4 pssm_coord;
|
|
|
- vec3 light_dir = directional_lights.data[i].direction;
|
|
|
- vec3 base_normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(light_dir, -normalize(normal_interp))));
|
|
|
+ vec4 pssm_coord;
|
|
|
+ vec3 light_dir = directional_lights.data[i].direction;
|
|
|
+ vec3 base_normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(light_dir, -normalize(normal_interp))));
|
|
|
|
|
|
#define BIAS_FUNC(m_var, m_idx) \
|
|
|
m_var.xyz += light_dir * directional_lights.data[i].shadow_bias[m_idx]; \
|
|
@@ -1412,70 +1350,70 @@ void main() {
|
|
|
normal_bias -= light_dir * dot(light_dir, normal_bias); \
|
|
|
m_var.xyz += normal_bias;
|
|
|
|
|
|
- if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
-
|
|
|
- BIAS_FUNC(v, 0)
|
|
|
-
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix1 * v);
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
-
|
|
|
- BIAS_FUNC(v, 1)
|
|
|
-
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
-
|
|
|
- BIAS_FUNC(v, 2)
|
|
|
-
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);
|
|
|
-
|
|
|
- } else {
|
|
|
- vec4 v = vec4(vertex, 1.0);
|
|
|
-
|
|
|
- BIAS_FUNC(v, 3)
|
|
|
-
|
|
|
- pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);
|
|
|
- }
|
|
|
-
|
|
|
- pssm_coord /= pssm_coord.w;
|
|
|
-
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+ if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
|
|
|
- if (directional_lights.data[i].blend_splits) {
|
|
|
- float pssm_blend;
|
|
|
+ BIAS_FUNC(v, 0)
|
|
|
|
|
|
- if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
+ pssm_coord = (directional_lights.data[i].shadow_matrix1 * v);
|
|
|
+ } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
vec4 v = vec4(vertex, 1.0);
|
|
|
+
|
|
|
BIAS_FUNC(v, 1)
|
|
|
+
|
|
|
pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);
|
|
|
- pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z);
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
+ } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
vec4 v = vec4(vertex, 1.0);
|
|
|
+
|
|
|
BIAS_FUNC(v, 2)
|
|
|
+
|
|
|
pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);
|
|
|
- pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z);
|
|
|
- } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
+
|
|
|
+ } else {
|
|
|
vec4 v = vec4(vertex, 1.0);
|
|
|
+
|
|
|
BIAS_FUNC(v, 3)
|
|
|
+
|
|
|
pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);
|
|
|
- pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z);
|
|
|
- } else {
|
|
|
- pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached)
|
|
|
}
|
|
|
|
|
|
pssm_coord /= pssm_coord.w;
|
|
|
|
|
|
- float shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
- shadow = mix(shadow, shadow2, pssm_blend);
|
|
|
- }
|
|
|
+ shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+
|
|
|
+ if (directional_lights.data[i].blend_splits) {
|
|
|
+ float pssm_blend;
|
|
|
+
|
|
|
+ if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
+ BIAS_FUNC(v, 1)
|
|
|
+ pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);
|
|
|
+ pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z);
|
|
|
+ } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
+ BIAS_FUNC(v, 2)
|
|
|
+ pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);
|
|
|
+ pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z);
|
|
|
+ } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {
|
|
|
+ vec4 v = vec4(vertex, 1.0);
|
|
|
+ BIAS_FUNC(v, 3)
|
|
|
+ pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);
|
|
|
+ pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z);
|
|
|
+ } else {
|
|
|
+ pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached)
|
|
|
+ }
|
|
|
+
|
|
|
+ pssm_coord /= pssm_coord.w;
|
|
|
+
|
|
|
+ float shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord);
|
|
|
+ shadow = mix(shadow, shadow2, pssm_blend);
|
|
|
+ }
|
|
|
|
|
|
- shadow = mix(shadow, 1.0, smoothstep(directional_lights.data[i].fade_from, directional_lights.data[i].fade_to, vertex.z)); //done with negative values for performance
|
|
|
+ shadow = mix(shadow, 1.0, smoothstep(directional_lights.data[i].fade_from, directional_lights.data[i].fade_to, vertex.z)); //done with negative values for performance
|
|
|
|
|
|
#undef BIAS_FUNC
|
|
|
- }
|
|
|
-#endif
|
|
|
+ }
|
|
|
+ } // shadows
|
|
|
|
|
|
if (i < 4) {
|
|
|
shadow0 |= uint(clamp(shadow * 255.0, 0.0, 255.0)) << (i * 8);
|
|
@@ -1554,7 +1492,9 @@ void main() {
|
|
|
|
|
|
blur_shadow(shadow);
|
|
|
|
|
|
- light_compute(normal, directional_lights.data[i].direction, normalize(view), directional_lights.data[i].color * directional_lights.data[i].energy, shadow, f0, orms, 1.0,
|
|
|
+ float size_A = sc_use_light_soft_shadows ? directional_lights.data[i].size : 0.0;
|
|
|
+
|
|
|
+ light_compute(normal, directional_lights.data[i].direction, normalize(view), size_A, directional_lights.data[i].color * directional_lights.data[i].energy, shadow, f0, orms, 1.0,
|
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
|
backlight,
|
|
|
#endif
|
|
@@ -1573,9 +1513,6 @@ void main() {
|
|
|
#ifdef LIGHT_ANISOTROPY_USED
|
|
|
binormal, tangent, anisotropy,
|
|
|
#endif
|
|
|
-#ifdef USE_SOFT_SHADOW
|
|
|
- directional_lights.data[i].size,
|
|
|
-#endif
|
|
|
#ifdef USE_SHADOW_TO_OPACITY
|
|
|
alpha,
|
|
|
#endif
|