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
|
RM := rm -rf
|
||||||
DIR_DUP = mkdir -p $(@D)
|
DIR_DUP = mkdir -p $(@D)
|
||||||
CC := clang++
|
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
|
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++
|
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)
|
FILE = $(shell ls -lR srcs/ | grep -F .c | wc -l)
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
# include <iostream>
|
# include <iostream>
|
||||||
# include <fstream>
|
# include <fstream>
|
||||||
# include <sstream>
|
# include <sstream>
|
||||||
|
# include <chrono>
|
||||||
# include <vector>
|
# include <vector>
|
||||||
# include <string>
|
# include <string>
|
||||||
# include <memory>
|
# include <memory>
|
||||||
|
@ -25,11 +25,11 @@ class ObjParser
|
|||||||
private:
|
private:
|
||||||
glm::vec3 getVertex(std::stringstream &line);
|
glm::vec3 getVertex(std::stringstream &line);
|
||||||
glm::vec2 getUV(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);
|
long int checkVertexIndex(int index, size_t size);
|
||||||
void parseMtl(std::stringstream &line, Scene &scene);
|
void parseMtl(std::stringstream &line, Scene &scene);
|
||||||
bool addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &scene, int inv);
|
bool addTriangleFromPolygon(std::vector<glm::vec3> &vertices, int inv);
|
||||||
void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, Scene &scene);
|
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);
|
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);
|
std::vector<std::string> objSplit(std::string str, std::string delim);
|
||||||
void getFaceVertices(std::vector<glm::vec3> &faceVertices, std::stringstream &line);
|
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
|
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
|
OBJ obj/Lowpoly_tree_sample.obj
|
||||||
|
|
||||||
po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4
|
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);
|
return (cost > 0 ? cost : 1e30f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void BVH::subdivide(std::vector<Triangle> &triangles)
|
void BVH::subdivide(std::vector<Triangle> &triangles)
|
||||||
{
|
{
|
||||||
if (_primitive_count <= 4)
|
if (_primitive_count <= 4)
|
||||||
|
@ -84,7 +84,7 @@ int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices
|
|||||||
return(0);
|
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;
|
glm::vec3 v1, v2 ,v3;
|
||||||
float dot;
|
float dot;
|
||||||
@ -108,7 +108,7 @@ bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &
|
|||||||
if(pointInTriangle(triangleVertices, vertices, i))
|
if(pointInTriangle(triangleVertices, vertices, i))
|
||||||
continue;
|
continue;
|
||||||
vertices.erase(vertices.begin() + i);
|
vertices.erase(vertices.begin() + i);
|
||||||
addTriangle(v1, v2 ,v3 , scene);
|
addTriangle(v1, v2 ,v3);
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
return(0);
|
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;
|
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");
|
throw std::runtime_error("OBJ : face does not have enough vertices");
|
||||||
|
|
||||||
while(faceVertices.size() > 3)
|
while(faceVertices.size() > 3)
|
||||||
if (!addTriangleFromPolygon(faceVertices, scene, 0))
|
if (!addTriangleFromPolygon(faceVertices, 0))
|
||||||
if(!addTriangleFromPolygon(faceVertices, scene, 1))
|
if(!addTriangleFromPolygon(faceVertices, 1))
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
if(!line.eof())
|
if(!line.eof())
|
||||||
throw std::runtime_error("OBJ: an error occured while parsing face");
|
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));
|
_triangles.push_back(Triangle(v1, v2, v3, _mat));
|
||||||
}
|
}
|
||||||
@ -258,7 +258,7 @@ void ObjParser::parse(Scene &scene)
|
|||||||
else if (identifier == "vt")
|
else if (identifier == "vt")
|
||||||
_textureVertices.push_back(getUV(lineStream));
|
_textureVertices.push_back(getUV(lineStream));
|
||||||
else if (identifier == "f")
|
else if (identifier == "f")
|
||||||
addFace(lineStream, scene);
|
addFace(lineStream);
|
||||||
else if (identifier == "mtllib")
|
else if (identifier == "mtllib")
|
||||||
parseMtl(lineStream, scene);
|
parseMtl(lineStream, scene);
|
||||||
else if (identifier == "usemtl")
|
else if (identifier == "usemtl")
|
||||||
|
@ -58,21 +58,8 @@ bool Scene::parseScene(char *name)
|
|||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
|
||||||
std::cout << "Parsing done" << std::endl;
|
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);
|
return (true);
|
||||||
}
|
}
|
||||||
@ -159,7 +146,11 @@ void Scene::addBvh(std::vector<Triangle> &triangles)
|
|||||||
{
|
{
|
||||||
GPUBvhData new_bvh_data;
|
GPUBvhData new_bvh_data;
|
||||||
std::vector<GPUBvh> new_bvhs_list;
|
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());
|
BVH *bvh = new BVH(triangles, 0, triangles.size());
|
||||||
new_bvhs_list = bvh->getGPUBvhs();
|
new_bvhs_list = bvh->getGPUBvhs();
|
||||||
|
|
||||||
@ -183,6 +174,17 @@ void Scene::addBvh(std::vector<Triangle> &triangles)
|
|||||||
|
|
||||||
_gpu_triangles.push_back(gpu_triangle);
|
_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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ Shader::Shader(std::string vertexPath, std::string fragmentPath, std::string com
|
|||||||
const char *fragmentCode = loadFileWithIncludes(fragmentPath);
|
const char *fragmentCode = loadFileWithIncludes(fragmentPath);
|
||||||
const char *computeCode = loadFileWithIncludes(computePath);
|
const char *computeCode = loadFileWithIncludes(computePath);
|
||||||
|
|
||||||
printWithLineNumbers(computeCode);
|
// printWithLineNumbers(computeCode);
|
||||||
|
|
||||||
_vertex = glCreateShader(GL_VERTEX_SHADER);
|
_vertex = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user