[Bf-blender-cvs] [a71930fa42b] cycles_path_guiding: Guiding: Adding ui switches to select the directional sampling type for guiding
Sebastian Herholz
noreply at git.blender.org
Thu Jan 26 20:15:05 CET 2023
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)
More information about the Bf-blender-cvs
mailing list