+ | Dragon and bvh

This commit is contained in:
TheRedShip
2025-01-18 12:30:35 +01:00
parent bb673d4af1
commit 5d3de6158b
20 changed files with 430842 additions and 25476 deletions

View File

@ -27,10 +27,14 @@ int main(int argc, char **argv)
glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size);
const std::vector<GPUObject> &object_data = scene.getObjectData();
const std::vector<GPUTriangle> &triangle_data = scene.getTriangleData();
const std::vector<GPUMaterial> &material_data = scene.getMaterialData();
std::cout << "Sending " << object_data.size() << " objects for " << \
object_data.size() * sizeof(GPUObject) + material_data.size() * sizeof(GPUMaterial) \
object_data.size() * sizeof(GPUObject) + \
triangle_data.size() * sizeof(GPUTriangle) + \
material_data.size() * sizeof(GPUMaterial) \
<< " / " << max_gpu_size << " bytes" << std::endl;
GLuint objectSSBO;
@ -39,24 +43,29 @@ int main(int argc, char **argv)
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUObject) * object_data.size(), nullptr, GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, objectSSBO);
GLuint trianglesSSBO;
glGenBuffers(1, &trianglesSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, trianglesSSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUTriangle) * triangle_data.size(), nullptr, GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, trianglesSSBO);
GLuint materialSSBO;
glGenBuffers(1, &materialSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, materialSSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUMaterial) * material_data.size(), nullptr, GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, materialSSBO);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, materialSSBO);
GLuint lightSSBO;
glGenBuffers(1, &lightSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, lightSSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, scene.getGPULights().size() * sizeof(int), nullptr, GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, lightSSBO);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, lightSSBO);
GLuint bvhSSBO;
glGenBuffers(1, &bvhSSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, bvhSSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, scene.getBVH().size() * sizeof(GPUBvh), nullptr, GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, bvhSSBO);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, bvhSSBO);
GLuint cameraUBO;
@ -85,6 +94,9 @@ int main(int argc, char **argv)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, objectSSBO);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, object_data.size() * sizeof(GPUObject), object_data.data());
glBindBuffer(GL_SHADER_STORAGE_BUFFER, trianglesSSBO);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, triangle_data.size() * sizeof(GPUTriangle), triangle_data.data());
glBindBuffer(GL_SHADER_STORAGE_BUFFER, materialSSBO);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, material_data.size() * sizeof(GPUMaterial), material_data.data());

View File

@ -12,7 +12,7 @@
#include "BVH.hpp"
BVH::BVH(std::vector<GPUObject> &primitives, int first_primitive, int primitive_count) : _aabb(AABB(glm::vec3(1e30f), glm::vec3(-1e30f)))
BVH::BVH(std::vector<GPUTriangle> &primitives, int first_primitive, int primitive_count) : _aabb(AABB(glm::vec3(1e30f), glm::vec3(-1e30f)))
{
_left = nullptr;
_right = nullptr;
@ -26,14 +26,14 @@ BVH::BVH(std::vector<GPUObject> &primitives, int first_primitive, int primitive_
subdivide(primitives);
}
void BVH::updateBounds(std::vector<GPUObject> &primitives)
void BVH::updateBounds(std::vector<GPUTriangle> &primitives)
{
for (int i = 0; i < _primitive_count; i++)
{
GPUObject leaf_triangle = primitives[_first_primitive + i];
GPUTriangle leaf_triangle = primitives[_first_primitive + i];
if (leaf_triangle.type != (int)Object::Type::TRIANGLE)
continue ;
// if (leaf_triangle.type != (int)Object::Type::TRIANGLE)
// continue ;
_aabb.min = glm::min(_aabb.min, leaf_triangle.position);
_aabb.min = glm::min(_aabb.min, leaf_triangle.vertex1);
@ -44,9 +44,9 @@ void BVH::updateBounds(std::vector<GPUObject> &primitives)
}
}
void BVH::subdivide(std::vector<GPUObject> &primitives)
void BVH::subdivide(std::vector<GPUTriangle> &primitives)
{
if (_primitive_count <= 100)
if (_primitive_count <= 4)
return ;
glm::vec3 extent = _aabb.max - _aabb.min;
@ -79,7 +79,6 @@ void BVH::subdivide(std::vector<GPUObject> &primitives)
if (left_count == 0 || left_count == _primitive_count)
return ;
_is_leaf = false;
_left = new BVH(primitives, _first_primitive, left_count);

View File

@ -105,7 +105,8 @@ bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &
dot = glm::cross(v2 - v3, v2 - v1).z;
if(dot <= 0)
continue;
if(pointInTriangle((glm::vec3 [3]){v1, v2, v3}, vertices, i))
glm::vec3 triangleVertices[3] = {v1, v2, v3};
if(pointInTriangle(triangleVertices, vertices, i))
continue;
vertices.erase(vertices.begin() + i);
addTriangle(v1, v2 ,v3 , scene);

View File

@ -53,7 +53,7 @@ bool Scene::parseScene(char *name)
}
file.close();
BVH *bvh = new BVH(_gpu_objects, 0, _gpu_objects.size());
BVH *bvh = new BVH(_gpu_triangles, 0, _gpu_triangles.size());
_gpu_bvh = bvh->getGPUBvhs();
return (true);
@ -84,13 +84,6 @@ void Scene::addObject(Object *obj)
gpu_obj.vertex1 = quad->getUp();
gpu_obj.vertex2 = quad->getRight();
}
else if (obj->getType() == Object::Type::TRIANGLE)
{
auto triangle = static_cast<Triangle *>(obj);
gpu_obj.vertex1 = triangle->getVertex2();
gpu_obj.vertex2 = triangle->getVertex3();
gpu_obj.normal = triangle->getNormal();
}
else if (obj->getType() == Object::Type::CUBE)
{
auto cube = static_cast<Cube *>(obj);
@ -103,6 +96,22 @@ void Scene::addObject(Object *obj)
gpu_obj.normal = glm::vec3(cylinder->getRadius(), cylinder->getHeight(), 0.0f);
gpu_obj.transform = glm::mat4(cylinder->getRotation());
}
else if (obj->getType() == Object::Type::TRIANGLE)
{
GPUTriangle gpu_triangle;
auto triangle = static_cast<Triangle *>(obj);
gpu_triangle.position = obj->getPosition();
gpu_triangle.mat_index = obj->getMaterialIndex();
gpu_triangle.vertex1 = triangle->getVertex2();
gpu_triangle.vertex2 = triangle->getVertex3();
gpu_triangle.normal = triangle->getNormal();
_gpu_triangles.push_back(gpu_triangle);
return ;
}
else if (obj->getType() == Object::Type::PORTAL)
{
auto portal = static_cast<Portal *>(obj);
@ -169,6 +178,11 @@ const std::vector<GPUObject> &Scene::getObjectData() const
return (_gpu_objects);
}
const std::vector<GPUTriangle> &Scene::getTriangleData() const
{
return (_gpu_triangles);
}
std::vector<GPUMaterial> &Scene::getMaterialData()
{
return (_gpu_materials);

View File

@ -175,6 +175,7 @@ void Window::imGuiRender()
ImGui::Text("Fps: %d", int(_fps));
ImGui::Text("Frame: %d", _frameCount);
ImGui::Text("Objects: %d", _scene->getObjectData().size() + _scene->getTriangleData().size());
ImGui::Separator();
if (ImGui::Checkbox("Accumulate", &accumulate))