From 71fbf193d1473f1741a57d3585af4daf006617dd Mon Sep 17 00:00:00 2001 From: Pedro Jorquera Date: Mon, 25 Mar 2024 20:37:37 +0100 Subject: [PATCH] Added support for rendering diffuse area lights --- README.md | 5 ++++- docs/render-light.png | Bin 0 -> 1483259 bytes src/camera.cpp | 31 ++++++++++++++++++------------- src/camera.h | 5 +++++ src/main.cpp | 24 ++++++++++++++++++++---- src/material.h | 24 ++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 docs/render-light.png diff --git a/README.md b/README.md index b866827..e9ea5a4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ A simple C++ Raytracer based on "Ray Tracing in One Weekend" book. ![render image with motion blur](docs/render-motion-blur.png) -![render image with marble textyre](docs/render-marble.png) +![render image with marble texture](docs/render-marble.png) + +![render image with diffuse light](docs/render-light.png) ## Features @@ -25,6 +27,7 @@ A simple C++ Raytracer based on "Ray Tracing in One Weekend" book. * Motion blur. * Checked textures. * Perlin noise based textures. +* Diffuse area light. ## Building diff --git a/docs/render-light.png b/docs/render-light.png new file mode 100644 index 0000000000000000000000000000000000000000..c8cfd9fdd68d2e035dbc05b3af790f1b50688303 GIT binary patch literal 1483259 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