mirror of
https://github.com/TheRedShip/RT_GPU.git
synced 2025-09-27 18:48:36 +02:00
+ | O3 faster bvh build and display informations
This commit is contained in:
2
Makefile
2
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)
|
||||
|
@ -35,6 +35,7 @@
|
||||
# include <iostream>
|
||||
# include <fstream>
|
||||
# include <sstream>
|
||||
# include <chrono>
|
||||
# include <vector>
|
||||
# include <string>
|
||||
# include <memory>
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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")
|
||||
|
@ -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);
|
||||
}
|
||||
@ -160,6 +147,10 @@ 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();
|
||||
|
||||
@ -184,6 +175,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;
|
||||
|
||||
}
|
||||
|
||||
void Scene::addMaterial(Material *material)
|
||||
|
@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user