|
@@ -105,7 +105,16 @@ layout(location = 4) mediump out vec2 uv2_interp;
|
|
|
layout(location = 5) mediump out vec3 tangent_interp;
|
|
|
layout(location = 6) mediump out vec3 binormal_interp;
|
|
|
#endif
|
|
|
+#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) && defined(USE_VERTEX_LIGHTING)
|
|
|
+layout(location = 7) highp out vec4 diffuse_light_interp;
|
|
|
+layout(location = 8) highp out vec4 specular_light_interp;
|
|
|
|
|
|
+layout(constant_id = 9) const bool sc_disable_omni_lights = false;
|
|
|
+layout(constant_id = 10) const bool sc_disable_spot_lights = false;
|
|
|
+layout(constant_id = 12) const bool sc_disable_directional_lights = false;
|
|
|
+
|
|
|
+#include "../scene_forward_vertex_lights_inc.glsl"
|
|
|
+#endif // !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) && defined(USE_VERTEX_LIGHTING)
|
|
|
#ifdef MATERIAL_UNIFORMS_USED
|
|
|
/* clang-format off */
|
|
|
layout(set = MATERIAL_UNIFORM_SET, binding = 0, std140) uniform MaterialUniforms {
|
|
@@ -185,6 +194,7 @@ void main() {
|
|
|
|
|
|
mat4 model_matrix = instances.data[draw_call.instance_index].transform;
|
|
|
mat4 inv_view_matrix = scene_data.inv_view_matrix;
|
|
|
+
|
|
|
#ifdef USE_DOUBLE_PRECISION
|
|
|
vec3 model_precision = vec3(model_matrix[0][3], model_matrix[1][3], model_matrix[2][3]);
|
|
|
model_matrix[0][3] = 0.0;
|
|
@@ -448,6 +458,107 @@ void main() {
|
|
|
binormal_interp = binormal;
|
|
|
#endif
|
|
|
|
|
|
+// VERTEX LIGHTING
|
|
|
+#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) && defined(USE_VERTEX_LIGHTING)
|
|
|
+#ifdef USE_MULTIVIEW
|
|
|
+ vec3 view = -normalize(vertex_interp - eye_offset);
|
|
|
+#else
|
|
|
+ vec3 view = -normalize(vertex_interp);
|
|
|
+#endif
|
|
|
+
|
|
|
+ diffuse_light_interp = vec4(0.0);
|
|
|
+ specular_light_interp = vec4(0.0);
|
|
|
+
|
|
|
+ if (!sc_disable_omni_lights) {
|
|
|
+ uint light_indices = instances.data[draw_call.instance_index].omni_lights.x;
|
|
|
+ for (uint i = 0; i < 8; i++) {
|
|
|
+ uint light_index = light_indices & 0xFF;
|
|
|
+ if (i == 3) {
|
|
|
+ light_indices = instances.data[draw_call.instance_index].omni_lights.y;
|
|
|
+ } else {
|
|
|
+ light_indices = light_indices >> 8;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (light_index == 0xFF) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ light_process_omni_vertex(light_index, vertex, view, normal, roughness,
|
|
|
+ diffuse_light_interp.rgb, specular_light_interp.rgb);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!sc_disable_spot_lights) {
|
|
|
+ uint light_indices = instances.data[draw_call.instance_index].spot_lights.x;
|
|
|
+ for (uint i = 0; i < 8; i++) {
|
|
|
+ uint light_index = light_indices & 0xFF;
|
|
|
+ if (i == 3) {
|
|
|
+ light_indices = instances.data[draw_call.instance_index].spot_lights.y;
|
|
|
+ } else {
|
|
|
+ light_indices = light_indices >> 8;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (light_index == 0xFF) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ light_process_spot_vertex(light_index, vertex, view, normal, roughness,
|
|
|
+ diffuse_light_interp.rgb, specular_light_interp.rgb);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!sc_disable_directional_lights) {
|
|
|
+ // We process the first directional light separately as it may have shadows.
|
|
|
+ vec3 directional_diffuse = vec3(0.0);
|
|
|
+ vec3 directional_specular = vec3(0.0);
|
|
|
+
|
|
|
+ for (uint i = 0; i < scene_data.directional_light_count; i++) {
|
|
|
+ if (!bool(directional_lights.data[i].mask & instances.data[draw_call.instance_index].layer_mask)) {
|
|
|
+ continue; // Not masked, skip.
|
|
|
+ }
|
|
|
+
|
|
|
+ if (directional_lights.data[i].bake_mode == LIGHT_BAKE_STATIC && bool(instances.data[draw_call.instance_index].flags & INSTANCE_FLAGS_USE_LIGHTMAP)) {
|
|
|
+ continue; // Statically baked light and object uses lightmap, skip.
|
|
|
+ }
|
|
|
+ if (i == 0) {
|
|
|
+ light_compute_vertex(normal, directional_lights.data[0].direction, view,
|
|
|
+ directional_lights.data[0].color * directional_lights.data[0].energy,
|
|
|
+ true, roughness,
|
|
|
+ directional_diffuse,
|
|
|
+ directional_specular);
|
|
|
+ } else {
|
|
|
+ light_compute_vertex(normal, directional_lights.data[i].direction, view,
|
|
|
+ directional_lights.data[i].color * directional_lights.data[i].energy,
|
|
|
+ true, roughness,
|
|
|
+ diffuse_light_interp.rgb,
|
|
|
+ specular_light_interp.rgb);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Calculate the contribution from the shadowed light so we can scale the shadows accordingly.
|
|
|
+ float diff_avg = dot(diffuse_light_interp.rgb, vec3(0.33333));
|
|
|
+ float diff_dir_avg = dot(directional_diffuse, vec3(0.33333));
|
|
|
+ if (diff_avg > 0.0) {
|
|
|
+ diffuse_light_interp.a = diff_dir_avg / (diff_avg + diff_dir_avg);
|
|
|
+ } else {
|
|
|
+ diffuse_light_interp.a = 1.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ diffuse_light_interp.rgb += directional_diffuse;
|
|
|
+
|
|
|
+ float spec_avg = dot(specular_light_interp.rgb, vec3(0.33333));
|
|
|
+ float spec_dir_avg = dot(directional_specular, vec3(0.33333));
|
|
|
+ if (spec_avg > 0.0) {
|
|
|
+ specular_light_interp.a = spec_dir_avg / (spec_avg + spec_dir_avg);
|
|
|
+ } else {
|
|
|
+ specular_light_interp.a = 1.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ specular_light_interp.rgb += directional_specular;
|
|
|
+ }
|
|
|
+
|
|
|
+#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) && defined(USE_VERTEX_LIGHTING)
|
|
|
+
|
|
|
#ifdef MODE_RENDER_DEPTH
|
|
|
|
|
|
#ifdef MODE_DUAL_PARABOLOID
|
|
@@ -564,6 +675,11 @@ layout(location = 5) mediump in vec3 tangent_interp;
|
|
|
layout(location = 6) mediump in vec3 binormal_interp;
|
|
|
#endif
|
|
|
|
|
|
+#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) && defined(USE_VERTEX_LIGHTING)
|
|
|
+layout(location = 7) highp in vec4 diffuse_light_interp;
|
|
|
+layout(location = 8) highp in vec4 specular_light_interp;
|
|
|
+#endif
|
|
|
+
|
|
|
#ifdef MODE_DUAL_PARABOLOID
|
|
|
|
|
|
layout(location = 9) highp in float dp_clip;
|
|
@@ -709,7 +825,7 @@ layout(location = 0) out mediump vec4 frag_color;
|
|
|
|
|
|
#include "../scene_forward_aa_inc.glsl"
|
|
|
|
|
|
-#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
|
|
+#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) // && !defined(USE_VERTEX_LIGHTING)
|
|
|
|
|
|
// Default to SPECULAR_SCHLICK_GGX.
|
|
|
#if !defined(SPECULAR_DISABLED) && !defined(SPECULAR_SCHLICK_GGX) && !defined(SPECULAR_TOON)
|
|
@@ -718,7 +834,7 @@ layout(location = 0) out mediump vec4 frag_color;
|
|
|
|
|
|
#include "../scene_forward_lights_inc.glsl"
|
|
|
|
|
|
-#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
|
|
+#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED) && !defined(USE_VERTEX_LIGHTING)
|
|
|
|
|
|
#ifndef MODE_RENDER_DEPTH
|
|
|
|
|
@@ -1401,6 +1517,10 @@ void main() {
|
|
|
|
|
|
// LIGHTING
|
|
|
#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
|
|
+#ifdef USE_VERTEX_LIGHTING
|
|
|
+ diffuse_light += diffuse_light_interp.rgb;
|
|
|
+ specular_light += specular_light_interp.rgb * f0;
|
|
|
+#endif
|
|
|
|
|
|
if (!sc_disable_directional_lights) { //directional light
|
|
|
#ifndef SHADOWS_DISABLED
|
|
@@ -1408,10 +1528,12 @@ void main() {
|
|
|
uint shadow0 = 0;
|
|
|
uint shadow1 = 0;
|
|
|
|
|
|
- for (uint i = 0; i < 8; i++) {
|
|
|
- if (i >= scene_data.directional_light_count) {
|
|
|
- break;
|
|
|
- }
|
|
|
+#ifdef USE_VERTEX_LIGHTING
|
|
|
+ // Only process the first light's shadow for vertex lighting.
|
|
|
+ for (uint i = 0; i < 1; i++) {
|
|
|
+#else
|
|
|
+ for (uint i = 0; i < scene_data.directional_light_count; i++) {
|
|
|
+#endif
|
|
|
|
|
|
if (!bool(directional_lights.data[i].mask & instances.data[draw_call.instance_index].layer_mask)) {
|
|
|
continue; //not masked
|
|
@@ -1419,164 +1541,6 @@ void main() {
|
|
|
|
|
|
float shadow = 1.0;
|
|
|
|
|
|
- // Directional light shadow code is basically the same as forward clustered at this point in time minus `LIGHT_TRANSMITTANCE_USED` support.
|
|
|
- // Not sure if there is a reason to change this seeing directional lights are part of our global data
|
|
|
- // Should think about whether we may want to move this code into an include file or function??
|
|
|
-
|
|
|
-#ifdef USE_SOFT_SHADOWS
|
|
|
- //version with soft shadows, more expensive
|
|
|
- if (directional_lights.data[i].shadow_opacity > 0.001) {
|
|
|
- float depth_z = -vertex.z;
|
|
|
-
|
|
|
- vec4 pssm_coord;
|
|
|
- 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]; \
|
|
|
- vec3 normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(light_dir, -normalize(normal_interp)))) * directional_lights.data[i].shadow_normal_bias[m_idx]; \
|
|
|
- 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);
|
|
|
- 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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
- } 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_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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
- } 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_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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
- } 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 (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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (directional_lights.data[i].blend_splits) {
|
|
|
- float pssm_blend;
|
|
|
- float shadow2;
|
|
|
-
|
|
|
- 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_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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
-
|
|
|
- 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_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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
-
|
|
|
- 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_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, scene_data.taa_frame_count);
|
|
|
- } else {
|
|
|
- shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord, scene_data.taa_frame_count);
|
|
|
- }
|
|
|
-
|
|
|
- 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_blend = sqrt(pssm_blend);
|
|
|
-
|
|
|
- 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
|
|
|
-
|
|
|
-#undef BIAS_FUNC
|
|
|
- }
|
|
|
-#else
|
|
|
- // Soft shadow disabled version
|
|
|
-
|
|
|
if (directional_lights.data[i].shadow_opacity > 0.001) {
|
|
|
float depth_z = -vertex.z;
|
|
|
|
|
@@ -1667,6 +1631,10 @@ void main() {
|
|
|
|
|
|
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
|
|
|
|
|
|
+#ifdef USE_VERTEX_LIGHTING
|
|
|
+ diffuse_light *= mix(1.0, shadow, diffuse_light_interp.a);
|
|
|
+ specular_light *= mix(1.0, shadow, specular_light_interp.a);
|
|
|
+#endif
|
|
|
#undef BIAS_FUNC
|
|
|
}
|
|
|
#endif
|
|
@@ -1678,13 +1646,8 @@ void main() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#endif // SHADOWS_DISABLED
|
|
|
-
|
|
|
- for (uint i = 0; i < 8; i++) {
|
|
|
- if (i >= scene_data.directional_light_count) {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
+#ifndef USE_VERTEX_LIGHTING
|
|
|
+ for (uint i = 0; i < scene_data.directional_light_count; i++) {
|
|
|
if (!bool(directional_lights.data[i].mask & instances.data[draw_call.instance_index].layer_mask)) {
|
|
|
continue; //not masked
|
|
|
}
|
|
@@ -1703,8 +1666,8 @@ void main() {
|
|
|
#endif
|
|
|
blur_shadow(shadow);
|
|
|
|
|
|
-#ifdef DEBUG_DRAW_PSSM_SPLITS
|
|
|
vec3 tint = vec3(1.0);
|
|
|
+#ifdef DEBUG_DRAW_PSSM_SPLITS
|
|
|
if (-vertex.z < directional_lights.data[i].shadow_split_offsets.x) {
|
|
|
tint = vec3(1.0, 0.0, 0.0);
|
|
|
} else if (-vertex.z < directional_lights.data[i].shadow_split_offsets.y) {
|
|
@@ -1718,12 +1681,10 @@ void main() {
|
|
|
shadow = 1.0;
|
|
|
#endif
|
|
|
|
|
|
- light_compute(normal, directional_lights.data[i].direction, normalize(view), 0.0,
|
|
|
-#ifndef DEBUG_DRAW_PSSM_SPLITS
|
|
|
- directional_lights.data[i].color * directional_lights.data[i].energy,
|
|
|
-#else
|
|
|
+ float size_A = sc_use_light_soft_shadows ? directional_lights.data[i].size : 0.0;
|
|
|
+
|
|
|
+ light_compute(normal, directional_lights.data[i].direction, view, size_A,
|
|
|
directional_lights.data[i].color * directional_lights.data[i].energy * tint,
|
|
|
-#endif
|
|
|
true, shadow, f0, orms, 1.0, albedo, alpha,
|
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
|
backlight,
|
|
@@ -1744,15 +1705,14 @@ void main() {
|
|
|
#endif
|
|
|
#ifdef LIGHT_ANISOTROPY_USED
|
|
|
binormal, tangent, anisotropy,
|
|
|
-#endif
|
|
|
-#ifdef USE_SOFT_SHADOW
|
|
|
- directional_lights.data[i].size,
|
|
|
#endif
|
|
|
diffuse_light,
|
|
|
specular_light);
|
|
|
}
|
|
|
+#endif // USE_VERTEX_LIGHTING
|
|
|
} //directional light
|
|
|
|
|
|
+#ifndef USE_VERTEX_LIGHTING
|
|
|
if (!sc_disable_omni_lights) { //omni lights
|
|
|
uint light_indices = instances.data[draw_call.instance_index].omni_lights.x;
|
|
|
for (uint i = 0; i < 8; i++) {
|
|
@@ -1771,6 +1731,7 @@ void main() {
|
|
|
|
|
|
shadow = blur_shadow(shadow);
|
|
|
|
|
|
+ // Fragment lighting
|
|
|
light_process_omni(light_index, vertex, view, normal, vertex_ddx, vertex_ddy, f0, orms, shadow, albedo, alpha,
|
|
|
#ifdef LIGHT_BACKLIGHT_USED
|
|
|
backlight,
|
|
@@ -1841,6 +1802,9 @@ void main() {
|
|
|
diffuse_light, specular_light);
|
|
|
}
|
|
|
} //spot lights
|
|
|
+#endif // !VERTEX_LIGHTING
|
|
|
+
|
|
|
+#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
|
|
|
|
|
#ifdef USE_SHADOW_TO_OPACITY
|
|
|
#ifndef MODE_RENDER_DEPTH
|
|
@@ -1855,8 +1819,6 @@ void main() {
|
|
|
#endif // !MODE_RENDER_DEPTH
|
|
|
#endif // USE_SHADOW_TO_OPACITY
|
|
|
|
|
|
-#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
|
|
-
|
|
|
#ifdef MODE_RENDER_DEPTH
|
|
|
|
|
|
#ifdef MODE_RENDER_MATERIAL
|