forked from bartvdbraak/blender
Fix #34226: cycles shadow pass got incorrectly influenced by world multiple
importance sampleing.
This commit is contained in:
parent
8a20930c71
commit
909d64079a
@ -109,11 +109,11 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NDEBUG
|
/*#ifdef NDEBUG
|
||||||
#define cuda_abort()
|
#define cuda_abort()
|
||||||
#else
|
#else
|
||||||
#define cuda_abort() abort()
|
#define cuda_abort() abort()
|
||||||
#endif
|
#endif*/
|
||||||
|
|
||||||
#define cuda_assert(stmt) \
|
#define cuda_assert(stmt) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -141,7 +141,7 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* return if it's a lamp for shadow pass */
|
/* 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;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_color, sample, L->color_transmission);
|
||||||
if(flag & PASS_SHADOW) {
|
if(flag & PASS_SHADOW) {
|
||||||
float4 shadow = L->shadow;
|
float4 shadow = L->shadow;
|
||||||
|
shadow.w = kernel_data.film.pass_shadow_scale;
|
||||||
/* 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;
|
|
||||||
|
|
||||||
kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow);
|
kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -610,9 +610,9 @@ typedef struct KernelFilm {
|
|||||||
int pass_ao;
|
int pass_ao;
|
||||||
|
|
||||||
int pass_shadow;
|
int pass_shadow;
|
||||||
|
float pass_shadow_scale;
|
||||||
int pass_pad1;
|
int pass_pad1;
|
||||||
int pass_pad2;
|
int pass_pad2;
|
||||||
int pass_pad3;
|
|
||||||
} KernelFilm;
|
} KernelFilm;
|
||||||
|
|
||||||
typedef struct KernelBackground {
|
typedef struct KernelBackground {
|
||||||
|
@ -143,6 +143,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
|
|||||||
|
|
||||||
/* count */
|
/* count */
|
||||||
size_t num_lights = scene->lights.size();
|
size_t num_lights = scene->lights.size();
|
||||||
|
size_t num_background_lights = 0;
|
||||||
size_t num_triangles = 0;
|
size_t num_triangles = 0;
|
||||||
size_t num_curve_segments = 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)
|
if(light->size > 0.0f && light->use_mis)
|
||||||
use_lamp_mis = true;
|
use_lamp_mis = true;
|
||||||
|
if(light->type == LIGHT_BACKGROUND)
|
||||||
|
num_background_lights++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* normalize cumulative distribution functions */
|
/* normalize cumulative distribution functions */
|
||||||
@ -324,6 +327,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
|
|||||||
|
|
||||||
/* update device */
|
/* update device */
|
||||||
KernelIntegrator *kintegrator = &dscene->data.integrator;
|
KernelIntegrator *kintegrator = &dscene->data.integrator;
|
||||||
|
KernelFilm *kfilm = &dscene->data.film;
|
||||||
kintegrator->use_direct_light = (totarea > 0.0f);
|
kintegrator->use_direct_light = (totarea > 0.0f);
|
||||||
|
|
||||||
if(kintegrator->use_direct_light) {
|
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;
|
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 */
|
/* CDF */
|
||||||
device->tex_alloc("__light_distribution", dscene->light_distribution);
|
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->pdf_lights = 0.0f;
|
||||||
kintegrator->inv_pdf_lights = 0.0f;
|
kintegrator->inv_pdf_lights = 0.0f;
|
||||||
kintegrator->use_lamp_mis = false;
|
kintegrator->use_lamp_mis = false;
|
||||||
|
kfilm->pass_shadow_scale = 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user