Skip to content

Commit cb460ad

Browse files
committed
Add support for colored shadows in LightmapGI
1 parent 02e4605 commit cb460ad

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

modules/lightmapper_rd/lm_compute.glsl

+16-4
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
473473
}
474474

475475
float penumbra = 0.0;
476+
vec3 penumbra_color = vec3(0.0);
476477
if (p_soft_shadowing) {
477478
const bool use_soft_shadows = (light_data.size > 0.0);
478479
const uint ray_count = AA_SAMPLES;
@@ -502,6 +503,7 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
502503
vec3 light_dir = normalize(light_pos - origin);
503504

504505
float power = 0.0;
506+
vec3 light_color = vec3(0.0);
505507
uint power_accm = 0;
506508
vec3 prev_pos = origin;
507509
if (use_soft_shadows) {
@@ -528,6 +530,7 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
528530
vec2 light_disk_sample = get_vogel_disk(vogel_index, a, shadowing_ray_count_sqrt) * soft_shadowing_disk_size * light_data.shadow_blur;
529531
vec3 light_disk_to_point = normalize(light_to_point + light_disk_sample.x * light_to_point_tan + light_disk_sample.y * light_to_point_bitan);
530532
float sample_penumbra = 0.0;
533+
vec3 sample_penumbra_color = light_data.color.rgb;
531534
bool sample_did_hit = false;
532535

533536
for (uint iter = 0; iter < bake_params.transparency_rays; iter++) {
@@ -551,7 +554,8 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
551554
soft_shadow_hits += 1;
552555

553556
if (contribute) {
554-
sample_penumbra = max(sample_penumbra - hit_albedo.a - EPSILON, 0.0);
557+
sample_penumbra_color = mix(sample_penumbra_color, sample_penumbra_color * hit_albedo.rgb, hit_albedo.a);
558+
sample_penumbra *= 1.0 - hit_albedo.a;
555559
}
556560
origin = hit_position + r_light_dir * bake_params.bias;
557561

@@ -562,11 +566,13 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
562566
}
563567

564568
power += sample_penumbra;
569+
light_color += sample_penumbra_color;
565570
power_accm++;
566571
}
567572

568573
} else { // No soft shadows (size == 0).
569574
float sample_penumbra = 0.0;
575+
vec3 sample_penumbra_color = light_data.color.rgb;
570576
bool sample_did_hit = false;
571577
for (uint iter = 0; iter < bake_params.transparency_rays; iter++) {
572578
vec4 hit_albedo = vec4(1.0);
@@ -586,7 +592,8 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
586592
}
587593

588594
if (contribute) {
589-
sample_penumbra = max(sample_penumbra - hit_albedo.a - EPSILON, 0.0);
595+
sample_penumbra_color = mix(sample_penumbra_color, sample_penumbra_color * hit_albedo.rgb, hit_albedo.a);
596+
sample_penumbra *= 1.0 - hit_albedo.a;
590597
}
591598
origin = hit_position + r_light_dir * bake_params.bias;
592599

@@ -596,14 +603,18 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
596603
}
597604
}
598605
power = sample_penumbra;
606+
light_color = sample_penumbra_color;
599607
power_accm = 1;
600608
}
601609
aa_power += power / float(power_accm);
610+
penumbra_color += light_color / float(power_accm);
602611
}
603612
penumbra = aa_power / ray_count;
613+
penumbra_color /= ray_count;
604614
} else { // No soft shadows and anti-aliasing (disabled via parameter).
605615
bool did_hit = false;
606616
penumbra = 0.0;
617+
penumbra_color = light_data.color.rgb;
607618
for (uint iter = 0; iter < bake_params.transparency_rays; iter++) {
608619
vec4 hit_albedo = vec4(1.0);
609620
vec3 hit_position;
@@ -621,7 +632,8 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
621632
}
622633

623634
if (contribute) {
624-
penumbra = max(penumbra - hit_albedo.a - EPSILON, 0.0);
635+
penumbra_color = mix(penumbra_color, penumbra_color * hit_albedo.rgb, hit_albedo.a);
636+
penumbra *= 1.0 - hit_albedo.a;
625637
}
626638

627639
p_position = hit_position + r_light_dir * bake_params.bias;
@@ -636,7 +648,7 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
636648
}
637649

638650
r_shadow = penumbra;
639-
r_light = light_data.color * light_data.energy * attenuation * penumbra;
651+
r_light = light_data.color * light_data.energy * attenuation * penumbra * penumbra_color;
640652
}
641653

642654
#endif

0 commit comments

Comments
 (0)