Commit: 05b342c0a3e5a396103caed88ce62b380175977f Author: Sebastian Herholz Date: Fri Jan 20 18:32:41 2023 +0100 Branches: cycles_path_guiding https://developer.blender.org/rB05b342c0a3e5a396103caed88ce62b380175977f
Fix T103977: Cycles handling ray visibility inconsistent for forward and nee =================================================================== M intern/cycles/kernel/CMakeLists.txt M intern/cycles/kernel/integrator/shade_background.h M intern/cycles/kernel/integrator/shade_light.h M intern/cycles/kernel/integrator/shade_surface.h M intern/cycles/kernel/integrator/state_template.h M intern/cycles/kernel/integrator/surface_shader.h A intern/cycles/kernel/light/visibility.h =================================================================== diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 78bd71988c0..48e9bd7b1ba 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -294,6 +294,7 @@ set(SRC_KERNEL_LIGHT_HEADERS light/spot.h light/tree.h light/triangle.h + light/visibility.h ) set(SRC_KERNEL_SAMPLE_HEADERS diff --git a/intern/cycles/kernel/integrator/shade_background.h b/intern/cycles/kernel/integrator/shade_background.h index 3c01a162d01..dde7284847b 100644 --- a/intern/cycles/kernel/integrator/shade_background.h +++ b/intern/cycles/kernel/integrator/shade_background.h @@ -11,6 +11,7 @@ #include "kernel/light/light.h" #include "kernel/light/sample.h" +#include "kernel/light/visibility.h" CCL_NAMESPACE_BEGIN @@ -22,20 +23,18 @@ ccl_device Spectrum integrator_eval_background_shader(KernelGlobals kg, const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); /* Use visibility flag to skip lights. */ + Spectrum light_visibility = one_spectrum(); if (shader & SHADER_EXCLUDE_ANY) { - if (((shader & SHADER_EXCLUDE_DIFFUSE) && (path_flag & PATH_RAY_DIFFUSE)) || - ((shader & SHADER_EXCLUDE_GLOSSY) && ((path_flag & (PATH_RAY_GLOSSY | PATH_RAY_REFLECT)) == - (PATH_RAY_GLOSSY | PATH_RAY_REFLECT))) || - ((shader & SHADER_EXCLUDE_TRANSMIT) && (path_flag & PATH_RAY_TRANSMIT)) || - ((shader & SHADER_EXCLUDE_CAMERA) && (path_flag & PATH_RAY_CAMERA)) || + if (((shader & SHADER_EXCLUDE_CAMERA) && (path_flag & PATH_RAY_CAMERA)) || ((shader & SHADER_EXCLUDE_SCATTER) && (path_flag & PATH_RAY_VOLUME_SCATTER))) return zero_spectrum(); + light_visibility_correction(kg, state, shader, &light_visibility); } /* Use fast constant background color if available. */ Spectrum L = zero_spectrum(); if (surface_shader_constant_emission(kg, shader, &L)) { - return L; + return light_visibility * L; } /* Evaluate background shader. */ @@ -57,7 +56,7 @@ ccl_device Spectrum integrator_eval_background_shader(KernelGlobals kg, surface_shader_eval<KERNEL_FEATURE_NODE_MASK_SURFACE_BACKGROUND>( kg, state, emission_sd, render_buffer, path_flag | PATH_RAY_EMISSION); - return surface_shader_background(emission_sd); + return light_visibility * surface_shader_background(emission_sd); } ccl_device_inline void integrate_background(KernelGlobals kg, @@ -138,18 +137,14 @@ ccl_device_inline void integrate_distant_lights(KernelGlobals kg, for (int lamp = 0; lamp < kernel_data.integrator.num_lights; lamp++) { if (distant_light_sample_from_intersection(kg, ray_D, lamp, &ls)) { /* Use visibility flag to skip lights. */ + Spectrum light_visibility = one_spectrum(); #ifdef __PASSES__ const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); - if (ls.shader & SHADER_EXCLUDE_ANY) { - if (((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (path_flag & PATH_RAY_DIFFUSE)) || - ((ls.shader & SHADER_EXCLUDE_GLOSSY) && - ((path_flag & (PATH_RAY_GLOSSY | PATH_RAY_REFLECT)) == - (PATH_RAY_GLOSSY | PATH_RAY_REFLECT))) || - ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (path_flag & PATH_RAY_TRANSMIT)) || - ((ls.shader & SHADER_EXCLUDE_CAMERA) && (path_flag & PATH_RAY_CAMERA)) || + if (((ls.shader & SHADER_EXCLUDE_CAMERA) && (path_flag & PATH_RAY_CAMERA)) || ((ls.shader & SHADER_EXCLUDE_SCATTER) && (path_flag & PATH_RAY_VOLUME_SCATTER))) return; + light_visibility_correction(kg, state, ls.shader, &light_visibility); } #endif @@ -168,6 +163,7 @@ ccl_device_inline void integrate_distant_lights(KernelGlobals kg, ShaderDataTinyStorage emission_sd_storage; ccl_private ShaderData *emission_sd = AS_SHADER_DATA(&emission_sd_storage); Spectrum light_eval = light_sample_shader_eval(kg, state, emission_sd, &ls, ray_time); + light_eval *= light_visibility; if (is_zero(light_eval)) { return; } diff --git a/intern/cycles/kernel/integrator/shade_light.h b/intern/cycles/kernel/integrator/shade_light.h index 1f09ac4e6d8..f732961f464 100644 --- a/intern/cycles/kernel/integrator/shade_light.h +++ b/intern/cycles/kernel/integrator/shade_light.h @@ -35,17 +35,13 @@ ccl_device_inline void integrate_light(KernelGlobals kg, } /* Use visibility flag to skip lights. */ + Spectrum light_visibility = one_spectrum(); #ifdef __PASSES__ const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); - if (ls.shader & SHADER_EXCLUDE_ANY) { - if (((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (path_flag & PATH_RAY_DIFFUSE)) || - ((ls.shader & SHADER_EXCLUDE_GLOSSY) && - ((path_flag & (PATH_RAY_GLOSSY | PATH_RAY_REFLECT)) == - (PATH_RAY_GLOSSY | PATH_RAY_REFLECT))) || - ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (path_flag & PATH_RAY_TRANSMIT)) || - ((ls.shader & SHADER_EXCLUDE_SCATTER) && (path_flag & PATH_RAY_VOLUME_SCATTER))) + if (((ls.shader & SHADER_EXCLUDE_SCATTER) && (path_flag & PATH_RAY_VOLUME_SCATTER))) return; + light_visibility_correction(kg, state, ls.shader, &light_visibility); } #endif @@ -54,6 +50,7 @@ ccl_device_inline void integrate_light(KernelGlobals kg, ShaderDataTinyStorage emission_sd_storage; ccl_private ShaderData *emission_sd = AS_SHADER_DATA(&emission_sd_storage); Spectrum light_eval = light_sample_shader_eval(kg, state, emission_sd, &ls, ray_time); + light_eval *= light_visibility; if (is_zero(light_eval)) { return; } diff --git a/intern/cycles/kernel/integrator/shade_surface.h b/intern/cycles/kernel/integrator/shade_surface.h index dbeb5f91ce7..548867c7551 100644 --- a/intern/cycles/kernel/integrator/shade_surface.h +++ b/intern/cycles/kernel/integrator/shade_surface.h @@ -16,6 +16,7 @@ #include "kernel/integrator/volume_stack.h" #include "kernel/light/sample.h" +#include "kernel/light/visibility.h" CCL_NAMESPACE_BEGIN @@ -426,6 +427,7 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce( /* Update throughput. */ const Spectrum bsdf_weight = bsdf_eval_sum(&bsdf_eval) / bsdf_pdf; INTEGRATOR_STATE_WRITE(state, path, throughput) *= bsdf_weight; + INTEGRATOR_STATE_WRITE(state, path, scatter_eval) = bsdf_eval; if (kernel_data.kernel_features & KERNEL_FEATURE_LIGHT_PASSES) { if (INTEGRATOR_STATE(state, path, bounce) == 0) { diff --git a/intern/cycles/kernel/integrator/state_template.h b/intern/cycles/kernel/integrator/state_template.h index 0fc7ed655d3..7b87f1fb046 100644 --- a/intern/cycles/kernel/integrator/state_template.h +++ b/intern/cycles/kernel/integrator/state_template.h @@ -48,6 +48,7 @@ KERNEL_STRUCT_MEMBER(path, float, min_ray_pdf, KERNEL_FEATURE_PATH_TRACING) KERNEL_STRUCT_MEMBER(path, float, continuation_probability, KERNEL_FEATURE_PATH_TRACING) /* Throughput. */ KERNEL_STRUCT_MEMBER(path, PackedSpectrum, throughput, KERNEL_FEATURE_PATH_TRACING) +KERNEL_STRUCT_MEMBER(path, BsdfEval, scatter_eval, KERNEL_FEATURE_PATH_TRACING) /* Factor to multiple with throughput to get remove any guiding PDFS. * Such throughput without guiding PDFS is used for Russian roulette termination. */ KERNEL_STRUCT_MEMBER(path, float, unguided_throughput, KERNEL_FEATURE_PATH_GUIDING) diff --git a/intern/cycles/kernel/integrator/surface_shader.h b/intern/cycles/kernel/integrator/surface_shader.h index 86e20e88a0a..ebca9810cbe 100644 --- a/intern/cycles/kernel/integrator/surface_shader.h +++ b/intern/cycles/kernel/integrator/surface_shader.h @@ -235,12 +235,14 @@ ccl_device_inline float _surface_shader_bsdf_eval_mis(KernelGlobals kg, } if (CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) { - if (CLOSURE_IS_BSDF(sc->type) && !_surface_shader_exclude(sc->type, light_shader_flags)) { + if (CLOSURE_IS_BSDF(sc->type)) { float bsdf_pdf = 0.0f; Spectrum eval = bsdf_eval(kg, sd, sc, wo, &bsdf_pdf); if (bsdf_pdf != 0.0f) { - bsdf_eval_accum(result_eval, sc->type, eval * sc->weight); + if (!_surface_shader_exclude(sc->type, light_shader_flags)) { + bsdf_eval_accum(result_eval, sc->type, eval * sc->weight); + } sum_pdf += bsdf_pdf * sc->sample_weight; } } diff --git a/intern/cycles/kernel/light/visibility.h b/intern/cycles/kernel/light/visibility.h new file mode 100644 index 00000000000..fbc66733c7c --- /dev/null +++ b/intern/cycles/kernel/light/visibility.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright 2011-2022 Blender Foundation */ + +#pragma once + +CCL_NAMESPACE_BEGIN + +ccl_device_inline void light_visibility_correction(KernelGlobals kg, + IntegratorState state, + const int shader, + Spectrum* light_visibility) +{ + Spectrum visible_components = zero_spectrum(); + const BsdfEval scatter_eval = INTEGRATOR_STATE(state, path, scatter_eval); + Spectrum transmission = scatter_eval.sum - (scatter_eval.glossy + scatter_eval.diffuse); + if (!(shader & SHADER_EXCLUDE_DIFFUSE)) + { + visible_components += scatter_eval.diffuse; + } + + if (!(shader & SHADER_EXCLUDE_GLOSSY)) + { + visible_components += scatter_eval.glossy; + } + + if (!(shader & SHADER_EXCLUDE_TRANSMIT)) + { + visible_components += transmission; + } + + *light_visibility = safe_divide(visible_components , scatter_eval.sum); +} + +CCL_NAMESPACE_END \ No newline at end of file _______________________________________________ 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