From 909d64079a228dfa9cccf8ed718efc322a038e7e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 13 Feb 2013 16:46:18 +0000 Subject: [PATCH] Fix #34226: cycles shadow pass got incorrectly influenced by world multiple importance sampleing. --- intern/cycles/device/device_cuda.cpp | 4 ++-- intern/cycles/kernel/kernel_emission.h | 2 +- intern/cycles/kernel/kernel_passes.h | 9 +-------- intern/cycles/kernel/kernel_types.h | 2 +- intern/cycles/render/light.cpp | 15 +++++++++++++++ 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp index 0c590645808..399414d5966 100644 --- a/intern/cycles/device/device_cuda.cpp +++ b/intern/cycles/device/device_cuda.cpp @@ -109,11 +109,11 @@ public: } } -#ifdef NDEBUG +/*#ifdef NDEBUG #define cuda_abort() #else #define cuda_abort() abort() -#endif +#endif*/ #define cuda_assert(stmt) \ { \ diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 3b27a1f49c9..9787af535bb 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -141,7 +141,7 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li } /* return if it's a lamp for shadow pass */ - *is_lamp = (ls.prim == ~0); + *is_lamp = (ls.prim == ~0 && ls.type != LIGHT_BACKGROUND); return true; } diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 727639386ed..57dbdc2ffc1 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -125,14 +125,7 @@ __device_inline void kernel_write_light_passes(KernelGlobals *kg, __global float kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_color, sample, L->color_transmission); if(flag & PASS_SHADOW) { float4 shadow = L->shadow; - - /* bit of an ugly hack to compensate for emitting triangles influencing - * amount of samples we get for this pass */ - if(kernel_data.integrator.progressive && kernel_data.integrator.pdf_triangles != 0.0f) - shadow.w = 0.5f; - else - shadow.w = 1.0f; - + shadow.w = kernel_data.film.pass_shadow_scale; kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow); } #endif diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 773ea0c43fb..ddbda9240fb 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -610,9 +610,9 @@ typedef struct KernelFilm { int pass_ao; int pass_shadow; + float pass_shadow_scale; int pass_pad1; int pass_pad2; - int pass_pad3; } KernelFilm; typedef struct KernelBackground { diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index e7fb9514371..ccc6c5142bd 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -143,6 +143,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen /* count */ size_t num_lights = scene->lights.size(); + size_t num_background_lights = 0; size_t num_triangles = 0; size_t num_curve_segments = 0; @@ -306,6 +307,8 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen if(light->size > 0.0f && light->use_mis) use_lamp_mis = true; + if(light->type == LIGHT_BACKGROUND) + num_background_lights++; } /* normalize cumulative distribution functions */ @@ -324,6 +327,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen /* update device */ KernelIntegrator *kintegrator = &dscene->data.integrator; + KernelFilm *kfilm = &dscene->data.film; kintegrator->use_direct_light = (totarea > 0.0f); if(kintegrator->use_direct_light) { @@ -354,6 +358,16 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen kintegrator->use_lamp_mis = use_lamp_mis; + /* bit of an ugly hack to compensate for emitting triangles influencing + * amount of samples we get for this pass */ + if(scene->integrator->progressive && kintegrator->pdf_triangles != 0.0f) + kfilm->pass_shadow_scale = 0.5f; + else + kfilm->pass_shadow_scale = 1.0f; + + if(num_background_lights < num_lights) + kfilm->pass_shadow_scale *= (float)(num_lights - num_background_lights)/(float)num_lights; + /* CDF */ device->tex_alloc("__light_distribution", dscene->light_distribution); } @@ -366,6 +380,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen kintegrator->pdf_lights = 0.0f; kintegrator->inv_pdf_lights = 0.0f; kintegrator->use_lamp_mis = false; + kfilm->pass_shadow_scale = 1.0f; } }