Commit: a71930fa42b8ab2a231c586c75776e2d41fe1aa9 Author: Sebastian Herholz Date: Fri Jan 20 16:28:58 2023 +0100 Branches: cycles_path_guiding https://developer.blender.org/rBa71930fa42b8ab2a231c586c75776e2d41fe1aa9
Guiding: Adding ui switches to select the directional sampling type for guiding =================================================================== M intern/cycles/blender/addon/properties.py M intern/cycles/blender/addon/ui.py M intern/cycles/blender/sync.cpp M intern/cycles/integrator/guiding.h M intern/cycles/kernel/data_template.h M intern/cycles/kernel/types.h M intern/cycles/scene/integrator.cpp M intern/cycles/scene/integrator.h =================================================================== diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index eed51eed95f..a90fd60a711 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -208,6 +208,11 @@ enum_guiding_distribution = ( ('VMM', "VMM", "Use von Mises-Fisher models as directional distribution", 2), ) +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), +) def enum_openimagedenoise_denoiser(self, context): import _cycles @@ -567,6 +572,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): default='PARALLAX_AWARE_VMM', ) + guiding_directional_sampling_type: EnumProperty( + name="Directional Sampling Type", + description="Type of the directional sampling used for guiding", + items=enum_guiding_directional_sampling_types, + default='PRODUCT', + ) + use_surface_guiding: BoolProperty( name="Surface Guiding", description="Use guiding when sampling directions on a surface", diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 81f940529d1..b75e2a0cc1b 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -316,6 +316,8 @@ class CYCLES_RENDER_PT_sampling_path_guiding(CyclesButtonsPanel, Panel): layout.prop(cscene, "guiding_training_samples") + layout.prop(cscene, "guiding_directional_sampling_type", text="Directional Sampling Type") + col = layout.column(align=True) col.prop(cscene, "use_surface_guiding", text="Surface") col.prop(cscene, "use_volume_guiding", text="Volume") diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp index 7df2a8cf30f..68ab3ad3cb4 100644 --- a/intern/cycles/blender/sync.cpp +++ b/intern/cycles/blender/sync.cpp @@ -441,6 +441,9 @@ 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); + integrator->set_guiding_directional_sampling_type(guiding_directional_sampling_type); } DenoiseParams denoise_params = get_denoise_params(b_scene, b_view_layer, background); diff --git a/intern/cycles/integrator/guiding.h b/intern/cycles/integrator/guiding.h index b7d7e2fe51e..fa918d4ea4b 100644 --- a/intern/cycles/integrator/guiding.h +++ b/intern/cycles/integrator/guiding.h @@ -15,6 +15,7 @@ struct GuidingParams { bool use_volume_guiding = false; GuidingDistributionType type = GUIDING_TYPE_PARALLAX_AWARE_VMM; + GuidingDirectionalSamplingType sampling_type = GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT; int training_samples = 128; bool deterministic = false; @@ -24,7 +25,7 @@ struct GuidingParams { { return !((use == other.use) && (use_surface_guiding == other.use_surface_guiding) && (use_volume_guiding == other.use_volume_guiding) && (type == other.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 fd25644e56b..93a1db64087 100644 --- a/intern/cycles/kernel/data_template.h +++ b/intern/cycles/kernel/data_template.h @@ -202,6 +202,7 @@ KERNEL_STRUCT_MEMBER(integrator, int, direct_light_sampling_type) KERNEL_STRUCT_MEMBER(integrator, float, surface_guiding_probability) KERNEL_STRUCT_MEMBER(integrator, float, volume_guiding_probability) KERNEL_STRUCT_MEMBER(integrator, int, guiding_distribution_type) +KERNEL_STRUCT_MEMBER(integrator, int, guiding_directional_sampling_type) KERNEL_STRUCT_MEMBER(integrator, int, use_guiding) KERNEL_STRUCT_MEMBER(integrator, int, train_guiding) KERNEL_STRUCT_MEMBER(integrator, int, use_surface_guiding) @@ -210,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/types.h b/intern/cycles/kernel/types.h index 4fad62d757d..8922839d248 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -500,6 +500,16 @@ typedef enum GuidingDistributionType { GUIDING_NUM_TYPES, } GuidingDistributionType; +/* Guiding Directional Sampling Type */ + +typedef enum GuidingDirectionalSamplingType { + GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT = 0, + GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS = 1, + GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS = 2, + + GUIDING_DIRECTIONAL_SAMPLING_NUM_TYPES, +} GuidingDirectionalSamplingType; + /* Camera Type */ enum CameraType { CAMERA_PERSPECTIVE, CAMERA_ORTHOGRAPHIC, CAMERA_PANORAMA }; diff --git a/intern/cycles/scene/integrator.cpp b/intern/cycles/scene/integrator.cpp index 7e5633733ae..8370492e18e 100644 --- a/intern/cycles/scene/integrator.cpp +++ b/intern/cycles/scene/integrator.cpp @@ -60,10 +60,15 @@ NODE_DEFINE(Integrator) SOCKET_INT(volume_max_steps, "Volume Max Steps", 1024); SOCKET_FLOAT(volume_step_rate, "Volume Step Rate", 1.0f); - static NodeEnum guiding_ditribution_enum; - guiding_ditribution_enum.insert("PARALLAX_AWARE_VMM", GUIDING_TYPE_PARALLAX_AWARE_VMM); - guiding_ditribution_enum.insert("DIRECTIONAL_QUAD_TREE", GUIDING_TYPE_DIRECTIONAL_QUAD_TREE); - guiding_ditribution_enum.insert("VMM", GUIDING_TYPE_VMM); + static NodeEnum guiding_distribution_enum; + guiding_distribution_enum.insert("PARALLAX_AWARE_VMM", GUIDING_TYPE_PARALLAX_AWARE_VMM); + guiding_distribution_enum.insert("DIRECTIONAL_QUAD_TREE", GUIDING_TYPE_DIRECTIONAL_QUAD_TREE); + guiding_distribution_enum.insert("VMM", GUIDING_TYPE_VMM); + + static NodeEnum guiding_directional_sampling_type_enum; + guiding_directional_sampling_type_enum.insert("PRODUCT", GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT); + guiding_directional_sampling_type_enum.insert("RIS", GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS); + guiding_directional_sampling_type_enum.insert("ROUGHNESS", GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS); SOCKET_BOOLEAN(use_guiding, "Guiding", false); SOCKET_BOOLEAN(deterministic_guiding, "Deterministic Guiding", true); @@ -76,8 +81,12 @@ NODE_DEFINE(Integrator) SOCKET_BOOLEAN(use_guiding_mis_weights, "Use MIS Weights", true); SOCKET_ENUM(guiding_distribution_type, "Guiding Distribution Type", - guiding_ditribution_enum, + guiding_distribution_enum, GUIDING_TYPE_PARALLAX_AWARE_VMM); + SOCKET_ENUM(guiding_directional_sampling_type, + "Guiding Directional Sampling Type", + guiding_directional_sampling_type_enum, + GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT); SOCKET_BOOLEAN(caustics_reflective, "Reflective Caustics", true); SOCKET_BOOLEAN(caustics_refractive, "Refractive Caustics", true); @@ -242,6 +251,7 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene kintegrator->use_guiding_direct_light = use_guiding_direct_light; kintegrator->use_guiding_mis_weights = use_guiding_mis_weights; kintegrator->guiding_distribution_type = guiding_params.type; + kintegrator->guiding_directional_sampling_type = guiding_params.sampling_type; kintegrator->seed = seed; @@ -409,7 +419,7 @@ GuidingParams Integrator::get_guiding_params(const Device *device) const guiding_params.type = guiding_distribution_type; guiding_params.training_samples = guiding_training_samples; guiding_params.deterministic = deterministic_guiding; - + guiding_params.sampling_type = guiding_directional_sampling_type; return guiding_params; } CCL_NAMESPACE_END diff --git a/intern/cycles/scene/integrator.h b/intern/cycles/scene/integrator.h index 92ac3a254b7..4135f466a8a 100644 --- a/intern/cycles/scene/integrator.h +++ b/intern/cycles/scene/integrator.h @@ -54,6 +54,7 @@ class Integrator : public Node { NODE_SOCKET_API(bool, use_guiding_direct_light); NODE_SOCKET_API(bool, use_guiding_mis_weights); NODE_SOCKET_API(GuidingDistributionType, guiding_distribution_type); + NODE_SOCKET_API(GuidingDirectionalSamplingType, guiding_directional_sampling_type); NODE_SOCKET_API(bool, caustics_reflective) NODE_SOCKET_API(bool, caustics_refractive) _______________________________________________ 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