diff --git a/Assignments/Assignment1/Application1.cpp b/Assignments/Assignment1/Application1.cpp index aeacbbc..24d8721 100644 --- a/Assignments/Assignment1/Application1.cpp +++ b/Assignments/Assignment1/Application1.cpp @@ -73,7 +73,7 @@ void Application1::veachScene() { } // Function that selects implementation at runtime -Vec3fa Application1::renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application1::renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { if (selected == 0) { return renderPixelOrig(x, y, camera, stats, sampler); } else if (selected == 1) { @@ -87,7 +87,7 @@ Vec3fa Application1::renderPixel(float x, float y, const ISPCCamera& camera, Ray } } -Vec3fa Application1::renderPixelMIS(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application1::renderPixelMIS(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { /* radiance accumulator and weight */ Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -166,12 +166,12 @@ Vec3fa Application1::renderPixelMIS(float x, float y, const ISPCCamera& camera, Material__preprocess(material_array, matId, brdf, wo, sample); /* Light ray */ - int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int)(sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; const Light* l = data.scene->lights[id]; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); Vec3fa light_diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); @@ -207,7 +207,7 @@ Vec3fa Application1::renderPixelMIS(float x, float y, const ISPCCamera& camera, } // Use cosine sampling - Vec2f uv = RandomSampler_get2D(sampler); + Vec2f uv = sampler.get2D(); Sample3f wi = cosineSampleHemisphere(uv.x, uv.y, sample.Ng); Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, wi.v); @@ -222,7 +222,7 @@ Vec3fa Application1::renderPixelMIS(float x, float y, const ISPCCamera& camera, return L; } -Vec3fa Application1::renderPixelNextEventEstimation(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application1::renderPixelNextEventEstimation(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { /* radiance accumulator and weight */ Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -274,12 +274,12 @@ Vec3fa Application1::renderPixelNextEventEstimation(float x, float y, const ISPC Material__preprocess(material_array, matId, brdf, wo, sample); /* Light ray */ - int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int)(sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; const Light* l = data.scene->lights[id]; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); Vec3fa light_diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); @@ -302,7 +302,7 @@ Vec3fa Application1::renderPixelNextEventEstimation(float x, float y, const ISPC // Use cosine sampling - Vec2f uv = RandomSampler_get2D(sampler); + Vec2f uv = sampler.get2D(); Sample3f wi = cosineSampleHemisphere(uv.x, uv.y, sample.Ng); Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, wi.v); @@ -317,7 +317,7 @@ Vec3fa Application1::renderPixelNextEventEstimation(float x, float y, const ISPC } -Vec3fa Application1::renderPixelPathTracer(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application1::renderPixelPathTracer(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { /* radiance accumulator and weight */ Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -368,7 +368,7 @@ Vec3fa Application1::renderPixelPathTracer(float x, float y, const ISPCCamera& c // Use cosine sampling - Vec2f uv = RandomSampler_get2D(sampler); + Vec2f uv = sampler.get2D(); Sample3f wi = cosineSampleHemisphere(uv.x, uv.y, sample.Ng); Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, wi.v); @@ -383,7 +383,7 @@ Vec3fa Application1::renderPixelPathTracer(float x, float y, const ISPCCamera& c } /* task that renders a single screen tile (original implementation) */ -Vec3fa Application1::renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application1::renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { /* radiance accumulator and weight */ Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -427,14 +427,14 @@ Vec3fa Application1::renderPixelOrig(float x, float y, const ISPCCamera& camera, /* sample BRDF at hit point */ // Sample3f wi1; - // Material__sample(material_array, matId, brdf, Lw, wo, sample, wi1, RandomSampler_get2D(sampler)); + // Material__sample(material_array, matId, brdf, Lw, wo, sample, wi1, RandomSamplerWrapper_get2D(sampler)); - int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int)(sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; const Light* l = data.scene->lights[id]; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); diff --git a/Assignments/Assignment1/Application1.h b/Assignments/Assignment1/Application1.h index 80aeb6b..186bc07 100644 --- a/Assignments/Assignment1/Application1.h +++ b/Assignments/Assignment1/Application1.h @@ -9,11 +9,11 @@ public: } private: - Vec3fa renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) override; - Vec3fa renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); - Vec3fa renderPixelPathTracer(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); - Vec3fa renderPixelNextEventEstimation(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); - Vec3fa renderPixelMIS(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); + Vec3fa renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) override; + Vec3fa renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); + Vec3fa renderPixelPathTracer(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); + Vec3fa renderPixelNextEventEstimation(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); + Vec3fa renderPixelMIS(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); void drawGUI() override { ImGui::InputInt("Ray depth", &ray_depth); diff --git a/Assignments/Assignment2/Application2.cpp b/Assignments/Assignment2/Application2.cpp index e3ae45b..e65b61e 100644 --- a/Assignments/Assignment2/Application2.cpp +++ b/Assignments/Assignment2/Application2.cpp @@ -134,7 +134,7 @@ Sample createSample(Ray &ray) { } // Function that selects implementation at runtime -Vec3fa Application2::renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application2::renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { if (selected == 0) { return renderPixelOrig(x, y, camera, stats, sampler); } else if (selected == 1) { @@ -148,7 +148,7 @@ Vec3fa Application2::renderPixel(float x, float y, const ISPCCamera& camera, Ray } } -Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -177,7 +177,7 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam t = inf; } else { // printf("%f\n", density); - t = - std::log(1.0 - RandomSampler_get1D(sampler)) / max_density; + t = - std::log(1.0 - sampler.get1D()) / max_density; } if (t > 0.0 && t < ray.tfar) { @@ -187,7 +187,7 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam break; } - float r = RandomSampler_get1D(sampler); + float r = sampler.get1D(); Vec3fa p = ray.org + t * ray.dir; // printf("%f\t%f\t(%f,%f,%f)\n", t, ray.tfar, p.x, p.y, p.z); float s = data.densityGrid->sampleW(p); @@ -198,10 +198,10 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam // printf("(%f,%f,%f)\tr: %f\t%f\ts: %f\t%f\tp:%f\n",p.x, p.y, p.z , r, r * max_density, s, s * density, (s * density) / max_density); // } - if (RandomSampler_get1D(sampler) * max_density < s * density) { + if (sampler.get1D() * max_density < s * density) { // NEE - int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int)(sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; const Light* l = data.scene->lights.at(id); @@ -210,7 +210,7 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam sample.Ng = ray.dir; sample.Ns = ray.dir; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); /* initialize shadow ray */ Ray shadow(sample.P, ls.dir, EPS, ls.dist - EPS, 0.0f); @@ -227,7 +227,7 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam float nee_T = 1.0; float nee_t = 0.0; while (1) { - float r = RandomSampler_get1D(sampler); + float r = sampler.get1D(); nee_t -= std::log(1 - r) / max_density; @@ -247,7 +247,7 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam float pdf; - Vec3fa o = sample_phase_function(-ray.dir, scattering_parameter, RandomSampler_get2D(sampler), pdf); + Vec3fa o = sample_phase_function(-ray.dir, scattering_parameter, sampler.get2D(), pdf); float temp = data.tempGrid->sampleW(p); // Sample density from the grid // float temp = 20; @@ -310,7 +310,7 @@ Vec3fa Application2::renderPixelHeterogeneousNEE(float x, float y, const ISPCCam return L; } -Vec3fa Application2::renderPixelHeterogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application2::renderPixelHeterogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -339,7 +339,7 @@ Vec3fa Application2::renderPixelHeterogeneous(float x, float y, const ISPCCamera t = inf; } else { // printf("%f\n", density); - t = - std::log(1.0 - RandomSampler_get1D(sampler)) / max_density; + t = - std::log(1.0 - sampler.get1D()) / max_density; } if (t > 0.0 && t < ray.tfar) { @@ -350,7 +350,7 @@ Vec3fa Application2::renderPixelHeterogeneous(float x, float y, const ISPCCamera // return Vec3fa(0.0, 0.0, 10.0); } - float r = RandomSampler_get1D(sampler); + float r = sampler.get1D(); Vec3fa p = ray.org + t * ray.dir; // printf("%f\t%f\t(%f,%f,%f)\n", t, ray.tfar, p.x, p.y, p.z); float s = data.densityGrid->sampleW(p); @@ -361,11 +361,11 @@ Vec3fa Application2::renderPixelHeterogeneous(float x, float y, const ISPCCamera // printf("(%f,%f,%f)\tr: %f\t%f\ts: %f\t%f\tp:%f\n",p.x, p.y, p.z , r, r * max_density, s, s * density, (s * density) / max_density); // } - if (RandomSampler_get1D(sampler) * max_density < s * density) { + if (sampler.get1D() * max_density < s * density) { float pdf; - Vec3fa o = sample_phase_function(-ray.dir, scattering_parameter, RandomSampler_get2D(sampler), pdf); + Vec3fa o = sample_phase_function(-ray.dir, scattering_parameter, sampler.get2D(), pdf); float temp = data.tempGrid->sampleW(p); // Sample density from the grid // float temp = 20; @@ -425,7 +425,7 @@ Vec3fa Application2::renderPixelHeterogeneous(float x, float y, const ISPCCamera return L; } -Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { /* radiance accumulator and weight */ Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -452,7 +452,7 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& t = inf; } else { // printf("%f\n", density); - t = - std::log(1.0 - RandomSampler_get1D(sampler)) / density; + t = - std::log(1.0 - sampler.get1D()) / density; } // if (t != t | t <= 0) { @@ -465,7 +465,7 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& // Nee /* Light ray */ // return {0.0, 0.0, 1.0}; - int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int)(sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; const Light* l = data.scene->lights.at(id); @@ -474,7 +474,7 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& sample.Ng = ray.dir; sample.Ns = ray.dir; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); /* initialize shadow ray */ Ray shadow(sample.P, ls.dir, EPS, ls.dist - EPS, 0.0f); @@ -550,7 +550,7 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& // new direction float pdf; - Vec3fa o = sample_phase_function(-ray.dir, scattering_parameter, RandomSampler_get2D(sampler), pdf); + Vec3fa o = sample_phase_function(-ray.dir, scattering_parameter, sampler.get2D(), pdf); Lw *= 1.0 - absorbtion; @@ -590,13 +590,13 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& } else { /* Light ray */ - int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int)(sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; // printf("id: %d\n", id); const Light* l = data.scene->lights.at(id); - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); Vec3fa light_diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); @@ -669,7 +669,7 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& // Use cosine sampling - Vec2f uv = RandomSampler_get2D(sampler); + Vec2f uv = sampler.get2D(); Sample3f wi = cosineSampleHemisphere(uv.x, uv.y, sample.Ng); Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, wi.v); @@ -687,7 +687,7 @@ Vec3fa Application2::renderPixelHomogeneous(float x, float y, const ISPCCamera& } /* task that renders a single screen tile */ -Vec3fa Application2::renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) { +Vec3fa Application2::renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) { /* radiance accumulator and weight */ Vec3fa L = Vec3fa(0.0f); Vec3fa Lw = Vec3fa(1.0f); @@ -769,7 +769,7 @@ Vec3fa Application2::renderPixelOrig(float x, float y, const ISPCCamera& camera, // HG phase function float p = phase(g, angle); float pdf; - Vec3f dir = sample_phase_function(-ray.org, g, RandomSampler_get2D(sampler), pdf); + Vec3f dir = sample_phase_function(-ray.org, g, sampler.get2D(), pdf); // if -1.0 it means that we're out of the bounding box of the grid if (density != -1.0f) { @@ -813,14 +813,14 @@ Vec3fa Application2::renderPixelOrig(float x, float y, const ISPCCamera& camera, } else { /* sample BRDF at hit point */ Sample3f wi1; - Material__sample(material_array, matId, brdf, Lw, wo, sample, wi1, RandomSampler_get2D(sampler)); + Material__sample(material_array, matId, brdf, Lw, wo, sample, wi1, sampler.get2D()); - int id = (int) (RandomSampler_get1D(sampler) * data.scene->lights.size()); + int id = (int) (sampler.get1D() * data.scene->lights.size()); if (id == data.scene->lights.size()) id = data.scene->lights.size() - 1; const Light* l = data.scene->lights[id]; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); + Light_SampleRes ls = Lights_sample(l, sample, sampler.get2D()); Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); diff --git a/Assignments/Assignment2/Application2.h b/Assignments/Assignment2/Application2.h index a1b8b33..0f8c5fb 100644 --- a/Assignments/Assignment2/Application2.h +++ b/Assignments/Assignment2/Application2.h @@ -1,4 +1,5 @@ #pragma once +#include "application.h" #include "helper.hpp" #include "imgui.h" #include "math/vec3fa.h" @@ -10,11 +11,11 @@ public: } private: - Vec3fa renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) override; - Vec3fa renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); - Vec3fa renderPixelHomogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); - Vec3fa renderPixelHeterogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); - Vec3fa renderPixelHeterogeneousNEE(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler); + Vec3fa renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler) override; + Vec3fa renderPixelOrig(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); + Vec3fa renderPixelHomogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); + Vec3fa renderPixelHeterogeneous(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); + Vec3fa renderPixelHeterogeneousNEE(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSamplerWrapper& sampler); void drawGUI() override { ImGui::Checkbox("Bounding Box", &boundingBox); @@ -55,10 +56,7 @@ private: } void clear() { - data.accu_count = 0;; - for (size_t i = 0; i < data.accu_width * data.accu_height; i++) { - data.accu[i] = Vec3fx(0.0); - } + Application::resetRender(); } void initScene() override;