cloudy-raytracer/shader/brdfshader.cpp

58 lines
2.6 KiB
C++
Raw Normal View History

2022-11-30 17:29:04 +01:00
#include <array>
2022-11-25 14:58:29 +01:00
#include "light/light.h"
#include "scene/scene.h"
#include "shader/brdfshader.h"
BrdfShader::BrdfShader(char const *fileName, Color const &scale)
2022-11-29 13:15:48 +01:00
: scale(scale), brdf(std::make_unique<BRDFRead>(fileName)) {}
2022-11-25 14:58:29 +01:00
Color BrdfShader::shade(Scene const &scene, Ray const &ray) const {
2022-11-29 13:15:48 +01:00
Color illuminationColor;
static auto rebase = [](Vector3d const &axis_x,
Vector3d const &axis_y,
Vector3d const &axis_z,
Vector3d const &vec) {
auto det = axis_x.x * axis_y.y * axis_z.z +
axis_x.y * axis_y.z * axis_z.x +
axis_x.z * axis_y.x * axis_z.y -
axis_x.x * axis_y.z * axis_z.y -
axis_x.y * axis_y.x * axis_z.z -
axis_x.z * axis_y.y * axis_z.x;
// Calculate resulting vector by using inverse matrix of new base vectors
return Vector3d{
((axis_y.y * axis_z.z - axis_y.z * axis_z.y) * vec.x +
(axis_y.z * axis_z.x - axis_y.x * axis_z.z) * vec.y +
2022-11-30 17:29:04 +01:00
(axis_y.x * axis_z.y - axis_z.x * axis_y.y) * vec.z) / det,
2022-11-29 13:15:48 +01:00
((axis_x.z * axis_z.y - axis_x.y * axis_z.z) * vec.x +
2022-11-30 17:29:04 +01:00
(axis_x.x * axis_z.z - axis_x.z * axis_z.x) * vec.y +
(axis_z.x * axis_x.y - axis_x.x * axis_z.y) * vec.z) / det,
2022-11-29 13:15:48 +01:00
((axis_x.y * axis_y.z - axis_x.z * axis_y.y) * vec.x +
2022-11-30 17:29:04 +01:00
(axis_y.x * axis_x.z - axis_x.x * axis_y.z) * vec.y +
(axis_x.x * axis_y.y - axis_y.x * axis_x.y) * vec.z) / det
2022-11-29 13:15:48 +01:00
};
};
for (auto &light: scene.lights()) {
auto illum = light->illuminate(scene, ray);
auto axis = orthoNormalized(ray.normal, ray.direction, illum.direction);
auto axis_y = std::get<0>(axis);
auto axis_x = std::get<1>(axis);
auto axis_z = std::get<2>(axis);
auto N = normalized(rebase(axis_x, axis_y, axis_z, ray.normal));
auto D = normalized(rebase(axis_x, axis_y, axis_z, ray.direction));
auto L = normalized(rebase(axis_x, axis_y, axis_z, illum.direction));
D = axis_y * D.y + axis_z * D.z;
L = axis_y * L.y + axis_z * L.z;
illuminationColor += brdf->lookupBrdfValues(std::acos(dotProduct(illum.direction, ray.normal)),
0,
std::acos(dotProduct(ray.direction, ray.normal)),
std::acos(dotProduct(D, L)));
}
// IMPLEMENT ME
return illuminationColor;
2022-11-25 14:58:29 +01:00
}