19 #if defined(__BRANCHED_PATH__) || defined(__SUBSURFACE__) || defined(__SHADOW_TRICKS__) || \
29 float num_samples_adjust,
31 int sample_all_lights)
39 if (sample_all_lights) {
50 for (
int i = 0; i < num_lights; i++) {
53 int num_all_lights = 1;
55 bool double_pdf =
false;
56 bool is_mesh_light =
false;
59 if (sample_all_lights) {
61 is_lamp = i <
kernel_data.integrator.num_all_lights;
67 num_all_lights =
kernel_data.integrator.num_all_lights;
69 double_pdf =
kernel_data.integrator.pdf_triangles != 0.0f;
74 double_pdf =
kernel_data.integrator.num_all_lights != 0;
79 float num_samples_inv = num_samples_adjust / (num_samples * num_all_lights);
81 for (
int j = 0; j < num_samples; j++) {
84 # ifdef __OBJECT_MOTION__
85 light_ray.time = sd->time;
87 bool has_emission =
false;
90 float light_u, light_v;
94 kg, lamp_rng_hash,
state, j, num_samples);
97 if (is_mesh_light && double_pdf) {
98 light_u = 0.5f * light_u;
102 const int lamp = is_lamp ? i : -1;
112 kg, sd, emission_sd, &ls,
state, &light_ray, &L_light, &is_lamp, terminate);
127 throughput * num_samples_inv,
143 ccl_device bool kernel_branched_path_surface_bounce(KernelGlobals *
kg,
152 float sum_sample_weight)
159 float bsdf_u, bsdf_v;
165 kg, sd, sc, bsdf_u, bsdf_v, &
bsdf_eval, &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
173 # ifdef __DENOISING_FEATURES__
174 state->denoising_feature_weight *= sc->sample_weight / (sum_sample_weight * num_samples);
184 # ifdef __RAY_DIFFERENTIALS__
186 ray->dD = bsdf_domega_in;
188 # ifdef __OBJECT_MOTION__
189 ray->time = sd->time;
195 kernel_volume_stack_enter_exit(
kg, sd,
state->volume_stack);
202 state->min_ray_pdf =
fminf(bsdf_pdf, FLT_MAX);
203 state->ray_pdf = bsdf_pdf;
224 # ifdef __SHADOW_TRICKS__
226 kernel_branched_path_surface_connect_light(
kg, sd, emission_sd,
state, throughput, 1.0f,
L,
all);
231 bool is_lamp =
false;
232 bool has_emission =
false;
235 # ifdef __OBJECT_MOTION__
236 light_ray.time = sd->time;
240 float light_u, light_v;
247 kg, sd, emission_sd, &ls,
state, &light_ray, &L_light, &is_lamp, terminate);
286 float bsdf_u, bsdf_v;
291 kg, sd, bsdf_u, bsdf_v, &
bsdf_eval, &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
301 state->ray_pdf = bsdf_pdf;
315 if (
state->bounce == 0)
316 ray->t -= sd->ray_length;
320 #ifdef __RAY_DIFFERENTIALS__
322 ray->dD = bsdf_domega_in;
328 kernel_volume_stack_enter_exit(
kg, sd,
state->volume_stack);
334 if (!path_state_volume_next(
kg,
state)) {
338 if (
state->bounce == 0)
339 ray->t -= sd->ray_length;
345 # ifdef __RAY_DIFFERENTIALS__
350 kernel_volume_stack_enter_exit(
kg, sd,
state->volume_stack);
ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
ccl_device_inline float3 ray_offset(float3 P, float3 Ng)
ccl_device_inline bool bsdf_eval_is_zero(BsdfEval *eval)
ccl_device_inline void path_radiance_accum_total_light(PathRadiance *L, ccl_addr_space PathState *state, float3 throughput, const BsdfEval *bsdf_eval)
ccl_device_inline void path_radiance_accum_light(KernelGlobals *kg, PathRadiance *L, ccl_addr_space PathState *state, float3 throughput, BsdfEval *bsdf_eval, float3 shadow, float shadow_fac, bool is_lamp)
ccl_device_inline void path_radiance_bsdf_bounce(KernelGlobals *kg, PathRadianceState *L_state, ccl_addr_space float3 *throughput, BsdfEval *bsdf_eval, float bsdf_pdf, int bounce, int bsdf_label)
#define ccl_optional_struct_init
#define ccl_device_noinline_cpu
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_noinline_cpu bool direct_emission(KernelGlobals *kg, ShaderData *sd, ShaderData *emission_sd, LightSample *ls, ccl_addr_space PathState *state, Ray *ray, BsdfEval *eval, bool *is_lamp, float rand_terminate)
ccl_device_inline uint cmj_hash(uint i, uint p)
ccl_device_noinline bool light_sample(KernelGlobals *kg, int lamp, float randu, float randv, float time, float3 P, int bounce, LightSample *ls)
ccl_device_inline int light_select_num_samples(KernelGlobals *kg, int index)
ccl_device_inline bool light_select_reached_max_bounces(KernelGlobals *kg, int index, int bounce)
ccl_device_inline void path_state_next(KernelGlobals *kg, ccl_addr_space PathState *state, int label)
ccl_device_inline void path_state_branch(ccl_addr_space PathState *state, int branch, int num_branches)
ccl_device bool kernel_path_surface_bounce(KernelGlobals *kg, ShaderData *sd, ccl_addr_space float3 *throughput, ccl_addr_space PathState *state, PathRadianceState *L_state, ccl_addr_space Ray *ray)
CCL_NAMESPACE_BEGIN ccl_device_inline void kernel_path_surface_connect_light(KernelGlobals *kg, ShaderData *sd, ShaderData *emission_sd, float3 throughput, ccl_addr_space PathState *state, PathRadiance *L)
#define PROFILING_INIT(kg, event)
ccl_device_inline void path_state_rng_2D(KernelGlobals *kg, const ccl_addr_space PathState *state, int dimension, float *fx, float *fy)
ccl_device_inline void path_branched_rng_2D(KernelGlobals *kg, uint rng_hash, const ccl_addr_space PathState *state, int branch, int num_branches, int dimension, float *fx, float *fy)
ccl_device_inline float path_branched_rng_light_termination(KernelGlobals *kg, uint rng_hash, const ccl_addr_space PathState *state, int branch, int num_branches)
ccl_device_inline float path_state_rng_light_termination(KernelGlobals *kg, const ccl_addr_space PathState *state)
ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, ShaderData *sd, const ShaderClosure *sc, float randu, float randv, BsdfEval *bsdf_eval, float3 *omega_in, differential3 *domega_in, float *pdf)
ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg, ShaderData *sd, float randu, float randv, BsdfEval *bsdf_eval, float3 *omega_in, differential3 *domega_in, float *pdf)
ccl_device_inline bool shadow_blocked(KernelGlobals *kg, ShaderData *sd, ShaderData *shadow_sd, ccl_addr_space PathState *state, Ray *ray, float3 *shadow)
@ PATH_RAY_SHADOW_CATCHER
static void sample(SocketReader *reader, int x, int y, float color[4])
__forceinline bool all(const avxb &b)
ccl_device_inline int ceil_to_int(float f)
ccl_device_inline float2 normalize(const float2 &a)
@ PROFILING_SURFACE_BOUNCE
@ PROFILING_CONNECT_LIGHT