summaryrefslogtreecommitdiff
path: root/cnn_v3/shaders/gbuf_raster.wgsl
diff options
context:
space:
mode:
Diffstat (limited to 'cnn_v3/shaders/gbuf_raster.wgsl')
-rw-r--r--cnn_v3/shaders/gbuf_raster.wgsl12
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);