diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-08-21 00:41:07 +0200 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-08-21 00:41:07 +0200 |
| commit | 7db04c9ae57b087f1d122d67a75fa02563911796 (patch) | |
| tree | f48320df1f2032f8f23e215f96c2512a7ea5f579 /shaders | |
| parent | 4ea8d2d92af80d64a16b3d20f899b22921aa42d0 (diff) | |
Fix bvh debug view
Diffstat (limited to 'shaders')
| -rw-r--r-- | shaders/compute.comp | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/shaders/compute.comp b/shaders/compute.comp index 0696f6d..fa69504 100644 --- a/shaders/compute.comp +++ b/shaders/compute.comp @@ -160,20 +160,30 @@ bool hit_aabb(vec3 minimum, vec3 maximum, ray r, float min_t, float max_t) { return t1 >= t0; } -// uint hit_aabbs(ray r, float min_t, float max_t) { -// uint hit_count = 0; -// // for (uint idx = 0; idx <= spheres_count * 2; idx++) { -// for (uint idx = 0; idx <= bufs.scene.triangles_count * 2; idx++) { -// hit_count += uint(hit_aabb(bufs.bvh.nodes[idx].bb, r, min_t, max_t)); -// -// if (bufs.bvh.nodes[idx].primitive_id >= 0) { -// // hit_count += uint(hit_aabb(spheres[bufs.bvh.nodes[idx].primitive_id].bb, r, min_t, max_t)); -// // hit_count += uint(hit_aabb(triangles[bufs.bvh.nodes[idx].primitive_id].bb, r, min_t, max_t)); -// } -// } -// -// return hit_count; -// } +uint hit_aabbs(ray r, float min_t, float max_t) { + uint hit_count = 0; + int id = 0; + + while(id != -1) { + if (bufs.bvh.nodes[id].primitive_id != -1) { + triangle tri = bufs.geometry.triangles[bufs.bvh.nodes[id].primitive_id]; + vec3 minimum = min(tri.v1.position, min(tri.v2.position, tri.v3.position)).xyz; + vec3 maximum = max(tri.v1.position, max(tri.v2.position, tri.v3.position)).xyz; + + if (hit_aabb(minimum, maximum, r, min_t, max_t)) { + hit_count++; + } + id = bufs.bvh.nodes[id].next_id; + } else if (hit_aabb(bufs.bvh.nodes[id].min, bufs.bvh.nodes[id].max, r, min_t, max_t)) { + hit_count++; + id++; + } else { + id = bufs.bvh.nodes[id].next_id; + } + } + + return hit_count; +} bool hit_sphere(sphere s, ray r, float min_t, float max_t, out hit_info info) { vec3 origin_center = r.origin - s.position.xyz; @@ -374,11 +384,13 @@ void main() { vec4 proj_plane_pos = bufs.scene.cam.first_pixel + jittered_uvs.x * bufs.scene.cam.horizontal + jittered_uvs.y * bufs.scene.cam.vertical; ray r = ray(bufs.scene.cam.position.xyz + offset, proj_plane_pos.xyz - bufs.scene.cam.position.xyz - offset); - vec4 out_color = ray_color(r, seed); + vec4 out_color = vec4(0.0); - // if (bufs.scene.debug_bvh) { - // out_color -= hit_aabbs(r, 0.001, 1e15) * vec4(0.0, 0.025, 0.025, 0.0); - // } + if (bufs.scene.debug_bvh) { + out_color = hit_aabbs(r, 0.001, 1e15) * vec4(0.001, 0.0, 0.0, 1.0); + } else { + out_color = ray_color(r, seed); + } float spp_scale = (1.0 / bufs.scene.sample_index); vec4 acc_color = imageLoad(images[nonuniformEXT(bufs.accumulation_image_index)], ivec2(x, y)); |
