From 71502fe38bb300bd3a1f5c0cd0a5d2be05bc52e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?arvid=20schr=C3=B6der?= Date: Mon, 28 Nov 2022 23:51:33 +0100 Subject: [PATCH] Updated CookTorrance --- shader/cooktorranceshader.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/shader/cooktorranceshader.cpp b/shader/cooktorranceshader.cpp index 935c8c9..5d019c5 100644 --- a/shader/cooktorranceshader.cpp +++ b/shader/cooktorranceshader.cpp @@ -14,9 +14,9 @@ Color CookTorranceShader::shade(Scene const &scene, Ray const &ray) const { for (auto &light: scene.lights()) { auto illum = light->illuminate(scene, ray); auto N = ray.normal; - auto H = Vector3d{}; auto V = ray.direction; auto L = illum.direction; + auto H = normalized(V + L); auto NV = dotProduct(N, V); auto NL = dotProduct(N, L); @@ -27,32 +27,32 @@ Color CookTorranceShader::shade(Scene const &scene, Ray const &ray) const { - auto rhoS = F(VH) * D(NH) * G(NH, NV, VH, NL) / (PI * NV * NL); + auto rhoS = F(VH) * D(NH) * G(NH, NV, VH, NL) / (4 * NV * NL); auto rhoPD = diffuseColor * rhoD + ctColor * rhoS; - - - - - - - fragmentColor += illum.color * rhoPD; + fragmentColor += illum.color * std::abs(NL) * rhoPD; } - return fragmentColor * diffuseColor; + return diffuseColor * fragmentColor; } float CookTorranceShader::D(float NdotH) const { float divisor = 4.0f * m * m * std::pow(cos(NdotH), 4); - float exponent = -std::pow(tan(NdotH) / 2, 2); - return 1 / divisor * std::exp(exponent); + float exponent = std::pow(tan(NdotH) / m, 2); + return 1 / divisor * std::exp(- 1.0f * exponent); } float CookTorranceShader::F(float VdotH) const { - return 0.1f; + return F0 + (1 - F0) * std::pow(1 - VdotH, 5); } float CookTorranceShader::G(float NdotH, float NdotV, float VdotH, float NdotL) const { - return 1; + if (std::abs(NdotL) < 0.1f) { + return std::min(1.0f, std::min(2 * NdotH * NdotV / VdotH, 2 * NdotH * NdotL / VdotH)); + } else if (std::abs(NdotV) < 0.1f) { + return 2 * NdotH * NdotL / VdotH; + } else { + return 1; + } }