[Bf-blender-cvs] [7ae7446f4a4] cycles_path_guiding: Guiding: Adding roughness threshold parameter and preparing for Open PGL 0.5
Sebastian Herholz
noreply at git.blender.org
Mon Feb 6 12:38:45 CET 2023
Commit: 7ae7446f4a4f98ba52bbe8fb35480d017e7b04b8
Author: Sebastian Herholz
Date: Mon Feb 6 12:38:15 2023 +0100
Branches: cycles_path_guiding
https://developer.blender.org/rB7ae7446f4a4f98ba52bbe8fb35480d017e7b04b8
Guiding: Adding roughness threshold parameter and preparing for Open PGL 0.5
===================================================================
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/integrator/path_trace_work_cpu.cpp
M intern/cycles/kernel/data_template.h
M intern/cycles/kernel/integrator/guiding.h
M intern/cycles/kernel/integrator/surface_shader.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 e0d7e1028de..93998416a96 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -638,6 +638,13 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
default=True,
)
+ guiding_roughness_threshold: FloatProperty(
+ name="Guiding Roughness Threshold",
+ description="The minimal roughness value of a material to apply guiding",
+ min=0.0, max=1.0,
+ default=0.05,
+ )
+
max_bounces: IntProperty(
name="Max Bounces",
description="Total maximum number of bounces",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index b75e2a0cc1b..2d262e48280 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -338,6 +338,7 @@ class CYCLES_RENDER_PT_sampling_path_guiding_debug(CyclesDebugButtonsPanel, Pane
layout.active = cscene.use_guiding
layout.prop(cscene, "guiding_distribution_type", text="Distribution Type")
+ layout.prop(cscene, "guiding_roughness_threshold")
col = layout.column(align=True)
col.prop(cscene, "surface_guiding_probability")
diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp
index 37e1cd55c46..ec7f3092216 100644
--- a/intern/cycles/blender/sync.cpp
+++ b/intern/cycles/blender/sync.cpp
@@ -447,6 +447,7 @@ void BlenderSync::sync_integrator(BL::ViewLayer &b_view_layer, bool background)
GUIDING_DIRECTIONAL_SAMPLING_NUM_TYPES,
GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT);
integrator->set_guiding_directional_sampling_type(guiding_directional_sampling_type);
+ integrator->set_guiding_roughness_threshold(get_float(cscene, "guiding_roughness_threshold"));
}
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 8aa61e3371d..15c8061dbc4 100644
--- a/intern/cycles/integrator/guiding.h
+++ b/intern/cycles/integrator/guiding.h
@@ -16,6 +16,7 @@ struct GuidingParams {
GuidingDistributionType type = GUIDING_TYPE_PARALLAX_AWARE_VMM;
GuidingDirectionalSamplingType sampling_type = GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT;
+ float roughness_threshold = 0.05f;
int training_samples = 128;
bool deterministic = false;
@@ -27,6 +28,7 @@ struct GuidingParams {
(use_volume_guiding == other.use_volume_guiding) && (type == other.type) &&
(sampling_type == other.sampling_type) &&
(training_samples == other.training_samples) &&
+ (roughness_threshold == other.roughness_threshold) &&
(deterministic == other.deterministic));
}
};
diff --git a/intern/cycles/integrator/path_trace_work_cpu.cpp b/intern/cycles/integrator/path_trace_work_cpu.cpp
index 188ec28cf65..9e612bc60a0 100644
--- a/intern/cycles/integrator/path_trace_work_cpu.cpp
+++ b/intern/cycles/integrator/path_trace_work_cpu.cpp
@@ -359,8 +359,13 @@ void PathTraceWorkCPU::guiding_push_sample_data_to_global_storage(
# if PATH_GUIDING_LEVEL >= 2
const bool use_direct_light = kernel_data.integrator.use_guiding_direct_light;
const bool use_mis_weights = kernel_data.integrator.use_guiding_mis_weights;
+# if OPENPGL_VERSION_MINOR >= 5
+ kg->opgl_path_segment_storage->PrepareSamples(
+ use_mis_weights, use_direct_light, false);
+#else
kg->opgl_path_segment_storage->PrepareSamples(
false, nullptr, use_mis_weights, use_direct_light, false);
+#endif
# endif
# ifdef WITH_CYCLES_DEBUG
diff --git a/intern/cycles/kernel/data_template.h b/intern/cycles/kernel/data_template.h
index 29bb98c99b6..16ac5c38e40 100644
--- a/intern/cycles/kernel/data_template.h
+++ b/intern/cycles/kernel/data_template.h
@@ -203,6 +203,7 @@ 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, float, guiding_roughness_threshold)
KERNEL_STRUCT_MEMBER(integrator, int, use_guiding)
KERNEL_STRUCT_MEMBER(integrator, int, train_guiding)
KERNEL_STRUCT_MEMBER(integrator, int, use_surface_guiding)
@@ -211,7 +212,9 @@ 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_MEMBER(integrator, int, pad2)
+KERNEL_STRUCT_MEMBER(integrator, int, pad3)
KERNEL_STRUCT_END(KernelIntegrator)
/* SVM. For shader specialization. */
diff --git a/intern/cycles/kernel/integrator/guiding.h b/intern/cycles/kernel/integrator/guiding.h
index 93c80539140..c1384da0158 100644
--- a/intern/cycles/kernel/integrator/guiding.h
+++ b/intern/cycles/kernel/integrator/guiding.h
@@ -7,6 +7,8 @@
#include "kernel/closure/bsdf.h"
#include "kernel/film/write.h"
+#include <iostream>
+
CCL_NAMESPACE_BEGIN
/* Utilities. */
@@ -454,11 +456,19 @@ ccl_device_forceinline bool guiding_bsdf_init(KernelGlobals kg,
ccl_private float &rand)
{
#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
+# if OPENPGL_VERSION_MINOR >= 5
+ if (kg->opgl_surface_sampling_distribution->Init(
+ kg->opgl_guiding_field, guiding_point3f(P), rand)) {
+ kg->opgl_surface_sampling_distribution->ApplyCosineProduct(guiding_point3f(N));
+ return true;
+ }
+#else
if (kg->opgl_surface_sampling_distribution->Init(
kg->opgl_guiding_field, guiding_point3f(P), rand, true)) {
kg->opgl_surface_sampling_distribution->ApplyCosineProduct(guiding_point3f(N));
return true;
}
+#endif
#endif
return false;
@@ -491,6 +501,17 @@ ccl_device_forceinline float guiding_bsdf_pdf(KernelGlobals kg,
#endif
}
+ccl_device_forceinline float guiding_surface_incomming_radiance_pdf(KernelGlobals kg,
+ IntegratorState state,
+ const float3 wo)
+{
+#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4 && OPENPGL_VERSION_MINOR >= 5
+ return kg->opgl_surface_sampling_distribution->IncommingRadiancePDF(guiding_vec3f(wo));
+#else
+ return 0.0f;
+#endif
+}
+
/* Guided Volume Phases */
ccl_device_forceinline bool guiding_phase_init(KernelGlobals kg,
@@ -505,13 +526,21 @@ ccl_device_forceinline bool guiding_phase_init(KernelGlobals kg,
if (fabsf(g) >= 0.99f) {
return false;
}
-
+# if OPENPGL_VERSION_MINOR >= 5
+ if (kg->opgl_volume_sampling_distribution->Init(
+ kg->opgl_guiding_field, guiding_point3f(P), rand)) {
+ kg->opgl_volume_sampling_distribution->ApplySingleLobeHenyeyGreensteinProduct(guiding_vec3f(D),
+ g);
+ return true;
+ }
+#else
if (kg->opgl_volume_sampling_distribution->Init(
kg->opgl_guiding_field, guiding_point3f(P), rand, true)) {
kg->opgl_volume_sampling_distribution->ApplySingleLobeHenyeyGreensteinProduct(guiding_vec3f(D),
g);
return true;
}
+#endif
#endif
return false;
diff --git a/intern/cycles/kernel/integrator/surface_shader.h b/intern/cycles/kernel/integrator/surface_shader.h
index 60eaed2c4ee..b0e065bacd0 100644
--- a/intern/cycles/kernel/integrator/surface_shader.h
+++ b/intern/cycles/kernel/integrator/surface_shader.h
@@ -22,7 +22,9 @@
CCL_NAMESPACE_BEGIN
#define RIS_COSINE
-
+# if OPENPGL_VERSION_MINOR >= 5
+#define RIS_INCOMMING_RADIANCE
+#endif
/* Guiding */
#ifdef __PATH_GUIDING__
@@ -58,6 +60,7 @@ ccl_device_inline void surface_shader_prepare_guiding(KernelGlobals kg,
const float surface_guiding_probability = kernel_data.integrator.surface_guiding_probability;
const int guiding_directional_sampling_type =
kernel_data.integrator.guiding_directional_sampling_type;
+ const float guiding_roughness_threshold = kernel_data.integrator.guiding_roughness_threshold;
float rand_bsdf_guiding = path_state_rng_1D(kg, rng_state, PRNG_SURFACE_BSDF_GUIDING);
/* Compute proportion of diffuse BSDF and BSSRDFs .*/
@@ -93,9 +96,9 @@ ccl_device_inline void surface_shader_prepare_guiding(KernelGlobals kg,
}
float avg_roughness = surface_shader_average_sample_weight_squared_roughness(sd);
-
+ avg_roughness = safe_sqrtf(avg_roughness);
/* Init guiding (diffuse BSDFs only for now). */
- if (!fully_opaque || avg_roughness <= 0.05f ||
+ if (!fully_opaque || avg_roughness < guiding_roughness_threshold*guiding_roughness_threshold ||
((guiding_directional_sampling_type == GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT) &&
(diffuse_sampling_fraction <= 0.f)) ||
!guiding_bsdf_init(kg, state, sd->P, sd->N, rand_bsdf_guiding)) {
@@ -620,6 +623,9 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
float3 omega_in_ris[2];
float ris_pdfs[2] = {0.f, 0.f};
float guide_pdfs[2] = {0.f, 0.f};
+#ifdef RIS_INCOMMING_RADIANCE
+ float incomming_radiance_pdfs[2] = {0.f, 0.f};
+#endif
float bsdf_pdfs[2] = {0.f, 0.f};
float cosines[2] = {0.f, 0.f};
BsdfEval bsdf_evals[2];
@@ -653,6 +659,9 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
3.0f;
guide_pdfs[0] = guiding_bsdf_pdf(kg, state, omega_in_ris[0]);
guide_pdfs[0] *= (1.0f - bssrdf_sampling_prob);
+#ifdef RIS_INCOMMING_RADIANCE
+ incomming_radiance_pdfs[0] = guiding_surface_incomming_radiance_pdf(kg, state, omega_in_ris[0]);
+#endif
bsdf_pdfs[0] = max(0.f, bsdf_pdfs[0]);
}
@@ -661,6 +670,9 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
bsdf_eval_init(&bsdf_evals[1], CLOSURE_NONE_ID, eval);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list