Cycles: Direct multi light sampling in the Branched Path Integrator is optional now.

Disabling this can improve performance, when we need a lot of AA Samples anyway, to clear up the render.

Simple example .blend: http://www.pasteall.org/blend/27582

Differential Revision: https://developer.blender.org/D392
This commit is contained in:
Thomas Dinges 2014-03-15 17:36:44 +01:00
parent cb4c49ad97
commit 211f08d89b
7 changed files with 19 additions and 6 deletions

@ -252,10 +252,17 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
items=enum_use_layer_samples, items=enum_use_layer_samples,
default='USE', default='USE',
) )
cls.sample_all_lights_direct = BoolProperty(
name="Sample All Direct Lights",
description="Sample all lights (for direct samples), rather than randomly picking one",
default=True,
)
cls.sample_all_lights_indirect = BoolProperty( cls.sample_all_lights_indirect = BoolProperty(
name="Sample All Lights", name="Sample All Indirect Lights",
description="Sample all lights (for indirect samples), rather than randomly picking one", description="Sample all lights (for indirect samples), rather than randomly picking one",
default=False, default=True,
) )
cls.no_caustics = BoolProperty( cls.no_caustics = BoolProperty(

@ -134,6 +134,7 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
sub.prop(cscene, "aa_samples", text="Render") sub.prop(cscene, "aa_samples", text="Render")
sub.prop(cscene, "preview_aa_samples", text="Preview") sub.prop(cscene, "preview_aa_samples", text="Preview")
sub.separator() sub.separator()
sub.prop(cscene, "sample_all_lights_direct")
sub.prop(cscene, "sample_all_lights_indirect") sub.prop(cscene, "sample_all_lights_indirect")
col = split.column() col = split.column()

@ -198,6 +198,7 @@ void BlenderSync::sync_integrator()
integrator->method = (Integrator::Method)get_enum(cscene, "progressive"); integrator->method = (Integrator::Method)get_enum(cscene, "progressive");
integrator->sample_all_lights_direct = get_boolean(cscene, "sample_all_lights_direct");
integrator->sample_all_lights_indirect = get_boolean(cscene, "sample_all_lights_indirect"); integrator->sample_all_lights_indirect = get_boolean(cscene, "sample_all_lights_indirect");
int diffuse_samples = get_int(cscene, "diffuse_samples"); int diffuse_samples = get_int(cscene, "diffuse_samples");

@ -957,7 +957,8 @@ ccl_device_noinline void kernel_branched_path_integrate_lighting(KernelGlobals *
PathState *state, PathRadiance *L, ccl_global float *buffer) PathState *state, PathRadiance *L, ccl_global float *buffer)
{ {
#ifdef __EMISSION__ #ifdef __EMISSION__
kernel_branched_path_integrate_direct_lighting(kg, rng, sd, state, throughput, num_samples_adjust, L, true); bool all = kernel_data.integrator.sample_all_lights_direct;
kernel_branched_path_integrate_direct_lighting(kg, rng, sd, state, throughput, num_samples_adjust, L, all);
#endif #endif
for(int i = 0; i< sd->num_closure; i++) { for(int i = 0; i< sd->num_closure; i++) {

@ -836,6 +836,7 @@ typedef struct KernelIntegrator {
int ao_samples; int ao_samples;
int mesh_light_samples; int mesh_light_samples;
int subsurface_samples; int subsurface_samples;
int sample_all_lights_direct;
int sample_all_lights_indirect; int sample_all_lights_indirect;
/* mis */ /* mis */
@ -850,7 +851,6 @@ typedef struct KernelIntegrator {
int volume_max_steps; int volume_max_steps;
float volume_step_size; float volume_step_size;
int volume_samples; int volume_samples;
int pad1;
} KernelIntegrator; } KernelIntegrator;
typedef struct KernelBVH { typedef struct KernelBVH {

@ -130,6 +130,7 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene
kintegrator->mesh_light_samples = mesh_light_samples; kintegrator->mesh_light_samples = mesh_light_samples;
kintegrator->subsurface_samples = subsurface_samples; kintegrator->subsurface_samples = subsurface_samples;
kintegrator->volume_samples = volume_samples; kintegrator->volume_samples = volume_samples;
kintegrator->sample_all_lights_direct = sample_all_lights_direct;
kintegrator->sample_all_lights_indirect = sample_all_lights_indirect; kintegrator->sample_all_lights_indirect = sample_all_lights_indirect;
kintegrator->sampling_pattern = sampling_pattern; kintegrator->sampling_pattern = sampling_pattern;
@ -199,6 +200,7 @@ bool Integrator::modified(const Integrator& integrator)
volume_samples == integrator.volume_samples && volume_samples == integrator.volume_samples &&
motion_blur == integrator.motion_blur && motion_blur == integrator.motion_blur &&
sampling_pattern == integrator.sampling_pattern && sampling_pattern == integrator.sampling_pattern &&
sample_all_lights_direct == integrator.sample_all_lights_direct &&
sample_all_lights_indirect == integrator.sample_all_lights_indirect); sample_all_lights_indirect == integrator.sample_all_lights_indirect);
} }

@ -63,6 +63,7 @@ public:
int mesh_light_samples; int mesh_light_samples;
int subsurface_samples; int subsurface_samples;
int volume_samples; int volume_samples;
bool sample_all_lights_direct;
bool sample_all_lights_indirect; bool sample_all_lights_indirect;
enum Method { enum Method {