diff options
| author | skal <pascal.massimino@gmail.com> | 2026-03-22 20:28:48 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-03-22 20:28:48 +0100 |
| commit | ce22f79c55e68f9fa496a47a528a6978b89e1261 (patch) | |
| tree | 04f6539b17757c20f965e5f53fe039c90d998f89 /cnn_v3 | |
| parent | ff46656233cd2676f1befef9ecc82722d962a89c (diff) | |
feat(shaders): add ray_sphere snippet, use in gbuf_raster impostor
Diffstat (limited to 'cnn_v3')
| -rw-r--r-- | cnn_v3/shaders/gbuf_raster.wgsl | 12 |
1 files changed, 4 insertions, 8 deletions
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<uniform> globals: GlobalUniforms; @group(0) @binding(1) var<storage, read> 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); |
