From b142daa9248ebbd2ce3aa84658b7acf8a8aee7e4 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Tue, 17 May 2016 19:41:22 -0600 Subject: [PATCH] scale by pdf. scale by texture color --- light/ltface.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/light/ltface.c b/light/ltface.c index 1ad1699e..69af07b1 100644 --- a/light/ltface.c +++ b/light/ltface.c @@ -2418,15 +2418,20 @@ void IndirectLightAtPoint(const bsp2_t *bsp, const vec3_t origin, const vec3_t n vec3_t pointLight = {0,0,0}; LightAtPoint(ctx->bsp, traceHitpoint, hitface, pointLight); for (int k = 0; k < 3; k++) - contrib[k] = qmin(512.0f, pointLight[k]);// *(ctx->lightsurf.texturecolor[k] / 255.0f); + contrib[k] = qmin(512.0f, pointLight[k] * (ctx->lightsurf.texturecolor[k] / 255.0f)); #endif VectorAdd(indirect, contrib, indirect); //printf(" contrib: %f %f %f\n", contrib[0], contrib[1], contrib[2]); } } + + // this is the pdf for picking a uniformly distributed solid angle on a hemisphere. + // we're actually picking from a consine-weighted distribution. + const vec_t pdf = (1/(2 * Q_PI)); + // divide by (# of samples * pdf) // see: http://www.scratchapixel.com/lessons/3d-basic-rendering/global-illumination-path-tracing/global-illumination-path-tracing-practical-implementation - VectorScale(indirect, 1.0 / numsamples, indirect); + VectorScale(indirect, 1.0 / (numsamples * pdf), indirect); VectorCopy(indirect, colorout); }