From 0f324530886e015a6066dc2134db0d318a7f01f9 Mon Sep 17 00:00:00 2001 From: TheRedShip Date: Mon, 20 Jan 2025 10:11:54 +0100 Subject: [PATCH] + | O3 faster bvh build and display informations --- Makefile | 2 +- includes/RT.hpp | 1 + includes/RT/ObjParser.hpp | 6 +++--- scenes/dragon.rt | 2 +- srcs/class/BVH.cpp | 2 -- srcs/class/ObjParser.cpp | 16 ++++++++-------- srcs/class/Scene.cpp | 30 ++++++++++++++++-------------- srcs/class/Shader.cpp | 2 +- 8 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index d1d0117..79d220e 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ else RM := rm -rf DIR_DUP = mkdir -p $(@D) CC := clang++ - CFLAGS := -Wall -Wextra -Werror -g + CFLAGS := -Wall -Wextra -Werror -g -O3 IFLAGS := -I./includes -I./includes/RT -I./includes/imgui -I/usr/include LDFLAGS := -L/usr/lib/x86_64-linux-gnu -lglfw -lGL -lGLU -lX11 -lpthread -ldl -lstdc++ FILE = $(shell ls -lR srcs/ | grep -F .c | wc -l) diff --git a/includes/RT.hpp b/includes/RT.hpp index f779482..bfde952 100644 --- a/includes/RT.hpp +++ b/includes/RT.hpp @@ -35,6 +35,7 @@ # include # include # include +# include # include # include # include diff --git a/includes/RT/ObjParser.hpp b/includes/RT/ObjParser.hpp index 9e9d2db..ef35df7 100644 --- a/includes/RT/ObjParser.hpp +++ b/includes/RT/ObjParser.hpp @@ -25,11 +25,11 @@ class ObjParser private: glm::vec3 getVertex(std::stringstream &line); glm::vec2 getUV(std::stringstream &line); - void addFace(std::stringstream &line, Scene &scene); + void addFace(std::stringstream &line); long int checkVertexIndex(int index, size_t size); void parseMtl(std::stringstream &line, Scene &scene); - bool addTriangleFromPolygon(std::vector &vertices, Scene &scene, int inv); - void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, Scene &scene); + bool addTriangleFromPolygon(std::vector &vertices, int inv); + void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3); int pointInTriangle(glm::vec3 pts[3], std::vector vertices, size_t cur); std::vector objSplit(std::string str, std::string delim); void getFaceVertices(std::vector &faceVertices, std::stringstream &line); diff --git a/scenes/dragon.rt b/scenes/dragon.rt index 632c449..56eddec 100644 --- a/scenes/dragon.rt +++ b/scenes/dragon.rt @@ -24,7 +24,7 @@ pl 0 -2 0 0 1 0 2 // floor qu -1 1.999 -1 2 0 0 0 0 2 6 -OBJ obj/Dragon_80K.obj +OBJ obj/Dragon_800K.obj OBJ obj/Lowpoly_tree_sample.obj po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4 diff --git a/srcs/class/BVH.cpp b/srcs/class/BVH.cpp index 027b3a1..496dc40 100644 --- a/srcs/class/BVH.cpp +++ b/srcs/class/BVH.cpp @@ -73,8 +73,6 @@ float BVH::evaluateSah(std::vector &triangles, int axis, float pos) return (cost > 0 ? cost : 1e30f); } - - void BVH::subdivide(std::vector &triangles) { if (_primitive_count <= 4) diff --git a/srcs/class/ObjParser.cpp b/srcs/class/ObjParser.cpp index 46d799a..da354c4 100644 --- a/srcs/class/ObjParser.cpp +++ b/srcs/class/ObjParser.cpp @@ -84,7 +84,7 @@ int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector vertices return(0); } -bool ObjParser::addTriangleFromPolygon(std::vector &vertices, Scene &scene, int inv) +bool ObjParser::addTriangleFromPolygon(std::vector &vertices, int inv) { glm::vec3 v1, v2 ,v3; float dot; @@ -108,7 +108,7 @@ bool ObjParser::addTriangleFromPolygon(std::vector &vertices, Scene & if(pointInTriangle(triangleVertices, vertices, i)) continue; vertices.erase(vertices.begin() + i); - addTriangle(v1, v2 ,v3 , scene); + addTriangle(v1, v2 ,v3); return(1); } return(0); @@ -144,7 +144,7 @@ void ObjParser::getFaceVertices(std::vector &faceVertices, std::strin } } -void ObjParser::addFace(std::stringstream &line, Scene &scene) +void ObjParser::addFace(std::stringstream &line) { std::vector faceVertices; @@ -155,16 +155,16 @@ void ObjParser::addFace(std::stringstream &line, Scene &scene) throw std::runtime_error("OBJ : face does not have enough vertices"); while(faceVertices.size() > 3) - if (!addTriangleFromPolygon(faceVertices, scene, 0)) - if(!addTriangleFromPolygon(faceVertices, scene, 1)) + if (!addTriangleFromPolygon(faceVertices, 0)) + if(!addTriangleFromPolygon(faceVertices, 1)) return ; if(!line.eof()) throw std::runtime_error("OBJ: an error occured while parsing face"); - addTriangle(faceVertices[0], faceVertices[1], faceVertices[2], scene); + addTriangle(faceVertices[0], faceVertices[1], faceVertices[2]); } -void ObjParser::addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, Scene &scene) +void ObjParser::addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3) { _triangles.push_back(Triangle(v1, v2, v3, _mat)); } @@ -258,7 +258,7 @@ void ObjParser::parse(Scene &scene) else if (identifier == "vt") _textureVertices.push_back(getUV(lineStream)); else if (identifier == "f") - addFace(lineStream, scene); + addFace(lineStream); else if (identifier == "mtllib") parseMtl(lineStream, scene); else if (identifier == "usemtl") diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index 0715e3d..8c72cdd 100644 --- a/srcs/class/Scene.cpp +++ b/srcs/class/Scene.cpp @@ -58,21 +58,8 @@ 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: " << std::endl; - - // std::cout << "\tBVH size: " << bvh->getSize() << std::endl; - // std::cout << "\tBVH leaves: " << bvh->getLeaves() << std::endl << std::endl; - - // BVHStats stats = bvh->analyzeBVHLeaves(bvh); - // std::cout << "\tMin triangles per leaf: " << stats.min_triangles << std::endl; - // std::cout << "\tMax triangles per leaf: " << stats.max_triangles << std::endl; - // std::cout << "\tAverage triangles per leaf: " << stats.average_triangles << std::endl << std::endl; return (true); } @@ -159,7 +146,11 @@ void Scene::addBvh(std::vector &triangles) { GPUBvhData new_bvh_data; std::vector new_bvhs_list; + + uint64_t start_time = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + std::cout << "New BVH" << std::endl; + BVH *bvh = new BVH(triangles, 0, triangles.size()); new_bvhs_list = bvh->getGPUBvhs(); @@ -183,6 +174,17 @@ void Scene::addBvh(std::vector &triangles) _gpu_triangles.push_back(gpu_triangle); } + + uint64_t time_elapsed = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count() - start_time; + std::cout << "\tBuild done in " << time_elapsed << "ms" << std::endl; + + std::cout << "\tBVH size: " << bvh->getSize() << std::endl; + std::cout << "\tBVH leaves: " << bvh->getLeaves() << std::endl << std::endl; + + BVHStats stats = bvh->analyzeBVHLeaves(bvh); + std::cout << "\tMin triangles per leaf: " << stats.min_triangles << std::endl; + std::cout << "\tMax triangles per leaf: " << stats.max_triangles << std::endl; + std::cout << "\tAverage triangles per leaf: " << stats.average_triangles << std::endl << std::endl; } diff --git a/srcs/class/Shader.cpp b/srcs/class/Shader.cpp index a141739..d6935ad 100644 --- a/srcs/class/Shader.cpp +++ b/srcs/class/Shader.cpp @@ -67,7 +67,7 @@ Shader::Shader(std::string vertexPath, std::string fragmentPath, std::string com const char *fragmentCode = loadFileWithIncludes(fragmentPath); const char *computeCode = loadFileWithIncludes(computePath); - printWithLineNumbers(computeCode); + // printWithLineNumbers(computeCode); _vertex = glCreateShader(GL_VERTEX_SHADER);