Commit: 2fe4e806486debc9029f0ae8d3d4d7f754249164 Author: Sebastian Herholz Date: Fri Jan 20 16:27:38 2023 +0100 Branches: cycles_path_guiding https://developer.blender.org/rB2fe4e806486debc9029f0ae8d3d4d7f754249164
Guiding: Adding first implementation of RIS directional guiding =================================================================== M intern/cycles/blender/addon/properties.py M intern/cycles/blender/sync.cpp M intern/cycles/integrator/guiding.h M intern/cycles/kernel/data_template.h M intern/cycles/kernel/integrator/shade_surface.h M intern/cycles/kernel/integrator/surface_shader.h M intern/cycles/kernel/types.h M intern/cycles/scene/integrator.cpp =================================================================== diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index a90fd60a711..e0d7e1028de 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -209,11 +209,21 @@ enum_guiding_distribution = ( ) enum_guiding_directional_sampling_types = ( - ('PRODUCT', "Diffuse Product", "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)", 0), - ('RIS', "Re-sampled Importance Sampling", "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF", 1), - ('ROUGHNESS', "Roughness-based", "Adjust the guiding probability based on the roughness of the material components", 2), + ('PRODUCT', + "Diffuse Product", + "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)", + 0), + ('RIS', + "Re-sampled Importance Sampling", + "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF", + 1), + ('ROUGHNESS', + "Roughness-based", + "Adjust the guiding probability based on the roughness of the material components", + 2), ) + def enum_openimagedenoise_denoiser(self, context): import _cycles if _cycles.with_openimagedenoise: diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp index 68ab3ad3cb4..37e1cd55c46 100644 --- a/intern/cycles/blender/sync.cpp +++ b/intern/cycles/blender/sync.cpp @@ -441,8 +441,11 @@ void BlenderSync::sync_integrator(BL::ViewLayer &b_view_layer, bool background) GuidingDistributionType guiding_distribution_type = (GuidingDistributionType)get_enum( cscene, "guiding_distribution_type", GUIDING_NUM_TYPES, GUIDING_TYPE_PARALLAX_AWARE_VMM); integrator->set_guiding_distribution_type(guiding_distribution_type); - GuidingDirectionalSamplingType guiding_directional_sampling_type = (GuidingDirectionalSamplingType)get_enum( - cscene, "guiding_directional_sampling_type", GUIDING_DIRECTIONAL_SAMPLING_NUM_TYPES, GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT); + GuidingDirectionalSamplingType guiding_directional_sampling_type = + (GuidingDirectionalSamplingType)get_enum(cscene, + "guiding_directional_sampling_type", + GUIDING_DIRECTIONAL_SAMPLING_NUM_TYPES, + GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT); integrator->set_guiding_directional_sampling_type(guiding_directional_sampling_type); } diff --git a/intern/cycles/integrator/guiding.h b/intern/cycles/integrator/guiding.h index fa918d4ea4b..8aa61e3371d 100644 --- a/intern/cycles/integrator/guiding.h +++ b/intern/cycles/integrator/guiding.h @@ -25,7 +25,8 @@ struct GuidingParams { { return !((use == other.use) && (use_surface_guiding == other.use_surface_guiding) && (use_volume_guiding == other.use_volume_guiding) && (type == other.type) && - (sampling_type == other.sampling_type) && (training_samples == other.training_samples) && + (sampling_type == other.sampling_type) && + (training_samples == other.training_samples) && (deterministic == other.deterministic)); } }; diff --git a/intern/cycles/kernel/data_template.h b/intern/cycles/kernel/data_template.h index 93a1db64087..29bb98c99b6 100644 --- a/intern/cycles/kernel/data_template.h +++ b/intern/cycles/kernel/data_template.h @@ -211,7 +211,7 @@ KERNEL_STRUCT_MEMBER(integrator, int, use_guiding_direct_light) KERNEL_STRUCT_MEMBER(integrator, int, use_guiding_mis_weights) /* Padding. */ -//KERNEL_STRUCT_MEMBER(integrator, int, pad1) +// KERNEL_STRUCT_MEMBER(integrator, int, pad1) KERNEL_STRUCT_END(KernelIntegrator) /* SVM. For shader specialization. */ diff --git a/intern/cycles/kernel/integrator/shade_surface.h b/intern/cycles/kernel/integrator/shade_surface.h index 548867c7551..cc81dae8af0 100644 --- a/intern/cycles/kernel/integrator/shade_surface.h +++ b/intern/cycles/kernel/integrator/shade_surface.h @@ -367,21 +367,45 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce( float2 bsdf_sampled_roughness = make_float2(1.0f, 1.0f); float bsdf_eta = 1.0f; + float mis_pdf = 1.0f; #if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4 if (kernel_data.integrator.use_surface_guiding) { - label = surface_shader_bsdf_guided_sample_closure(kg, - state, - sd, - sc, - rand_bsdf, - &bsdf_eval, - &bsdf_wo, - &bsdf_pdf, - &unguided_bsdf_pdf, - &bsdf_sampled_roughness, - &bsdf_eta); - + if (kernel_data.integrator.guiding_directional_sampling_type == + GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT) { + label = surface_shader_bsdf_guided_sample_closure_mis(kg, + state, + sd, + sc, + rand_bsdf, + &bsdf_eval, + &bsdf_wo, + &bsdf_pdf, + &unguided_bsdf_pdf, + &bsdf_sampled_roughness, + &bsdf_eta); + mis_pdf = (unguided_bsdf_pdf > 0.f) ? bsdf_pdf : 0.f; + } + else if (kernel_data.integrator.guiding_directional_sampling_type == + GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS) { + label = surface_shader_bsdf_guided_sample_closure_ris(kg, + state, + sd, + sc, + rand_bsdf, + rng_state, + &bsdf_eval, + &bsdf_wo, + &bsdf_pdf, + &mis_pdf, + &unguided_bsdf_pdf, + &bsdf_sampled_roughness, + &bsdf_eta); + } + if (!(unguided_bsdf_pdf > 0.f)) { + bsdf_pdf = 0.f; + mis_pdf = 0.f; + } if (bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval)) { return LABEL_NONE; } @@ -404,7 +428,7 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce( if (bsdf_pdf == 0.0f || bsdf_eval_is_zero(&bsdf_eval)) { return LABEL_NONE; } - + mis_pdf = bsdf_pdf; unguided_bsdf_pdf = bsdf_pdf; } @@ -440,7 +464,7 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce( /* Update path state */ if (!(label & LABEL_TRANSPARENT)) { - INTEGRATOR_STATE_WRITE(state, path, mis_ray_pdf) = bsdf_pdf; + INTEGRATOR_STATE_WRITE(state, path, mis_ray_pdf) = mis_pdf; INTEGRATOR_STATE_WRITE(state, path, mis_origin_n) = sd->N; INTEGRATOR_STATE_WRITE(state, path, min_ray_pdf) = fminf( unguided_bsdf_pdf, INTEGRATOR_STATE(state, path, min_ray_pdf)); diff --git a/intern/cycles/kernel/integrator/surface_shader.h b/intern/cycles/kernel/integrator/surface_shader.h index ebca9810cbe..23e30c3e3f4 100644 --- a/intern/cycles/kernel/integrator/surface_shader.h +++ b/intern/cycles/kernel/integrator/surface_shader.h @@ -21,6 +21,8 @@ CCL_NAMESPACE_BEGIN +//#define RIS_COSINE + /* Guiding */ #ifdef __PATH_GUIDING__ @@ -322,12 +324,19 @@ ccl_device_inline kg, sd, wo, NULL, bsdf_eval, 0.0f, 0.0f, light_shader_flags); #if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4 - if (state->guiding.use_surface_guiding) { + if (pdf > 0.f && state->guiding.use_surface_guiding) { const float guiding_sampling_prob = state->guiding.surface_guiding_sampling_prob; const float bssrdf_sampling_prob = state->guiding.bssrdf_sampling_prob; const float guide_pdf = guiding_bsdf_pdf(kg, state, wo); - pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) + - (1.0f - guiding_sampling_prob) * pdf; + + if (kernel_data.integrator.guiding_directional_sampling_type == + GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS) { + pdf = (0.5f * guide_pdf * (1.0f - bssrdf_sampling_prob)) + 0.5f * pdf; + } + else { + pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) + + (1.0f - guiding_sampling_prob) * pdf; + } } #endif @@ -403,17 +412,17 @@ surface_shader_bssrdf_sample_weight(ccl_private const ShaderData *ccl_restrict s /* Sample direction for picked BSDF, and return evaluation and pdf for all * BSDFs combined using MIS. */ -ccl_device int surface_shader_bsdf_guided_sample_closure(KernelGlobals kg, - IntegratorState state, - ccl_private ShaderData *sd, - ccl_private const ShaderClosure *sc, - const float2 rand_bsdf, - @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs