diff --git a/CMakeLists.txt b/CMakeLists.txt index db933ee..f3b1699 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ find_package(glfw3 CONFIG REQUIRED) find_package(glm CONFIG REQUIRED) find_package(Ktx CONFIG REQUIRED) find_package(imgui CONFIG REQUIRED) +find_package(OpenMP REQUIRED) add_executable(RayTracer "") target_include_directories(RayTracer PUBLIC src/) @@ -31,5 +32,6 @@ target_link_libraries(RayTracer PUBLIC GLEW::GLEW) target_link_libraries(RayTracer PUBLIC glm::glm) target_link_libraries(RayTracer PUBLIC KTX::ktx) target_link_libraries(RayTracer PUBLIC ${VCPKG_INSTALLED_DIR}/x64-windows/lib/slang.lib) +target_link_libraries(RayTracer PUBLIC OpenMP::OpenMP_CXX) add_subdirectory(src/) \ No newline at end of file diff --git a/res/models/box.blend b/res/models/box.blend new file mode 100644 index 0000000..0a08022 Binary files /dev/null and b/res/models/box.blend differ diff --git a/res/models/box.blend1 b/res/models/box.blend1 new file mode 100644 index 0000000..5b80c73 Binary files /dev/null and b/res/models/box.blend1 differ diff --git a/res/models/box.glb b/res/models/box.glb new file mode 100644 index 0000000..16c894a Binary files /dev/null and b/res/models/box.glb differ diff --git a/res/models/couch_family_3seats _recamiere.blend b/res/models/couch_family_3seats _recamiere.blend new file mode 100644 index 0000000..744ca69 Binary files /dev/null and b/res/models/couch_family_3seats _recamiere.blend differ diff --git a/res/models/town_hall_interior.blend b/res/models/town_hall_interior.blend new file mode 100644 index 0000000..d480842 Binary files /dev/null and b/res/models/town_hall_interior.blend differ diff --git a/src/ThreadPool.h b/src/ThreadPool.h index 9f079e4..3157980 100644 --- a/src/ThreadPool.h +++ b/src/ThreadPool.h @@ -13,7 +13,7 @@ struct Batch class ThreadPool { public: - ThreadPool(uint32_t numWorkers = std::thread::hardware_concurrency()); + ThreadPool(uint32_t numWorkers = std::thread::hardware_concurrency() - 2); ~ThreadPool(); // cancel running jobs diff --git a/src/scene/Renderer.cpp b/src/scene/Renderer.cpp index f5ea04c..cb27890 100644 --- a/src/scene/Renderer.cpp +++ b/src/scene/Renderer.cpp @@ -10,7 +10,7 @@ Renderer::Renderer() .direction = glm::normalize(glm::vec3(-0.4f, -0.2f, -0.6f)), .color = glm::vec3(1, 1, 1), }); - bvh.addModels(ModelLoader::loadModel("../res/models/cube.fbx"), + bvh.addModels(ModelLoader::loadModel("../res/models/box.glb"), glm::mat4(glm::vec4(1.0f, 0.0f, 0.0f, 0.0f), glm::vec4(0.0f, 1.0f, 0.0f, 0.0f), glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), glm::vec4(0.0f, 0.0f, 0.0f, 1.0f))); bvh.generate(); @@ -48,12 +48,14 @@ void Renderer::render(Camera camera, RenderParameter params) { if (pendingCancel) return; + auto start = std::chrono::high_resolution_clock::now(); Batch batch; for (int w = 0; w < params.width; ++w) { batch.jobs.push_back( [&](int w, int samp) -> Task { + // #pragma omp parallel for for (int h = 0; h < params.height; ++h) { Ray cam = Ray(camera.position, glm::normalize(camera.direction)); @@ -99,7 +101,6 @@ void Renderer::render(Camera camera, RenderParameter params) co_return; }(w, samp)); } - auto start = std::chrono::high_resolution_clock::now(); threadPool.runBatch(std::move(batch)); auto end = std::chrono::high_resolution_clock::now(); std::cout << std::chrono::duration_cast(end - start).count() << std::endl; diff --git a/src/scene/Scene.cpp b/src/scene/Scene.cpp index f3151c4..1232868 100644 --- a/src/scene/Scene.cpp +++ b/src/scene/Scene.cpp @@ -68,8 +68,10 @@ void Scene::generate() PNode newNode = std::make_unique(AABB::combine(pendingNodes[lhs]->aabb, pendingNodes[rhs]->aabb)); newNode->left = std::move(pendingNodes[lhs]); newNode->right = std::move(pendingNodes[rhs]); - pendingNodes.erase(pendingNodes.begin() + lhs); + assert(rhs > lhs); + // pendingNodes.erase(pendingNodes.begin() + rhs); + pendingNodes.erase(pendingNodes.begin() + lhs); pendingNodes.push_back(std::move(newNode)); } hierarchy = std::move(pendingNodes[0]); @@ -94,7 +96,12 @@ void Scene::traceRay(Ray ray, Payload& payload, const float tmin, const float tm { // russian roulette ray termination float p = std::max(std::max(info.brdf.albedo.x, info.brdf.albedo.y), info.brdf.albedo.z); - if (payload.depth > 5) + + if (payload.depth >= 12) + { + return; + } + else if (payload.depth > 5) { if (rnd01.z >= p) return; diff --git a/src/util/ModelLoader.cpp b/src/util/ModelLoader.cpp index 9e04c8d..119a430 100644 --- a/src/util/ModelLoader.cpp +++ b/src/util/ModelLoader.cpp @@ -9,6 +9,7 @@ std::vector ModelLoader::loadModel(std::string_view filename) { Assimp::Importer importer; const aiScene* scene = importer.ReadFile(std::string(filename), aiProcess_Triangulate); + std::cout << importer.GetErrorString() << std::endl; std::vector result; for (int m = 0; m < scene->mNumMeshes; ++m) {