[Bf-blender-cvs] [aaece0279fe] soc-2022-many-lights-sampling: Fix mistake in previous commit (pass randu by value), some code tweaks
Brecht Van Lommel
noreply at git.blender.org
Thu Dec 1 21:58:04 CET 2022
Commit: aaece0279feb8da06ab680ab31f0cc350dd94fc5
Author: Brecht Van Lommel
Date: Thu Dec 1 21:43:55 2022 +0100
Branches: soc-2022-many-lights-sampling
https://developer.blender.org/rBaaece0279feb8da06ab680ab31f0cc350dd94fc5
Fix mistake in previous commit (pass randu by value), some code tweaks
===================================================================
M intern/cycles/kernel/integrator/shade_volume.h
M intern/cycles/kernel/light/distribution.h
M intern/cycles/kernel/light/sample.h
M intern/cycles/kernel/light/tree.h
M intern/cycles/scene/light.cpp
===================================================================
diff --git a/intern/cycles/kernel/integrator/shade_volume.h b/intern/cycles/kernel/integrator/shade_volume.h
index dbc28a2de0f..f9ea6dc2cb8 100644
--- a/intern/cycles/kernel/integrator/shade_volume.h
+++ b/intern/cycles/kernel/integrator/shade_volume.h
@@ -1013,7 +1013,6 @@ ccl_device VolumeIntegrateEvent volume_integrate(KernelGlobals kg,
/* Sample light ahead of volume stepping, for equiangular sampling. */
/* TODO: distant lights are ignored now, but could instead use even distribution. */
- LightSample ls ccl_optional_struct_init;
const bool need_light_sample = !(INTEGRATOR_STATE(state, path, flag) & PATH_RAY_TERMINATE);
float3 equiangular_P = zero_float3();
const bool have_equiangular_sample = need_light_sample &&
diff --git a/intern/cycles/kernel/light/distribution.h b/intern/cycles/kernel/light/distribution.h
index adf01faa68b..8afc15757db 100644
--- a/intern/cycles/kernel/light/distribution.h
+++ b/intern/cycles/kernel/light/distribution.h
@@ -11,7 +11,7 @@ CCL_NAMESPACE_BEGIN
/* Simple CDF based sampling over all lights in the scene, without taking into
* account shading position or normal. */
-ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *randu)
+ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float &randu)
{
/* This is basically std::upper_bound as used by PBRT, to find a point light or
* triangle to emit from, proportional to area. a good improvement would be to
@@ -19,7 +19,7 @@ ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *ra
* arbitrary shaders. */
int first = 0;
int len = kernel_data.integrator.num_distribution + 1;
- float r = *randu;
+ float r = randu;
do {
int half_len = len >> 1;
@@ -42,33 +42,32 @@ ccl_device int light_distribution_sample(KernelGlobals kg, ccl_private float *ra
* each area light be stratified as well. */
float distr_min = kernel_data_fetch(light_distribution, index).totarea;
float distr_max = kernel_data_fetch(light_distribution, index + 1).totarea;
- *randu = (r - distr_min) / (distr_max - distr_min);
+ randu = (r - distr_min) / (distr_max - distr_min);
return index;
}
-template<bool in_volume_segment>
ccl_device_noinline bool light_distribution_sample(KernelGlobals kg,
- float randu,
+ ccl_private float &randu,
const float randv,
const float time,
const float3 P,
const int bounce,
const uint32_t path_flag,
- ccl_private int *emitter_object,
- ccl_private int *emitter_prim,
- ccl_private int *emitter_shader_flag,
- ccl_private float *emitter_pdf_selection)
+ ccl_private int &emitter_object,
+ ccl_private int &emitter_prim,
+ ccl_private int &emitter_shader_flag,
+ ccl_private float &emitter_pdf_selection)
{
/* Sample light index from distribution. */
- const int index = light_distribution_sample(kg, &randu);
+ const int index = light_distribution_sample(kg, randu);
ccl_global const KernelLightDistribution *kdistribution = &kernel_data_fetch(light_distribution,
index);
- *emitter_object = kdistribution->mesh_light.object_id;
- *emitter_prim = kdistribution->prim;
- *emitter_shader_flag = kdistribution->mesh_light.shader_flag;
- *emitter_pdf_selection = kernel_data.integrator.distribution_pdf_lights;
+ emitter_object = kdistribution->mesh_light.object_id;
+ emitter_prim = kdistribution->prim;
+ emitter_shader_flag = kdistribution->mesh_light.shader_flag;
+ emitter_pdf_selection = kernel_data.integrator.distribution_pdf_lights;
return true;
}
diff --git a/intern/cycles/kernel/light/sample.h b/intern/cycles/kernel/light/sample.h
index f9c6b7988b2..9297746ce35 100644
--- a/intern/cycles/kernel/light/sample.h
+++ b/intern/cycles/kernel/light/sample.h
@@ -322,7 +322,7 @@ ccl_device_inline float light_sample_mis_weight_nee(KernelGlobals kg,
ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
float randu,
- const float randv,
+ float randv,
const float time,
const float3 P,
const float3 D,
@@ -348,25 +348,25 @@ ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
SD_BSDF_HAS_TRANSMISSION,
bounce,
path_flag,
- &emitter_object,
- &emitter_prim,
- &emitter_shader_flag,
- &emitter_pdf_selection)) {
+ emitter_object,
+ emitter_prim,
+ emitter_shader_flag,
+ emitter_pdf_selection)) {
return false;
}
}
else {
- if (!light_distribution_sample<true>(kg,
- randu,
- randv,
- time,
- P,
- bounce,
- path_flag,
- &emitter_object,
- &emitter_prim,
- &emitter_shader_flag,
- &emitter_pdf_selection)) {
+ if (!light_distribution_sample(kg,
+ randu,
+ randv,
+ time,
+ P,
+ bounce,
+ path_flag,
+ emitter_object,
+ emitter_prim,
+ emitter_shader_flag,
+ emitter_pdf_selection)) {
return false;
}
}
@@ -409,8 +409,8 @@ ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg,
ccl_device bool light_sample_from_position(KernelGlobals kg,
ccl_private const RNGState *rng_state,
- const float randu,
- const float randv,
+ float randu,
+ float randv,
const float time,
const float3 P,
const float3 N,
@@ -436,25 +436,25 @@ ccl_device bool light_sample_from_position(KernelGlobals kg,
shader_flags,
bounce,
path_flag,
- &emitter_object,
- &emitter_prim,
- &emitter_shader_flag,
- &emitter_pdf_selection)) {
+ emitter_object,
+ emitter_prim,
+ emitter_shader_flag,
+ emitter_pdf_selection)) {
return false;
}
}
else {
- if (!light_distribution_sample<false>(kg,
- randu,
- randv,
- time,
- P,
- bounce,
- path_flag,
- &emitter_object,
- &emitter_prim,
- &emitter_shader_flag,
- &emitter_pdf_selection)) {
+ if (!light_distribution_sample(kg,
+ randu,
+ randv,
+ time,
+ P,
+ bounce,
+ path_flag,
+ emitter_object,
+ emitter_prim,
+ emitter_shader_flag,
+ emitter_pdf_selection)) {
return false;
}
}
diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h
index 8b6f20e20e7..eba03e93cb9 100644
--- a/intern/cycles/kernel/light/tree.h
+++ b/intern/cycles/kernel/light/tree.h
@@ -541,8 +541,8 @@ ccl_device bool get_left_probability(KernelGlobals kg,
template<bool in_volume_segment>
ccl_device_noinline bool light_tree_sample(KernelGlobals kg,
- float randu,
- float randv,
+ ccl_private float &randu,
+ ccl_private float &randv,
const float time
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list