From c5783a15f0a026f5ea0129868f93cbf764e34d68 Mon Sep 17 00:00:00 2001 From: TheRedShip Date: Sun, 19 Jan 2025 01:10:01 +0100 Subject: [PATCH] + | Bvh and portals --- imgui.ini | 4 ++-- scenes/dragon.rt | 7 ++++--- shaders/trace.glsl | 35 ++++++++++++++++++++++------------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/imgui.ini b/imgui.ini index 3353b93..8c0c8f5 100644 --- a/imgui.ini +++ b/imgui.ini @@ -19,6 +19,6 @@ Pos=1642,668 Size=260,143 [Window][Debug BVH] -Pos=60,60 -Size=159,127 +Pos=1639,663 +Size=274,205 diff --git a/scenes/dragon.rt b/scenes/dragon.rt index 7c36d57..e96d5c7 100644 --- a/scenes/dragon.rt +++ b/scenes/dragon.rt @@ -1,7 +1,7 @@ -CAM 1.93858 0.961594 -0.0117614 -25 180 0.05 2.1639994842342176 29.263 5 +CAM 1.82501 0.45 -0.0162945 -10 180.6 0.02 2.164 30 5 -MAT 255 255 255 0.0 1. 0.5 // white 0 +MAT 255 255 255 0.0 1. 0.3 // white 0 MAT 255 10 10 0.0 0.0 0.0 // red 1 MAT 30 30 30 0.0 0.0 0.0 // gray 2 @@ -23,7 +23,8 @@ pl 0 -2 0 0 1 0 2 // floor qu -1 1.999 -1 2 0 0 0 0 2 6 -# sp 1 1 0 0.1 6 OBJ obj/Dragon_80K.obj +po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4 +po -0.5 -0.5 -1.99 0 1 0 1 0 0 0 4 diff --git a/shaders/trace.glsl b/shaders/trace.glsl index b407cfd..373bab4 100644 --- a/shaders/trace.glsl +++ b/shaders/trace.glsl @@ -31,8 +31,8 @@ hitInfo traceScene(Ray ray) { hitInfo hit; - for (int p = 0; p < 25; p++) //portals - { + // for (int p = 0; p < 25; p++) //portals + // { hit.t = 1e30; hit.obj_index = -1; @@ -51,16 +51,17 @@ hitInfo traceScene(Ray ray) hit.normal = temp_hit.normal; } } - if (hit.obj_index == -1 || objects[hit.obj_index].type != 5) - break ; - ray = portalRay(ray, hit); - } + // if (hit.obj_index == -1 || objects[hit.obj_index].type != 5) + // break ; + // ray = portalRay(ray, hit); + // } return (hit); } hitInfo traceBVH(Ray ray) { + hitInfo temp_hit; hitInfo hit; hit.t = 1e30; @@ -76,14 +77,12 @@ hitInfo traceBVH(Ray ray) GPUBvh node = bvh[current_index]; - hitInfo temp_hit; if (node.is_leaf != 0) { for (int i = 0; i < node.primitive_count; i++) { GPUTriangle obj = triangles[node.first_primitive + i]; - hitInfo temp_hit; if (intersectTriangle(ray, obj, temp_hit) && temp_hit.t < hit.t) { hit.t = temp_hit.t; @@ -127,10 +126,20 @@ hitInfo traceBVH(Ray ray) hitInfo traceRay(Ray ray) { - hitInfo hitBVH = traceBVH(ray); - hitInfo hitScene = traceScene(ray); + hitInfo hitBVH; + hitInfo hitScene; + hitInfo hit; - if (hitBVH.t < hitScene.t) - return (hitBVH); - return (hitScene); + for (int i = 0; i < 10; i++) // portal ray + { + hitBVH = traceBVH(ray); + hitScene = traceScene(ray); + + hit = hitBVH.t < hitScene.t ? hitBVH : hitScene; + if (hit.obj_index == -1 || objects[hit.obj_index].type != 5) + break ; + ray = portalRay(ray, hit); + } + + return (hit); } \ No newline at end of file