@@ -473,6 +473,7 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
473
473
}
474
474
475
475
float penumbra = 0.0 ;
476
+ vec3 penumbra_color = vec3 (0.0 );
476
477
if (p_soft_shadowing) {
477
478
const bool use_soft_shadows = (light_data.size > 0.0 );
478
479
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
502
503
vec3 light_dir = normalize (light_pos - origin);
503
504
504
505
float power = 0.0 ;
506
+ vec3 light_color = vec3 (0.0 );
505
507
uint power_accm = 0 ;
506
508
vec3 prev_pos = origin;
507
509
if (use_soft_shadows) {
@@ -528,6 +530,7 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
528
530
vec2 light_disk_sample = get_vogel_disk(vogel_index, a, shadowing_ray_count_sqrt) * soft_shadowing_disk_size * light_data.shadow_blur;
529
531
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);
530
532
float sample_penumbra = 0.0 ;
533
+ vec3 sample_penumbra_color = light_data.color.rgb;
531
534
bool sample_did_hit = false;
532
535
533
536
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
551
554
soft_shadow_hits += 1 ;
552
555
553
556
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;
555
559
}
556
560
origin = hit_position + r_light_dir * bake_params.bias;
557
561
@@ -562,11 +566,13 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
562
566
}
563
567
564
568
power += sample_penumbra;
569
+ light_color += sample_penumbra_color;
565
570
power_accm++ ;
566
571
}
567
572
568
573
} else { // No soft shadows (size == 0).
569
574
float sample_penumbra = 0.0 ;
575
+ vec3 sample_penumbra_color = light_data.color.rgb;
570
576
bool sample_did_hit = false;
571
577
for (uint iter = 0 ; iter < bake_params.transparency_rays; iter++ ) {
572
578
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
586
592
}
587
593
588
594
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;
590
597
}
591
598
origin = hit_position + r_light_dir * bake_params.bias;
592
599
@@ -596,14 +603,18 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
596
603
}
597
604
}
598
605
power = sample_penumbra;
606
+ light_color = sample_penumbra_color;
599
607
power_accm = 1 ;
600
608
}
601
609
aa_power += power / float (power_accm);
610
+ penumbra_color += light_color / float (power_accm);
602
611
}
603
612
penumbra = aa_power / ray_count;
613
+ penumbra_color /= ray_count;
604
614
} else { // No soft shadows and anti-aliasing (disabled via parameter).
605
615
bool did_hit = false;
606
616
penumbra = 0.0 ;
617
+ penumbra_color = light_data.color.rgb;
607
618
for (uint iter = 0 ; iter < bake_params.transparency_rays; iter++ ) {
608
619
vec4 hit_albedo = vec4 (1.0 );
609
620
vec3 hit_position;
@@ -621,7 +632,8 @@ void trace_direct_light(vec3 p_position, vec3 p_normal, uint p_light_index, bool
621
632
}
622
633
623
634
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;
625
637
}
626
638
627
639
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
636
648
}
637
649
638
650
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 ;
640
652
}
641
653
642
654
#endif
0 commit comments