diff --git a/.vscode/imgui.ini b/.vscode/imgui.ini new file mode 100644 index 0000000..9930887 --- /dev/null +++ b/.vscode/imgui.ini @@ -0,0 +1,4 @@ +[Window][Debug##Default] +Pos=60,60 +Size=400,400 + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2320da7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(lldb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/RayTracer", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "lldb" + } + + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index db933ee..a358b0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,6 @@ find_package(imgui CONFIG REQUIRED) add_executable(RayTracer "") target_include_directories(RayTracer PUBLIC src/) -target_include_directories(RayTracer PUBLIC ${VCPKG_INSTALLED_DIR}/x64-windows/include) target_link_libraries(RayTracer PUBLIC Vulkan::Vulkan) target_link_libraries(RayTracer PUBLIC Vulkan::Headers) target_link_libraries(RayTracer PUBLIC assimp::assimp) @@ -30,6 +29,10 @@ target_link_libraries(RayTracer PUBLIC imgui::imgui) target_link_libraries(RayTracer PUBLIC GLEW::GLEW) target_link_libraries(RayTracer PUBLIC glm::glm) target_link_libraries(RayTracer PUBLIC KTX::ktx) +if(WIN32) +target_include_directories(RayTracer PUBLIC ${VCPKG_INSTALLED_DIR}/x64-windows/include) target_link_libraries(RayTracer PUBLIC ${VCPKG_INSTALLED_DIR}/x64-windows/lib/slang.lib) - +elseif(APPLE) +target_include_directories(RayTracer PUBLIC ${VCPKG_INSTALLED_DIR}/arm64-osx/include) +endif() add_subdirectory(src/) \ No newline at end of file diff --git a/external/vcpkg b/external/vcpkg index 791ae5e..01be99f 160000 --- a/external/vcpkg +++ b/external/vcpkg @@ -1 +1 @@ -Subproject commit 791ae5e74bfca0908f067e75b7b3d10dc10acfd6 +Subproject commit 01be99fec01f777c4113ceea192a45115c69cdb7 diff --git a/src/scene/Renderer.cpp b/src/scene/Renderer.cpp index b2111e6..0673b7c 100644 --- a/src/scene/Renderer.cpp +++ b/src/scene/Renderer.cpp @@ -39,8 +39,6 @@ glm::vec3 rand01(glm::uvec3 x) return glm::vec3(x) * (1.0f / float(0xffffffffU)); } -thread_local glm::vec3 rnd01; - void Renderer::render(Camera camera, RenderParameter params) { for (int samp = 0; samp < params.numSamples; ++samp) @@ -57,6 +55,7 @@ void Renderer::render(Camera camera, RenderParameter params) // #pragma omp parallel for for (int h = 0; h < params.height; ++h) { + Payload payload; Ray cam = Ray(camera.position, glm::normalize(camera.target - camera.position)); glm::vec3 cx = glm::normalize(glm::cross(cam.direction, abs(cam.direction.y) < 0.9 ? glm::vec3(0, 1, 0) : glm::vec3(0, 0, 1))), @@ -67,8 +66,9 @@ void Renderer::render(Camera camera, RenderParameter params) //-- sample sensor glm::uvec2 pix = glm::uvec2(w, h); - rnd01 = rand01(glm::uvec3(pix, samp)); - glm::vec2 rnd2 = 2.0f * glm::vec2(rnd01); // vvv tent filter sample + + payload.rnd01 = rand01(glm::uvec3(pix, samp)); + glm::vec2 rnd2 = 2.0f * glm::vec2(payload.rnd01); // vvv tent filter sample glm::vec2 tent = glm::vec2(rnd2.x < 1 ? sqrt(rnd2.x) - 1 : 1 - sqrt(2 - rnd2.x), rnd2.y < 1 ? sqrt(rnd2.y) - 1 : 1 - sqrt(2 - rnd2.y)); glm::vec2 s = @@ -84,14 +84,13 @@ void Renderer::render(Camera camera, RenderParameter params) glm::vec3 lensX = glm::cross(lensN, glm::vec3(0, 1, 0)); // the exact vector doesnt matter glm::vec3 lensY = glm::cross(lensN, lensX); - glm::vec3 lensSample = lensP + rnd01.x * camera.A * lensX + rnd01.y * camera.A * lensY; + glm::vec3 lensSample = lensP + payload.rnd01.x * camera.A * lensX + payload.rnd01.y * camera.A * lensY; glm::vec3 focalPoint = cam.origin + (camera.S_O + S_I) * cam.direction; float t = glm::dot(focalPoint - r.origin, lensN) / glm::dot(r.direction, lensN); glm::vec3 focus = r.origin + t * r.direction; r = Ray(lensSample, normalize(focus - lensSample)); // TODO: Fix lens - Payload payload; bvh.traceRay(r, payload, 1e-4, 1e20); accumulator[w + h * params.width] += payload.accumulatedRadiance; diff --git a/src/scene/Scene.cpp b/src/scene/Scene.cpp index 4c38802..4cff284 100644 --- a/src/scene/Scene.cpp +++ b/src/scene/Scene.cpp @@ -77,8 +77,6 @@ void Scene::generate() hierarchy = std::move(pendingNodes[0]); } -extern glm::vec3 rnd01; - void Scene::traceRay(Ray ray, Payload& payload, const float tmin, const float tmax) const noexcept { IntersectionInfo info = generateIntersections(hierarchy, ray, tmin, tmax); @@ -94,7 +92,7 @@ void Scene::traceRay(Ray ray, Payload& payload, const float tmin, const float tm } else if (payload.depth > 5) { - if (rnd01.z >= p) + if (payload.rnd01.z >= p) return; else payload.accumulatedMaterial /= p; @@ -127,8 +125,8 @@ void Scene::traceRay(Ray ray, Payload& payload, const float tmin, const float tm // TODO: Next Event Estimation for mesh lights // indirect lighting - float r1 = 2 * std::numbers::pi * rnd01.x; - float r2 = rnd01.y; + float r1 = 2 * std::numbers::pi * payload.rnd01.x; + float r2 = payload.rnd01.y; float r2s = sqrt(r2); glm::vec3 w = info.hitInfo.normalLight; glm::vec3 u = glm::normalize(glm::cross(std::abs(w.x) > 0.1 ? glm::vec3(0, 1, 0) : glm::vec3(1, 0, 0), w)); diff --git a/src/util/Ray.h b/src/util/Ray.h index 8f0669b..8846011 100644 --- a/src/util/Ray.h +++ b/src/util/Ray.h @@ -3,6 +3,7 @@ struct Payload { + glm::vec3 rnd01; glm::vec3 accumulatedRadiance = glm::vec3(0); glm::vec3 accumulatedMaterial = glm::vec3(1); uint32_t depth = 0;