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
+5 -6
View File
@@ -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
View File
@@ -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));
+1
View File
@@ -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;