removing thread local random

This commit is contained in:
Dynamitos
2025-01-26 23:00:13 +01:00
parent 8e47831fb2
commit 4168a31719
7 changed files with 40 additions and 14 deletions
+4
View File
@@ -0,0 +1,4 @@
[Window][Debug##Default]
Pos=60,60
Size=400,400
+21
View File
@@ -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"
}
]
}
+5 -2
View File
@@ -21,7 +21,6 @@ find_package(imgui CONFIG REQUIRED)
add_executable(RayTracer "") add_executable(RayTracer "")
target_include_directories(RayTracer PUBLIC src/) 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::Vulkan)
target_link_libraries(RayTracer PUBLIC Vulkan::Headers) target_link_libraries(RayTracer PUBLIC Vulkan::Headers)
target_link_libraries(RayTracer PUBLIC assimp::assimp) 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 GLEW::GLEW)
target_link_libraries(RayTracer PUBLIC glm::glm) target_link_libraries(RayTracer PUBLIC glm::glm)
target_link_libraries(RayTracer PUBLIC KTX::ktx) 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) 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/) add_subdirectory(src/)
+1 -1
+5 -6
View File
@@ -39,8 +39,6 @@ glm::vec3 rand01(glm::uvec3 x)
return glm::vec3(x) * (1.0f / float(0xffffffffU)); return glm::vec3(x) * (1.0f / float(0xffffffffU));
} }
thread_local glm::vec3 rnd01;
void Renderer::render(Camera camera, RenderParameter params) void Renderer::render(Camera camera, RenderParameter params)
{ {
for (int samp = 0; samp < params.numSamples; ++samp) for (int samp = 0; samp < params.numSamples; ++samp)
@@ -57,6 +55,7 @@ void Renderer::render(Camera camera, RenderParameter params)
// #pragma omp parallel for // #pragma omp parallel for
for (int h = 0; h < params.height; ++h) for (int h = 0; h < params.height; ++h)
{ {
Payload payload;
Ray cam = Ray(camera.position, glm::normalize(camera.target - camera.position)); Ray cam = Ray(camera.position, glm::normalize(camera.target - camera.position));
glm::vec3 cx = 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))), 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 //-- sample sensor
glm::uvec2 pix = glm::uvec2(w, h); 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 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(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 = 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 lensX = glm::cross(lensN, glm::vec3(0, 1, 0)); // the exact vector doesnt matter
glm::vec3 lensY = glm::cross(lensN, lensX); 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; 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); float t = glm::dot(focalPoint - r.origin, lensN) / glm::dot(r.direction, lensN);
glm::vec3 focus = r.origin + t * r.direction; glm::vec3 focus = r.origin + t * r.direction;
r = Ray(lensSample, normalize(focus - lensSample)); // TODO: Fix lens r = Ray(lensSample, normalize(focus - lensSample)); // TODO: Fix lens
Payload payload;
bvh.traceRay(r, payload, 1e-4, 1e20); bvh.traceRay(r, payload, 1e-4, 1e20);
accumulator[w + h * params.width] += payload.accumulatedRadiance; accumulator[w + h * params.width] += payload.accumulatedRadiance;
+3 -5
View File
@@ -77,8 +77,6 @@ void Scene::generate()
hierarchy = std::move(pendingNodes[0]); hierarchy = std::move(pendingNodes[0]);
} }
extern glm::vec3 rnd01;
void Scene::traceRay(Ray ray, Payload& payload, const float tmin, const float tmax) const noexcept void Scene::traceRay(Ray ray, Payload& payload, const float tmin, const float tmax) const noexcept
{ {
IntersectionInfo info = generateIntersections(hierarchy, ray, tmin, tmax); 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) else if (payload.depth > 5)
{ {
if (rnd01.z >= p) if (payload.rnd01.z >= p)
return; return;
else else
payload.accumulatedMaterial /= p; 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 // TODO: Next Event Estimation for mesh lights
// indirect lighting // indirect lighting
float r1 = 2 * std::numbers::pi * rnd01.x; float r1 = 2 * std::numbers::pi * payload.rnd01.x;
float r2 = rnd01.y; float r2 = payload.rnd01.y;
float r2s = sqrt(r2); float r2s = sqrt(r2);
glm::vec3 w = info.hitInfo.normalLight; 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)); glm::vec3 u = glm::normalize(glm::cross(std::abs(w.x) > 0.1 ? glm::vec3(0, 1, 0) : glm::vec3(1, 0, 0), w));
+1
View File
@@ -3,6 +3,7 @@
struct Payload struct Payload
{ {
glm::vec3 rnd01;
glm::vec3 accumulatedRadiance = glm::vec3(0); glm::vec3 accumulatedRadiance = glm::vec3(0);
glm::vec3 accumulatedMaterial = glm::vec3(1); glm::vec3 accumulatedMaterial = glm::vec3(1);
uint32_t depth = 0; uint32_t depth = 0;