From 342c9fdef273ef32c39d00087f5173b6c1e535d7 Mon Sep 17 00:00:00 2001 From: vonhyou Date: Thu, 21 Mar 2024 17:37:00 -0400 Subject: [PATCH] antialiasing --- src/RayTracer.cc | 46 ++++++++++++++++++++++++++-------------------- src/RayTracer.h | 3 ++- src/Scene.cc | 2 ++ src/Scene.h | 1 + 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/RayTracer.cc b/src/RayTracer.cc index c8244b8..2da8e8b 100644 --- a/src/RayTracer.cc +++ b/src/RayTracer.cc @@ -91,39 +91,37 @@ void RayTracer::render() { for (int x = 0; x < width; ++x) { Vector3f color = Scene::current->backgroundColor(); - if (Scene::current->globalIllum()) { + bool globalIllum = Scene::current->globalIllum(); + if (globalIllum || Scene::current->antiAliasing()) { int success = 0; Vector3f accumulate = Vector3f::Zero(); for (int j = 0; j < gridHeight; ++j) for (int i = 0; i < gridWidth; ++i) { - - if (x != width / 2 || y != height / 2 || i || j) - ; // goto DEBUG_COLOR; Ray ray = getRay(x, y, i, j); for (int rayNum = 0; rayNum < raysPerPixel; ++rayNum) { - utils::Optional result = trace(ray); + Optional result = + globalIllum ? trace(ray) : trace(ray, x, y); if (result.hasValue()) { accumulate += result.value(); success++; } } - - // std::cout << accumulate.transpose() << " (" << success << - // std::endl; } - if (success) - color = gammaCorrection(accumulate / success, 1.0f / 2.1f); + if (success) { + if (globalIllum) + color = gammaCorrection(accumulate / success, 1.0f / 2.1f); + else + color = accumulate / success; + } } else { Ray ray = getRay(x, y); - Optional hitRecord = getHitRecord(ray); - if (hitRecord.hasValue()) { - HitRecord hit = hitRecord.value(); - color = calculateColor(hit, y * width + x); - } + Optional result = trace(ray, x, y); + if (result.hasValue()) + color = result.value(); } - DEBUG_COLOR: + writeColor(y * width + x, clamp(color)); } } @@ -133,7 +131,7 @@ void RayTracer::render() { /** * Calculate color using phong model */ -Vector3f RayTracer::calculateColor(const HitRecord &hit, int i) const { +Vector3f RayTracer::calculateColor(const HitRecord &hit) const { Vector3f result(0, 0, 0); for (auto light : lights) result += light->isUse() ? light->illumination(hit, geometries) @@ -268,17 +266,25 @@ RETRY_TRACING: std::max(0.0f, hit.normal().dot(direction)); } -utils::Optional RayTracer::trace(Ray r) const { +Optional RayTracer::trace(Ray r, int x, int y) const { + Optional hitRecord = getHitRecord(r); + if (hitRecord.hasValue()) + return Optional(calculateColor(hitRecord.value())); + + return Optional::nullopt; +} + +Optional RayTracer::trace(Ray r) const { Optional hitRecord = getHitRecord(r); if (hitRecord.hasValue()) { Vector3f color = trace(hitRecord.value(), Scene::current->maxBounce(), Scene::current->probTerminate()); if (color != Vector3f::Zero()) - return utils::Optional(color); + return Optional(color); } - return utils::Optional::nullopt; + return Optional::nullopt; } namespace camera { diff --git a/src/RayTracer.h b/src/RayTracer.h index 2da4613..7995478 100644 --- a/src/RayTracer.h +++ b/src/RayTracer.h @@ -28,8 +28,9 @@ private: void render(); Optional getHitRecord(Ray, const Geometry *) const; Optional getHitRecord(Ray) const; - Vector3f calculateColor(const HitRecord &, int) const; + Vector3f calculateColor(const HitRecord &) const; Light *singleLightSource() const; + Optional trace(Ray, int, int) const; Optional trace(Ray) const; Vector3f trace(HitRecord, int, float) const; }; diff --git a/src/Scene.cc b/src/Scene.cc index 12c3e27..f8f561e 100644 --- a/src/Scene.cc +++ b/src/Scene.cc @@ -12,6 +12,8 @@ float Scene::fov() { return fov_; } bool Scene::globalIllum() { return globalIllum_; } +bool Scene::antiAliasing() { return antialiasing_; } + int Scene::maxBounce() { return maxBounce_; } float Scene::probTerminate() { return probTerminate_; } diff --git a/src/Scene.h b/src/Scene.h index fe033da..53b0ccf 100644 --- a/src/Scene.h +++ b/src/Scene.h @@ -41,6 +41,7 @@ public: int height(); float fov(); bool globalIllum(); + bool antiAliasing(); int maxBounce(); float probTerminate(); Vector3f ai() const;