diff options
author | Sebastian Herholz <sherholz> | 2021-11-17 19:26:46 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2021-11-17 20:03:56 +0300 |
commit | d9bc8f189cc36cc55082cfd7ad8845e96eb062e3 (patch) | |
tree | 0fe69c7ae01d5fa3dd68e5d719bae9a757f4ec83 /intern/cycles/kernel | |
parent | 063ad8635ec87a490d6fc02c937387a3c6673b08 (diff) |
Cycles: add build option to enable a debugging feature for MIS
This patch adds a CMake option "WITH_CYCLES_DEBUG" which builds cycles with
a feature that allows debugging/selecting the direct-light sampling strategy.
The same option may later be used to add other debugging features that could
affect performance in release builds.
The three options are:
* Forward path tracing (e.g., via BSDF or phase function)
* Next-event estimation
* Multiple importance sampling combination of the previous two methods
Such a feature is useful for debugging light different sampling, evaluation,
and pdf methods (e.g., for light sources and BSDFs).
Differential Revision: https://developer.blender.org/D13152
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/CMakeLists.txt | 20 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/shade_background.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/shade_light.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/shade_surface.h | 7 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/shade_volume.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/light/sample.h | 33 | ||||
-rw-r--r-- | intern/cycles/kernel/types.h | 15 |
7 files changed, 62 insertions, 25 deletions
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 39cb886b16e..baa0e9a73d8 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -412,17 +412,16 @@ if(WITH_CYCLES_CUDA_BINARIES) --use_fast_math -o ${CMAKE_CURRENT_BINARY_DIR}/${cuda_file}) - if(${experimental}) - set(cuda_flags ${cuda_flags} -D __KERNEL_EXPERIMENTAL__) - set(name ${name}_experimental) - endif() - if(WITH_NANOVDB) set(cuda_flags ${cuda_flags} -D WITH_NANOVDB -I "${NANOVDB_INCLUDE_DIR}") endif() + if(WITH_CYCLES_DEBUG) + set(cuda_flags ${cuda_flags} -D WITH_CYCLES_DEBUG) + endif() + if(WITH_CYCLES_CUBIN_COMPILER) string(SUBSTRING ${arch} 3 -1 CUDA_ARCH) @@ -571,13 +570,8 @@ if(WITH_CYCLES_HIP_BINARIES AND WITH_CYCLES_DEVICE_HIP) -ffast-math -o ${CMAKE_CURRENT_BINARY_DIR}/${hip_file}) - if(${experimental}) - set(hip_flags ${hip_flags} -D __KERNEL_EXPERIMENTAL__) - set(name ${name}_experimental) - endif() - if(WITH_CYCLES_DEBUG) - set(hip_flags ${hip_flags} -D __KERNEL_DEBUG__) + set(hip_flags ${hip_flags} -D WITH_CYCLES_DEBUG) endif() add_custom_command( @@ -618,6 +612,10 @@ if(WITH_CYCLES_DEVICE_OPTIX AND WITH_CYCLES_CUDA_BINARIES) -I "${NANOVDB_INCLUDE_DIR}") endif() + if(WITH_CYCLES_DEBUG) + set(cuda_flags ${cuda_flags} -D WITH_CYCLES_DEBUG) + endif() + if(WITH_CYCLES_CUBIN_COMPILER) # Needed to find libnvrtc-builtins.so. Can't do it from inside # cycles_cubin_cc since the env variable is read before main() diff --git a/intern/cycles/kernel/integrator/shade_background.h b/intern/cycles/kernel/integrator/shade_background.h index 31452de1ca4..a8ebbe908ae 100644 --- a/intern/cycles/kernel/integrator/shade_background.h +++ b/intern/cycles/kernel/integrator/shade_background.h @@ -20,7 +20,6 @@ #include "kernel/integrator/shader_eval.h" #include "kernel/light/light.h" #include "kernel/light/sample.h" -#include "kernel/sample/mis.h" CCL_NAMESPACE_BEGIN @@ -81,8 +80,7 @@ ccl_device float3 integrator_eval_background_shader(KernelGlobals kg, /* multiple importance sampling, get background light pdf for ray * direction, and compute weight with respect to BSDF pdf */ const float pdf = background_light_pdf(kg, ray_P - ray_D * mis_ray_t, ray_D); - const float mis_weight = power_heuristic(mis_ray_pdf, pdf); - + const float mis_weight = light_sample_mis_weight_forward(kg, mis_ray_pdf, pdf); L *= mis_weight; } # endif @@ -169,7 +167,7 @@ ccl_device_inline void integrate_distant_lights(KernelGlobals kg, /* multiple importance sampling, get regular light pdf, * and compute weight with respect to BSDF pdf */ const float mis_ray_pdf = INTEGRATOR_STATE(state, path, mis_ray_pdf); - const float mis_weight = power_heuristic(mis_ray_pdf, ls.pdf); + const float mis_weight = light_sample_mis_weight_forward(kg, mis_ray_pdf, ls.pdf); light_eval *= mis_weight; } diff --git a/intern/cycles/kernel/integrator/shade_light.h b/intern/cycles/kernel/integrator/shade_light.h index 5abe9e98abc..97ca430752c 100644 --- a/intern/cycles/kernel/integrator/shade_light.h +++ b/intern/cycles/kernel/integrator/shade_light.h @@ -84,7 +84,7 @@ ccl_device_inline void integrate_light(KernelGlobals kg, /* multiple importance sampling, get regular light pdf, * and compute weight with respect to BSDF pdf */ const float mis_ray_pdf = INTEGRATOR_STATE(state, path, mis_ray_pdf); - const float mis_weight = power_heuristic(mis_ray_pdf, ls.pdf); + const float mis_weight = light_sample_mis_weight_forward(kg, mis_ray_pdf, ls.pdf); light_eval *= mis_weight; } diff --git a/intern/cycles/kernel/integrator/shade_surface.h b/intern/cycles/kernel/integrator/shade_surface.h index 2c478784bc9..c9c586f5ae4 100644 --- a/intern/cycles/kernel/integrator/shade_surface.h +++ b/intern/cycles/kernel/integrator/shade_surface.h @@ -27,8 +27,6 @@ #include "kernel/light/light.h" #include "kernel/light/sample.h" -#include "kernel/sample/mis.h" - CCL_NAMESPACE_BEGIN ccl_device_forceinline void integrate_surface_shader_setup(KernelGlobals kg, @@ -95,8 +93,7 @@ ccl_device_forceinline void integrate_surface_emission(KernelGlobals kg, /* Multiple importance sampling, get triangle light pdf, * and compute weight with respect to BSDF pdf. */ float pdf = triangle_light_pdf(kg, sd, t); - float mis_weight = power_heuristic(bsdf_pdf, pdf); - + float mis_weight = light_sample_mis_weight_forward(kg, bsdf_pdf, pdf); L *= mis_weight; } @@ -155,7 +152,7 @@ ccl_device_forceinline void integrate_surface_direct_light(KernelGlobals kg, bsdf_eval_mul3(&bsdf_eval, light_eval / ls.pdf); if (ls.shader & SHADER_USE_MIS) { - const float mis_weight = power_heuristic(ls.pdf, bsdf_pdf); + const float mis_weight = light_sample_mis_weight_nee(kg, ls.pdf, bsdf_pdf); bsdf_eval_mul(&bsdf_eval, mis_weight); } diff --git a/intern/cycles/kernel/integrator/shade_volume.h b/intern/cycles/kernel/integrator/shade_volume.h index 141433c37a8..eff1042bd59 100644 --- a/intern/cycles/kernel/integrator/shade_volume.h +++ b/intern/cycles/kernel/integrator/shade_volume.h @@ -27,8 +27,6 @@ #include "kernel/light/light.h" #include "kernel/light/sample.h" -#include "kernel/sample/mis.h" - CCL_NAMESPACE_BEGIN #ifdef __VOLUME__ @@ -759,7 +757,7 @@ ccl_device_forceinline void integrate_volume_direct_light( const float phase_pdf = shader_volume_phase_eval(kg, sd, phases, ls->D, &phase_eval); if (ls->shader & SHADER_USE_MIS) { - float mis_weight = power_heuristic(ls->pdf, phase_pdf); + float mis_weight = light_sample_mis_weight_nee(kg, ls->pdf, phase_pdf); bsdf_eval_mul(&phase_eval, mis_weight); } diff --git a/intern/cycles/kernel/light/sample.h b/intern/cycles/kernel/light/sample.h index 6b643a95250..ff5d43ed8cd 100644 --- a/intern/cycles/kernel/light/sample.h +++ b/intern/cycles/kernel/light/sample.h @@ -22,6 +22,7 @@ #include "kernel/light/light.h" #include "kernel/sample/mapping.h" +#include "kernel/sample/mis.h" CCL_NAMESPACE_BEGIN @@ -268,4 +269,36 @@ ccl_device_inline void light_sample_to_volume_shadow_ray( shadow_ray_setup(sd, ls, P, ray); } +ccl_device_inline float light_sample_mis_weight_forward(KernelGlobals kg, + const float forward_pdf, + const float nee_pdf) +{ +#ifdef WITH_CYCLES_DEBUG + if (kernel_data.integrator.direct_light_sampling_type == DIRECT_LIGHT_SAMPLING_FORWARD) { + return 1.0f; + } + else if (kernel_data.integrator.direct_light_sampling_type == DIRECT_LIGHT_SAMPLING_NEE) { + return 0.0f; + } + else +#endif + return power_heuristic(forward_pdf, nee_pdf); +} + +ccl_device_inline float light_sample_mis_weight_nee(KernelGlobals kg, + const float nee_pdf, + const float forward_pdf) +{ +#ifdef WITH_CYCLES_DEBUG + if (kernel_data.integrator.direct_light_sampling_type == DIRECT_LIGHT_SAMPLING_FORWARD) { + return 0.0f; + } + else if (kernel_data.integrator.direct_light_sampling_type == DIRECT_LIGHT_SAMPLING_NEE) { + return 1.0f; + } + else +#endif + return power_heuristic(nee_pdf, forward_pdf); +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 74b34524786..e66c3fe49df 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -481,6 +481,16 @@ enum PanoramaType { PANORAMA_NUM_TYPES, }; +/* Direct Light Sampling */ + +enum DirectLightSamplingType { + DIRECT_LIGHT_SAMPLING_MIS = 0, + DIRECT_LIGHT_SAMPLING_FORWARD = 1, + DIRECT_LIGHT_SAMPLING_NEE = 2, + + DIRECT_LIGHT_SAMPLING_NUM, +}; + /* Differential */ typedef struct differential3 { @@ -1193,8 +1203,11 @@ typedef struct KernelIntegrator { /* Closure filter. */ int filter_closures; + /* MIS debuging */ + int direct_light_sampling_type; + /* padding */ - int pad1, pad2, pad3; + int pad1, pad2; } KernelIntegrator; static_assert_align(KernelIntegrator, 16); |