removing thread local random
This commit is contained in:
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
[Window][Debug##Default]
|
||||
Pos=60,60
|
||||
Size=400,400
|
||||
|
||||
Vendored
+21
@@ -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
@@ -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/)
|
||||
Vendored
+1
-1
Submodule external/vcpkg updated: 791ae5e74b...01be99fec0
@@ -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;
|
||||
|
||||
+3
-5
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user