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

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