From 155e3d40921f2aac120c2c4fe343e38402cfc29b Mon Sep 17 00:00:00 2001 From: Lorenz Reithmayr Date: Fri, 28 Jun 2024 08:35:35 +0200 Subject: [PATCH] [#1] Started on BVH --- CMakeLists.txt | 8 +++- README.md | 6 ++- img.png | Bin 0 -> 101306 bytes include/bvh.h | 27 ++++++++++++ include/canvas.h | 2 +- include/mesh.h | 22 ++++++---- include/obj_file_loader.h | 85 ++++++++++++++++++++++++-------------- include/ray_tracer.h | 28 ++++++------- src/bvh.cpp | 4 ++ src/cannoli_main.cpp | 10 ++--- src/mesh.cpp | 11 +++-- src/ray_tracer.cpp | 27 ++++++------ 12 files changed, 151 insertions(+), 79 deletions(-) create mode 100644 img.png create mode 100644 include/bvh.h create mode 100644 src/bvh.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 55bea1c..7fcd4a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,10 @@ cmake_minimum_required(VERSION 3.23) +set(CMAKE_POLICY_DEFAULT_CMP0135 NEW) project(cannoli) set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -fconcepts -pthread -DAABB_INT") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -fconcepts -pthread -DAABB_INT") # === PROJECT SETUP === @@ -20,6 +21,7 @@ add_library(${PROJECT_NAME} SHARED src/metal_brdf.cpp src/mesh.cpp src/aabb.cpp + src/bvh.cpp # Header Files include/utils.h @@ -40,7 +42,9 @@ add_library(${PROJECT_NAME} SHARED include/metal_brdf.h include/mesh.h include/obj_file_loader.h - include/aabb.h) + include/aabb.h + include/bvh.h +) # === DEPENDENCIES === diff --git a/README.md b/README.md index a4658e4..94bc56d 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,15 @@ ### "Leave the gun, take the cannoli" - Goodfellas, starring Ray Liotta. Ray...get it? +## + +![img.png](img.png) +## This is (rather, is going to be) my implementation of the [RTiOWE](https://raytracing.github.io/books/RayTracingInOneWeekend.html#overview) ray tracer. It follows RTiOWE in -spirit, but the architecture is going to be substantially different, in order to implement more advanced features down +spirit, but the architecture is going to be substantially different in order to implement more advanced features down the line. Heavy inspiration is drawn from [Manta Ray](https://github.com/ange-yaghi/manta-ray) by Anghe Yaghi. diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..2f76ec6c32c03f9a3899dabb9dc2d53c2b0eeb59 GIT binary patch literal 101306 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ƺB+9fdki-d9!JdBEabG^buPl7oVI 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 literal 0 HcmV?d00001 diff --git a/include/bvh.h b/include/bvh.h new file mode 100644 index 0000000..c83f9e4 --- /dev/null +++ b/include/bvh.h @@ -0,0 +1,27 @@ +#ifndef CANNOLI_SRC_BVH_H_ +#define CANNOLI_SRC_BVH_H_ + +#include "aabb.h" + +namespace cannoli { +class BVHNode { + public: + BVHNode(AABB &boundingBox, std::vector &triangles); + + protected: + AABB m_boundingBox; + BVHNode *m_childA{nullptr}; + BVHNode *m_childB{nullptr}; + std::vector m_associatedTriangleIndices; +}; + +class BVH { + public: + BVH() = default; + + protected: + std::vector m_nodes; +}; +} // namespace cannoli +#endif //CANNOLI_SRC_BVH_H_ + diff --git a/include/canvas.h b/include/canvas.h index ba83efe..d9fc554 100644 --- a/include/canvas.h +++ b/include/canvas.h @@ -9,7 +9,7 @@ class Canvas { m_height = static_cast(m_width / m_aspectRatio); } - void setAspectRation(float aspect_ratio) { + void setAspectRatio(float aspect_ratio) { m_aspectRatio = aspect_ratio; } diff --git a/include/mesh.h b/include/mesh.h index fa0f44a..0ac7eea 100644 --- a/include/mesh.h +++ b/include/mesh.h @@ -9,6 +9,7 @@ #include "material.h" #include "object.h" #include "aabb.h" +#include "bvh.h" #include #include @@ -27,7 +28,7 @@ class Mesh { } [[nodiscard]] int getFaceCount() const { - return m_faceCount; + return m_triangleCount; } [[nodiscard]] std::shared_ptr getMaterial() const { @@ -38,14 +39,19 @@ class Mesh { return std::make_shared(m_aabb); } - bool computeTriangleIntersection(LightRay &ray, - const float &t_min, - const float &t_max, - HitRecord &hit_record, - int triangle_nr); + [[nodiscard]] std::shared_ptr getBBVH() const { + return std::make_shared(m_bvh); + } + bool computeTriangleIntersection( + LightRay &ray, + const float &t_min, + const float &t_max, + HitRecord &hit_record, + int triangle_nr); LightRay computeSurfaceInteraction(const LightRay &ray, const HitRecord &hit_record); void computeAABB(); + void constructBVH(); private: std::vector m_vertices; @@ -54,9 +60,9 @@ class Mesh { std::shared_ptr m_meshMaterial; private: - int m_faceCount = 0; + int m_triangleCount = 0; AABB m_aabb; - + BVH m_bvh; }; } // namespace cannoli #endif //CANNOLI_SRC_MESH_H_ diff --git a/include/obj_file_loader.h b/include/obj_file_loader.h index cded41e..9b36076 100644 --- a/include/obj_file_loader.h +++ b/include/obj_file_loader.h @@ -22,13 +22,13 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // OBJ_Loader.h - A Single Header OBJ Model Loader - #pragma once // Iostream - STD I/O Library #include // Vector - STD Vector/Array Library +#include #include // String - STD String Library @@ -549,9 +549,11 @@ class Loader { while (1) { tempMesh.MeshName = meshname + "_" + std::to_string(i); - for (auto &m : LoadedMeshes) - if (m.MeshName == tempMesh.MeshName) + for (auto &m : LoadedMeshes) { + if (m.MeshName == tempMesh.MeshName) { continue; +} +} break; } @@ -788,12 +790,15 @@ class Loader { if (tVerts.size() == 3) { // Create a triangle from pCur, pPrev, pNext for (int j = 0; j < int(tVerts.size()); j++) { - if (iVerts[j].Position == pCur.Position) + if (iVerts[j].Position == pCur.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pPrev.Position) +} + if (iVerts[j].Position == pPrev.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pNext.Position) +} + if (iVerts[j].Position == pNext.Position) { oIndices.push_back(j); +} } tVerts.clear(); @@ -802,12 +807,15 @@ class Loader { if (tVerts.size() == 4) { // Create a triangle from pCur, pPrev, pNext for (int j = 0; j < int(iVerts.size()); j++) { - if (iVerts[j].Position == pCur.Position) + if (iVerts[j].Position == pCur.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pPrev.Position) +} + if (iVerts[j].Position == pPrev.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pNext.Position) +} + if (iVerts[j].Position == pNext.Position) { oIndices.push_back(j); +} } Vector3 tempVec; @@ -821,12 +829,15 @@ class Loader { // Create a triangle from pCur, pPrev, pNext for (int j = 0; j < int(iVerts.size()); j++) { - if (iVerts[j].Position == pPrev.Position) + if (iVerts[j].Position == pPrev.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pNext.Position) +} + if (iVerts[j].Position == pNext.Position) { oIndices.push_back(j); - if (iVerts[j].Position == tempVec) +} + if (iVerts[j].Position == tempVec) { oIndices.push_back(j); +} } tVerts.clear(); @@ -834,10 +845,12 @@ class Loader { } // If Vertex is not an interior vertex - float angle = math::AngleBetweenV3(pPrev.Position - pCur.Position, pNext.Position - pCur.Position) - * (180 / 3.14159265359); - if (angle <= 0 && angle >= 180) + float angle = NAN; + angle = math::AngleBetweenV3(pPrev.Position - pCur.Position, pNext.Position - pCur.Position) + * (180 / std::numbers::pi); + if (angle <= 0 && angle >= 180) { continue; +} // If any vertices are within this triangle bool inTri = false; @@ -849,17 +862,21 @@ class Loader { break; } } - if (inTri) + if (inTri) { continue; +} // Create a triangle from pCur, pPrev, pNext for (int j = 0; j < int(iVerts.size()); j++) { - if (iVerts[j].Position == pCur.Position) + if (iVerts[j].Position == pCur.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pPrev.Position) +} + if (iVerts[j].Position == pPrev.Position) { oIndices.push_back(j); - if (iVerts[j].Position == pNext.Position) +} + if (iVerts[j].Position == pNext.Position) { oIndices.push_back(j); +} } // Delete pCur from the list @@ -876,26 +893,30 @@ class Loader { } // if no triangles were created - if (oIndices.size() == 0) + if (oIndices.size() == 0) { break; +} // if no more vertices - if (tVerts.size() == 0) + if (tVerts.size() == 0) { break; +} } } // Load Materials from .mtl file - bool LoadMaterials(std::string path) { + bool LoadMaterials(const std::string& path) { // If the file is not a material file return false - if (path.substr(path.size() - 4, path.size()) != ".mtl") + if (path.substr(path.size() - 4, path.size()) != ".mtl") { return false; + } std::ifstream file(path); // If the file is not found return false - if (!file.is_open()) + if (!file.is_open()) { return false; +} Material tempMaterial; @@ -935,8 +956,9 @@ class Loader { std::vector temp; algorithm::split(algorithm::tail(curline), temp, " "); - if (temp.size() != 3) + if (temp.size() != 3) { continue; +} tempMaterial.Ka.X = std::stof(temp[0]); tempMaterial.Ka.Y = std::stof(temp[1]); @@ -947,8 +969,9 @@ class Loader { std::vector temp; algorithm::split(algorithm::tail(curline), temp, " "); - if (temp.size() != 3) + if (temp.size() != 3) { continue; +} tempMaterial.Kd.X = std::stof(temp[0]); tempMaterial.Kd.Y = std::stof(temp[1]); @@ -959,8 +982,9 @@ class Loader { std::vector temp; algorithm::split(algorithm::tail(curline), temp, " "); - if (temp.size() != 3) + if (temp.size() != 3) { continue; +} tempMaterial.Ks.X = std::stof(temp[0]); tempMaterial.Ks.Y = std::stof(temp[1]); @@ -1016,11 +1040,12 @@ class Loader { // Test to see if anything was loaded // If not return false - if (LoadedMaterials.empty()) + if (LoadedMaterials.empty()) { return false; // If so return true - else + } else { return true; +} } }; -} \ No newline at end of file +} // namespace objl \ No newline at end of file diff --git a/include/ray_tracer.h b/include/ray_tracer.h index 073254e..c4b6aaa 100644 --- a/include/ray_tracer.h +++ b/include/ray_tracer.h @@ -21,26 +21,26 @@ class RayTracer { RayTracer() = default; void trace(); - cannoli::ColorRGB renderPixel( + ColorRGB renderPixel( cannoli::LightRay &ray, int n_bounces, HitRecord &hit_record, float t_max, std::vector> &meshes_in_scene); - void WritePPMImage(std::ofstream &stream, int samples); - void SetupImage(); - void ResetPixel(); - Vec3f GenerateDirection(int pixel_x, int pixel_y); - static LightRay EmitRay(const Vec3f &origin, const Vec3f &direction); - static cannoli::ColorRGB PaintBackground(cannoli::LightRay &ray); + void writePPMImage(std::ofstream &stream, int samples); + void setupImage(); + void resetPixel(); + Vec3f generateDirection(int pixel_x, int pixel_y); + static LightRay emitRay(const Vec3f &origin, const Vec3f &direction); + static cannoli::ColorRGB paintBackground(LightRay &ray); - void loadScene(Scene scene) { - m_scene = std::move(scene); + void loadScene(Scene &scene) { + m_scene = scene; } - void setCamera(const Camera &camera) { + void setCamera(Camera &camera) { m_camera = camera; } - void setCanvas(const Canvas &canvas) { + void setCanvas(Canvas &canvas) { m_canvas = canvas; } void setOutputPath(std::string &out_fn) { @@ -55,9 +55,9 @@ class RayTracer { private: std::ofstream m_ppmImage{}; - Scene m_scene; - Canvas m_canvas; - Camera m_camera; + Scene m_scene{}; + Canvas m_canvas{}; + Camera m_camera{}; ColorRGB m_pixelColor{}; bool m_stopTrace{false}; std::string m_outFile; diff --git a/src/bvh.cpp b/src/bvh.cpp new file mode 100644 index 0000000..f5a6ba5 --- /dev/null +++ b/src/bvh.cpp @@ -0,0 +1,4 @@ +#include "bvh.h" + +cannoli::BVHNode::BVHNode(cannoli::AABB &boundingBox, std::vector &triangles) : + m_boundingBox(boundingBox), m_associatedTriangleIndices(triangles) {} diff --git a/src/cannoli_main.cpp b/src/cannoli_main.cpp index d387bdf..afeeaff 100644 --- a/src/cannoli_main.cpp +++ b/src/cannoli_main.cpp @@ -19,12 +19,12 @@ int main() { constexpr int CANVAS_WIDTH = 800; // Ray tracer parameters - constexpr int SAMPLES = 30; - constexpr int MAX_BOUNCES = 4; + constexpr int SAMPLES = 10; + constexpr int MAX_BOUNCES = 10; // Scene parameters - std::string scene_name = "blocks.obj"; - std::string scene_path = fmt::format("../models/{}", scene_name); + std::string scene_name = "blocks"; + std::string scene_path = fmt::format("../models/{}.obj", scene_name); std::string out_path = fmt::format("../images/cannoli_output_{}_samples-{}_maxBounces-{}.ppm", scene_name, SAMPLES, MAX_BOUNCES); // Initialize the camera @@ -39,7 +39,7 @@ int main() { // Initialize the canvas cannoli::Canvas canvas; - canvas.setAspectRation(ASPECT_RATIO); + canvas.setAspectRatio(ASPECT_RATIO); canvas.setWidth(CANVAS_WIDTH); canvas.initialize(); diff --git a/src/mesh.cpp b/src/mesh.cpp index cd3901e..ebeaeee 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -4,17 +4,17 @@ cannoli::Mesh::Mesh(objl::Mesh &mesh, std::shared_ptr &material) : m_indices(mesh.Indices), m_name(mesh.MeshName), m_meshMaterial(material), - m_faceCount(m_indices.size() / 3) { + m_triangleCount(m_indices.size() / 3) { // Convert the vertex positions from objl's Vector3 format to Vec3f for (const auto &objl_vertex : mesh.Vertices) { m_vertices.push_back(cannoli::vec3ToVec3f(objl_vertex.Position)); } - - // Compute the mesh's axis-alignes bounding box (AABB) + constructBVH(); + // Compute the mesh's axis-aligned bounding box (AABB) computeAABB(); - fmt::print("Constructed Mesh {} \n Number of Vertices: {} \n Number of Faces: {} \n", m_name, m_vertices.size(), m_faceCount); + fmt::print("Constructed Mesh {} \n Number of Vertices: {} \n Number of Faces: {} \n", m_name, m_vertices.size(), m_triangleCount); } bool cannoli::Mesh::computeTriangleIntersection(LightRay &ray, @@ -120,3 +120,6 @@ void cannoli::Mesh::computeAABB() { } } } +void cannoli::Mesh::constructBVH() { + +} diff --git a/src/ray_tracer.cpp b/src/ray_tracer.cpp index 70cdc8a..725e729 100644 --- a/src/ray_tracer.cpp +++ b/src/ray_tracer.cpp @@ -1,7 +1,7 @@ #include "ray_tracer.h" void cannoli::RayTracer::trace() { - SetupImage(); + setupImage(); HitRecord hit_record; auto meshes_in_scene = m_scene.getMeshesInScene(); @@ -12,20 +12,19 @@ void cannoli::RayTracer::trace() { // cannoli::progressBar(1 - (static_cast(y) / static_cast(canvas_height))); std::cout << fmt::format("Progress: {}\n", static_cast((1 - (static_cast(y) / static_cast(canvas_height))) * 100)); for (int x = 0; x < canvas_width; ++x) { - ResetPixel(); + resetPixel(); for (int s = 0; s < m_samples; ++s) { if (m_hitBackground) { m_hitBackground = false; continue; } - Vec3f dir = GenerateDirection(x, y); - LightRay ray = EmitRay(m_camera.getOrigin(), dir); + Vec3f dir = generateDirection(x, y); + LightRay ray = emitRay(m_camera.getOrigin(), dir); m_pixelColor += renderPixel(ray, m_maxBounces, hit_record, infinity, meshes_in_scene); } - WritePPMImage(m_ppmImage, m_samples); + writePPMImage(m_ppmImage, m_samples); } } - m_ppmImage.close(); } @@ -47,7 +46,7 @@ cannoli::ColorRGB cannoli::RayTracer::renderPixel(cannoli::LightRay &ray, for (const auto &mesh : meshes_in_scene) { int nr_of_triangles = mesh->getFaceCount(); if (mesh->getAABB()->computeAABBIntersection(ray, eps, closest_so_far)) { - for (size_t i = 0; i < nr_of_triangles; ++i) { + for (int i = 0; i < nr_of_triangles; ++i) { if (mesh->computeTriangleIntersection(ray, eps, closest_so_far, temp_hit_record, i)) { closest_mesh = mesh; closest_so_far = temp_hit_record.t < closest_so_far ? temp_hit_record.t : closest_so_far; @@ -64,10 +63,10 @@ cannoli::ColorRGB cannoli::RayTracer::renderPixel(cannoli::LightRay &ray, return 1.1 * albedo * renderPixel(scattered_ray, n_bounces - 1, hit_record, closest_so_far, meshes_in_scene); } m_hitBackground = true; - return PaintBackground(ray); + return paintBackground(ray); } -void cannoli::RayTracer::WritePPMImage(std::ofstream &stream, int samples) { +void cannoli::RayTracer::writePPMImage(std::ofstream &stream, int samples) { float r = m_pixelColor.getX(); float g = m_pixelColor.getY(); float b = m_pixelColor.getZ(); @@ -81,20 +80,20 @@ void cannoli::RayTracer::WritePPMImage(std::ofstream &stream, int samples) { << static_cast(256 * clamp(b, 0.0, 0.999)) << '\n'; } -void cannoli::RayTracer::SetupImage() { +void cannoli::RayTracer::setupImage() { m_ppmImage.open(m_outFile); m_ppmImage << "P3\n" << m_canvas.getWidth() << ' ' << m_canvas.getHeight() << "\n255\n"; } -void cannoli::RayTracer::ResetPixel() { +void cannoli::RayTracer::resetPixel() { m_pixelColor.setXYZ(0, 0, 0); } -cannoli::LightRay cannoli::RayTracer::EmitRay(const cannoli::Vec3f &origin, const cannoli::Vec3f &direction) { +cannoli::LightRay cannoli::RayTracer::emitRay(const Vec3f &origin, const Vec3f &direction) { return cannoli::LightRay(origin, direction); } -cannoli::Vec3f cannoli::RayTracer::GenerateDirection(const int pixel_x, const int pixel_y) { +cannoli::Vec3f cannoli::RayTracer::generateDirection(const int pixel_x, const int pixel_y) { auto u = (pixel_x + random_float()) / (m_canvas.getWidth() - 1); auto v = (pixel_y + random_float()) / (m_canvas.getHeight() - 1); Vec3f @@ -102,7 +101,7 @@ cannoli::Vec3f cannoli::RayTracer::GenerateDirection(const int pixel_x, const in return dir; } -cannoli::ColorRGB cannoli::RayTracer::PaintBackground(cannoli::LightRay &ray) { +cannoli::ColorRGB cannoli::RayTracer::paintBackground(LightRay &ray) { cannoli::Vec3f unit_direction = ray.getDirection().normalize(); float t = 0.5 * (unit_direction.getY() + 1.0); return 1.5 * ((1.0 - t) * ColorRGB(1.0, 1.0, 1.0) + t * ColorRGB(0.5, 0.7, 1.0));