From ce22f79c55e68f9fa496a47a528a6978b89e1261 Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 22 Mar 2026 20:28:48 +0100 Subject: feat(shaders): add ray_sphere snippet, use in gbuf_raster impostor --- cnn_v3/shaders/gbuf_raster.wgsl | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'cnn_v3') diff --git a/cnn_v3/shaders/gbuf_raster.wgsl b/cnn_v3/shaders/gbuf_raster.wgsl index fa2dfd5..aed0e72 100644 --- a/cnn_v3/shaders/gbuf_raster.wgsl +++ b/cnn_v3/shaders/gbuf_raster.wgsl @@ -5,6 +5,7 @@ #include "common_uniforms" #include "math/normal" +#include "ray_sphere" @group(0) @binding(0) var globals: GlobalUniforms; @group(0) @binding(1) var object_data: ObjectsBuffer; @@ -93,14 +94,9 @@ fn fs_main(in: VertexOutput) -> GBufOutput { let sphere_radius = length(obj.model[0].xyz); // uniform scale in col0 let cam_pos = globals.camera_pos_time.xyz; let rd = normalize(in.world_pos - cam_pos); - let oc = cam_pos - sphere_center; - let b = dot(oc, rd); - let c = dot(oc, oc) - sphere_radius * sphere_radius; - let disc = b * b - c; - if (disc < 0.0) { discard; } - let t = -b - sqrt(disc); - if (t < 0.0) { discard; } - let hit = cam_pos + rd * t; + let isect = ray_sphere_intersection(cam_pos, rd, sphere_center, sphere_radius); + if (!isect.hit) { discard; } + let hit = cam_pos + rd * isect.t; world_normal = normalize(hit - sphere_center); // Reproject hit point to get correct clip-space depth. let clip_hit = globals.view_proj * vec4f(hit, 1.0); -- cgit v1.2.3