diff --git a/shader/brdfshader.cpp b/shader/brdfshader.cpp index ab77d37..9d04762 100644 --- a/shader/brdfshader.cpp +++ b/shader/brdfshader.cpp @@ -3,11 +3,55 @@ #include "shader/brdfshader.h" BrdfShader::BrdfShader(char const *fileName, Color const &scale) - : scale(scale), brdf(std::make_unique(fileName)) {} + : scale(scale), brdf(std::make_unique(fileName)) {} Color BrdfShader::shade(Scene const &scene, Ray const &ray) const { - Color illuminationColor; + 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 + + (axis_y.x * axis_z.y - axis_y.y * axis_z.x) * vec.z) / det, + ((axis_x.z * axis_z.y - axis_x.y * axis_z.z) * vec.x + + (axis_x.x * axis_z.z - axis_x.x * axis_y.z) * vec.y + + (axis_x.y * axis_z.x - axis_x.x * axis_y.x) * vec.z) / det, + ((axis_x.y * axis_y.z - axis_x.z * axis_y.y) * vec.x + + (axis_x.z * axis_y.x - axis_x.x * axis_y.z) * vec.y + + (axis_x.x * axis_y.y - axis_x.y * axis_y.x) * vec.z) / det + }; - // IMPLEMENT ME - return illuminationColor; + }; + + 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; }