From 74cab8d6b91168a4681f1c9c19a8e32052d59e7b Mon Sep 17 00:00:00 2001 From: skal Date: Mon, 2 Feb 2026 16:31:05 +0100 Subject: 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. --- src/3d/renderer.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/3d') 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, skip_idx: u32) -> f32 { fn calc_shadow(ro: vec3, rd: vec3, 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, obj_type: f32) -> vec3 { @@ -156,7 +156,8 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4 { var p: vec3; var normal: vec3; var base_color = in.color.rgb; - let light_dir = normalize(vec3(0.2, 1.0, 0.2)); + // Slanted light for better shadow visibility + let light_dir = normalize(vec3(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 { 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(obj.model[3].x, obj.model[3].y, obj.model[3].z); let scale = length(vec3(obj.model[0].x, obj.model[0].y, obj.model[0].z)); @@ -192,7 +193,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4 { 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(base_color * lighting, 1.0); } -- cgit v1.2.3