removing thread local random
This commit is contained in:
@@ -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