From 388ad5fc7d52eb0926de670bd8733c80ad93cf21 Mon Sep 17 00:00:00 2001 From: RedShip Date: Sat, 18 Jan 2025 21:12:11 +0100 Subject: [PATCH] + | Opti bvh on compute.glsl --- scenes/test.rt | 2 +- shaders/trace.glsl | 69 +++++++++++++++++++++++++--------------- srcs/RT.cpp | 6 ++-- srcs/class/BVH.cpp | 3 +- srcs/class/ObjParser.cpp | 7 ++-- srcs/class/Scene.cpp | 8 ++++- 6 files changed, 59 insertions(+), 36 deletions(-) diff --git a/scenes/test.rt b/scenes/test.rt index 02fe112..ce820a6 100644 --- a/scenes/test.rt +++ b/scenes/test.rt @@ -22,4 +22,4 @@ pl 0 -10 0 0 1 0 2 // floor qu -20 59 -20 40 0 0 0 0 40 6 -OBJ obj/Model.obj +OBJ obj/audi.obj diff --git a/shaders/trace.glsl b/shaders/trace.glsl index 8fa00a0..de1a0e8 100644 --- a/shaders/trace.glsl +++ b/shaders/trace.glsl @@ -77,32 +77,49 @@ hitInfo traceBVH(Ray ray) GPUBvh node = bvh[current_index]; hitInfo temp_hit; - if (intersectRayBVH(ray, node, temp_hit) && temp_hit.t < hit.t) - { - 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 > 0.0f && temp_hit.t < hit.t + 0.0001) - { - hit.t = temp_hit.t; - hit.last_t = temp_hit.last_t; - hit.obj_index = node.first_primitive + i; - hit.mat_index = obj.mat_index; - hit.position = temp_hit.position; - hit.normal = temp_hit.normal; - } - } - } - else - { - stack[++stack_ptr] = node.left_index; - stack[++stack_ptr] = node.right_index; - } - } + 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 > 0.0f && temp_hit.t < hit.t + 0.0001) + { + hit.t = temp_hit.t; + hit.last_t = temp_hit.last_t; + hit.obj_index = node.first_primitive + i; + hit.mat_index = obj.mat_index; + hit.position = temp_hit.position; + hit.normal = temp_hit.normal; + } + } + } + else + { + GPUBvh left_node = bvh[node.left_index]; + GPUBvh right_node = bvh[node.right_index]; + + hitInfo left_hit; + hitInfo right_hit; + + left_hit.t = 1e30; + right_hit.t = 1e30; + + bool left_bool = intersectRayBVH(ray, left_node, left_hit); + bool right_bool = intersectRayBVH(ray, right_node, right_hit); + + if (left_hit.t > right_hit.t) + { + if (left_hit.t < hit.t && left_bool) stack[++stack_ptr] = node.left_index; + if (right_hit.t < hit.t && right_bool) stack[++stack_ptr] = node.right_index; + } + else + { + if (right_hit.t < hit.t && right_bool) stack[++stack_ptr] = node.right_index; + if (left_hit.t < hit.t && left_bool) stack[++stack_ptr] = node.left_index; + } + } } return (hit); diff --git a/srcs/RT.cpp b/srcs/RT.cpp index 6628ebc..6eff0f1 100644 --- a/srcs/RT.cpp +++ b/srcs/RT.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */ -/* Updated: 2025/01/18 19:28:58 by ycontre ### ########.fr */ +/* Updated: 2025/01/18 21:10:23 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,8 +20,8 @@ int main(int argc, char **argv) return (1); Window window(&scene, WIDTH, HEIGHT, "RT_GPU", 0); - Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); - // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); + // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); + Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); GLint max_gpu_size; glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size); diff --git a/srcs/class/BVH.cpp b/srcs/class/BVH.cpp index a01aa9d..3745cc6 100644 --- a/srcs/class/BVH.cpp +++ b/srcs/class/BVH.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 21:48:48 by TheRed #+# #+# */ -/* Updated: 2025/01/18 19:16:45 by ycontre ### ########.fr */ +/* Updated: 2025/01/18 21:11:35 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -165,7 +165,6 @@ std::vector BVH::getGPUBvhs() int currentIndex = 0; flatten(bvhs, currentIndex); - std::cout << "BVH Done: " << bvhs.size() << std::endl; return (bvhs); } \ No newline at end of file diff --git a/srcs/class/ObjParser.cpp b/srcs/class/ObjParser.cpp index d7e7e99..665f23d 100644 --- a/srcs/class/ObjParser.cpp +++ b/srcs/class/ObjParser.cpp @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ObjParser.cpp :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: tomoron +#+ +:+ +#+ */ +/* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 15:00:33 by tomoron #+# #+# */ -/* Updated: 2025/01/18 18:57:31 by tomoron ### ########.fr */ +/* Updated: 2025/01/18 21:07:12 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -154,7 +154,8 @@ void ObjParser::addFace(std::stringstream &line, Scene &scene) while(faceVertices.size() > 3) if (!addTriangleFromPolygon(faceVertices, scene, 0)) - addTriangleFromPolygon(faceVertices, scene, 1); + if(!addTriangleFromPolygon(faceVertices, scene, 1)) + return ; if(!line.eof()) throw std::runtime_error("OBJ: an error occured while parsing face"); diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index 1b54128..8080243 100644 --- a/srcs/class/Scene.cpp +++ b/srcs/class/Scene.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 18:29:41 by ycontre #+# #+# */ -/* Updated: 2025/01/17 19:05:53 by ycontre ### ########.fr */ +/* Updated: 2025/01/18 21:04:56 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,9 +58,15 @@ bool Scene::parseScene(char *name) } file.close(); + std::cout << "Parsing done" << std::endl; + std::cout << "Starting BVH" << std::endl; + BVH *bvh = new BVH(_gpu_triangles, 0, _gpu_triangles.size()); _gpu_bvh = bvh->getGPUBvhs(); + std::cout << "BVH Done: " << bvh->size() << std::endl; + + return (true); }