+ | O3 faster bvh build and display informations

This commit is contained in:
TheRedShip
2025-01-20 10:11:54 +01:00
parent 84b0f22127
commit 0f32453088
8 changed files with 31 additions and 30 deletions

View File

@ -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)

View File

@ -35,6 +35,7 @@
# include <iostream>
# include <fstream>
# include <sstream>
# include <chrono>
# include <vector>
# include <string>
# include <memory>

View File

@ -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<glm::vec3> &vertices, Scene &scene, int inv);
void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, Scene &scene);
bool addTriangleFromPolygon(std::vector<glm::vec3> &vertices, int inv);
void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3);
int pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices, size_t cur);
std::vector<std::string> objSplit(std::string str, std::string delim);
void getFaceVertices(std::vector<glm::vec3> &faceVertices, std::stringstream &line);

View File

@ -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

View File

@ -73,8 +73,6 @@ float BVH::evaluateSah(std::vector<Triangle> &triangles, int axis, float pos)
return (cost > 0 ? cost : 1e30f);
}
void BVH::subdivide(std::vector<Triangle> &triangles)
{
if (_primitive_count <= 4)

View File

@ -84,7 +84,7 @@ int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices
return(0);
}
bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &scene, int inv)
bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, int inv)
{
glm::vec3 v1, v2 ,v3;
float dot;
@ -108,7 +108,7 @@ bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &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<glm::vec3> &faceVertices, std::strin
}
}
void ObjParser::addFace(std::stringstream &line, Scene &scene)
void ObjParser::addFace(std::stringstream &line)
{
std::vector<glm::vec3> 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")

View File

@ -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<Triangle> &triangles)
{
GPUBvhData new_bvh_data;
std::vector<GPUBvh> new_bvhs_list;
uint64_t start_time = std::chrono::duration_cast<std::chrono::milliseconds>(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<Triangle> &triangles)
_gpu_triangles.push_back(gpu_triangle);
}
uint64_t time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(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;
}

View File

@ -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);