diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-02 16:31:05 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-02 16:31:05 +0100 |
| commit | 74cab8d6b91168a4681f1c9c19a8e32052d59e7b (patch) | |
| tree | b68d1f1298d66b2c8189d5f61b3df817e47d0d11 /src/3d/renderer.cc | |
| parent | 396f0fceb6b7ff0838689a377408cf63539697c6 (diff) | |
fix(3d): Restore and enhance 3D shadows
- Elevated objects in test_3d_render to avoid shadow occlusion.
- Slanted light direction for more visible, elongated shadows.
- Sharpened shadows by increasing k constant to 32.
- Cleaned up debug printfs from previous turns.
- Maintained skip_idx logic for robust self-shadowing prevention.
Diffstat (limited to 'src/3d/renderer.cc')
| -rw-r--r-- | src/3d/renderer.cc | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/3d/renderer.cc b/src/3d/renderer.cc index 9f3f40c..215cd97 100644 --- a/src/3d/renderer.cc +++ b/src/3d/renderer.cc @@ -126,16 +126,16 @@ fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 { fn calc_shadow(ro: vec3<f32>, rd: vec3<f32>, tmin: f32, tmax: f32, skip_idx: u32) -> f32 { var res = 1.0; var t = tmin; - for (var i = 0; i < 30; i = i + 1) { + for (var i = 0; i < 32; i = i + 1) { let h = map_scene(ro + rd * t, skip_idx); if (h < 0.001) { return 0.0; } - res = min(res, 8.0 * h / t); // Soft shadow k=8 + res = min(res, 32.0 * h / t); // Sharper shadow k=32 t = t + h; if (t > tmax) { break; } } - return res; + return clamp(res, 0.0, 1.0); } fn get_normal(p: vec3<f32>, obj_type: f32) -> vec3<f32> { @@ -156,7 +156,8 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { var p: vec3<f32>; var normal: vec3<f32>; var base_color = in.color.rgb; - let light_dir = normalize(vec3<f32>(0.2, 1.0, 0.2)); + // Slanted light for better shadow visibility + let light_dir = normalize(vec3<f32>(0.5, 1.0, 0.5)); if (obj_type <= 0.0) { // Rasterized object p = in.world_pos; @@ -166,7 +167,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let uv = p.xz * 0.1; let grid_val = textureSample(noise_tex, noise_sampler, uv).r; - base_color = base_color * (0.3 + 0.7 * grid_val); + base_color = base_color * (0.4 + 0.6 * grid_val); } else { // SDF object let center = vec3<f32>(obj.model[3].x, obj.model[3].y, obj.model[3].z); let scale = length(vec3<f32>(obj.model[0].x, obj.model[0].y, obj.model[0].z)); @@ -192,7 +193,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { normal = normalize(mat3 * get_normal(q_hit, obj_type)); } - let shadow = calc_shadow(p + normal * 0.01, light_dir, 0.01, 20.0, in.instance_index); + let shadow = calc_shadow(p + normal * 0.02, light_dir, 0.02, 20.0, in.instance_index); let lighting = (max(dot(normal, light_dir), 0.0) * shadow) + 0.1; return vec4<f32>(base_color * lighting, 1.0); } |
