bugfix: clamp

This commit is contained in:
Shuo Feng 2024-03-04 02:25:59 -05:00
parent efab58561a
commit b5878e06c9
Signed by: sfeng
GPG key ID: 1E83AE6CD1C037B1
4 changed files with 13 additions and 12 deletions

View file

@ -30,16 +30,18 @@ Vector3f PointLight::illumination(const HitRecord &hit,
return Vector3f::Zero(); return Vector3f::Zero();
Vector3f ambient_ = geometry->coefAmbient() * geometry->ambient(); Vector3f ambient_ = geometry->coefAmbient() * geometry->ambient();
Vector3f diffuse_ = geometry->coefDiffuse() * diffuse.array() *
geometry->diffuse().array() * Vector3f diffuse_ = geometry->coefDiffuse() * geometry->diffuse().array() *
diffuse.array() *
std::max(0.0f, hit.normal().dot(rayDirection)); std::max(0.0f, hit.normal().dot(rayDirection));
Vector3f halfWay = (hit.viewDirection() + rayDirection).normalized(); Vector3f halfWay = (hit.viewDirection() + rayDirection).normalized();
Vector3f specular_ = Vector3f specular_ =
geometry->coefSpecular() * specular.array() * geometry->coefSpecular() * geometry->specular().array() *
geometry->specular().array() * specular.array() *
pow(std::max(0.0f, hit.normal().dot(halfWay)), geometry->getPhong()); pow(std::max(0.0f, hit.normal().dot(halfWay)), geometry->getPhong());
return diffuse_ + specular_ + ambient_;
return specular_ + ambient_ + diffuse_;
} }
Vector3f AreaLight::illumination(const HitRecord &hit, Vector3f AreaLight::illumination(const HitRecord &hit,

View file

@ -1,6 +1,5 @@
#include "Output.h" #include "Output.h"
#include <algorithm>
#include <fstream> #include <fstream>
void Output::write() { void Output::write() {
@ -9,9 +8,9 @@ void Output::write() {
for (unsigned int y = 0; y < height; ++y) for (unsigned int y = 0; y < height; ++y)
for (unsigned int x = 0; x < width; ++x) for (unsigned int x = 0; x < width; ++x)
fout << (char)std::min(255.0f, 255.0f * red[y * width + x]) fout << (char)(255.0f * red[y * width + x])
<< (char)std::min(255.0f, 255.0f * green[y * width + x]) << (char)(255.0f * green[y * width + x])
<< (char)std::min(255.0f, 255.0f * blue[y * width + x]); << (char)(255.0f * blue[y * width + x]);
fout.close(); fout.close();
} }

View file

@ -31,10 +31,11 @@ void RayTracer::calculateColor(const HitRecord &hit, Output *buffer, int i) {
buffer->r(i, 0); buffer->r(i, 0);
buffer->g(i, 0); buffer->g(i, 0);
buffer->b(i, 0); buffer->b(i, 0);
for (auto light : lights) for (auto light : lights)
if (light->isUse()) { if (light->isUse()) {
Vector3f contribution = light->illumination(hit, geometries); Vector3f contribution =
light->illumination(hit, geometries).cwiseMax(0.0f).cwiseMin(1.0f) /
lights.size();
buffer->r(i, buffer->r(i) + contribution.x()); buffer->r(i, buffer->r(i) + contribution.x());
buffer->g(i, buffer->g(i) + contribution.y()); buffer->g(i, buffer->g(i) + contribution.y());
buffer->b(i, buffer->b(i) + contribution.z()); buffer->b(i, buffer->b(i) + contribution.z());

View file

@ -7,7 +7,6 @@
#include "Output.h" #include "Output.h"
#include "Scene.h" #include "Scene.h"
#include <utility>
#include <vector> #include <vector>
class RayTracer { class RayTracer {