45#if defined(__PATH_GUIDING__)
46 const float pi_factor = 2.0f;
47 if (ris_sample->avg_bsdf_eval > 0.0f && ris_sample->bsdf_pdf > 1e-10f &&
48 ris_sample->guide_pdf > 0.0f)
50 ris_sample->ris_target = (ris_sample->avg_bsdf_eval *
51 ((((1.0f - guiding_sampling_prob) * (1.0f / (pi_factor *
M_PI_F))) +
52 (guiding_sampling_prob * ris_sample->incoming_radiance_pdf))));
53 ris_sample->ris_pdf = (0.5f * (ris_sample->bsdf_pdf + ris_sample->guide_pdf));
54 ris_sample->ris_weight = ris_sample->ris_target / ris_sample->ris_pdf;
57 ris_sample->ris_target = 0.0f;
58 ris_sample->ris_pdf = 0.0f;
65#if defined(__PATH_GUIDING__)
66static pgl_vec3f guiding_vec3f(
const float3 v)
68 return {
v.x,
v.y,
v.z};
73 return {
v.x,
v.y,
v.z};
88#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
95 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
96 const pgl_vec3f one = guiding_vec3f(
one_float3());
98 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
99 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(sd->P));
100 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(sd->wi));
101 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
102 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
103 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
104 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
105 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0);
119#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
127 const bool is_delta = (min_roughness == 0.0f);
133 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(
one_float3()));
134 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
135 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(normal));
136 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(wo));
137 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, pdf);
138 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
139 openpgl::cpp::SetIsDelta(
state->guiding.path_segment, is_delta);
140 openpgl::cpp::SetEta(
state->guiding.path_segment, eta);
141 openpgl::cpp::SetRoughness(
state->guiding.path_segment, min_roughness);
149 const float mis_weight)
151#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
160 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, guiding_vec3f(Le_rgb));
161 openpgl::cpp::SetMiWeight(
state->guiding.path_segment, mis_weight);
176#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
183 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
184 const pgl_vec3f one = guiding_vec3f(
one_float3());
186 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
187 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(
P));
188 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(wi));
189 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
true);
190 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
191 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
192 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
193 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0);
204#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
216 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(
zero_float3()));
217 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
218 openpgl::cpp::SetIsDelta(
state->guiding.path_segment,
false);
219 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0f);
220 openpgl::cpp::SetRoughness(
state->guiding.path_segment, 1.0f);
236#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
248 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
249 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(normal));
250 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(wo));
251 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, pdf);
252 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
266#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
273 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
274 const pgl_vec3f one = guiding_vec3f(
one_float3());
276 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
278 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(
P));
279 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(
I));
280 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
true);
281 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
282 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
283 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
284 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0);
294 const float roughness)
296#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
308 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
true);
309 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(
one_float3()));
310 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(normal));
311 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(wo));
312 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, pdf);
313 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
314 openpgl::cpp::SetIsDelta(
state->guiding.path_segment,
false);
315 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0f);
316 openpgl::cpp::SetRoughness(
state->guiding.path_segment, roughness);
324 const float3 transmittance_weight)
326#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
333 if (
state->guiding.path_segment) {
335 if ((transmittance_weight[0] < 0.0f || !std::isfinite(transmittance_weight[0]) ||
336 std::isnan(transmittance_weight[0])) ||
337 (transmittance_weight[1] < 0.0f || !std::isfinite(transmittance_weight[1]) ||
338 std::isnan(transmittance_weight[1])) ||
339 (transmittance_weight[2] < 0.0f || !std::isfinite(transmittance_weight[2]) ||
340 std::isnan(transmittance_weight[2])))
344 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment,
345 guiding_vec3f(transmittance_weight));
356#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
363 if (
state->guiding.path_segment) {
366 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, guiding_vec3f(Le_rgb));
367 openpgl::cpp::SetMiWeight(
state->guiding.path_segment, 1.0f);
381#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
388 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
389 const pgl_vec3f one = guiding_vec3f(
one_float3());
392 const float3 P = ray_P + isect->t * ray_D;
394 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
395 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(
P));
396 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(-ray_D));
397 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(-ray_D));
398 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(ray_D));
399 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, 1.0f);
400 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
401 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
402 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
403 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
404 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, one);
405 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0f);
416 const float mis_weight)
418#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
428 const float3 P = ray_P + (1e6f) * ray_D;
431 openpgl::cpp::PathSegment background_segment;
432 openpgl::cpp::SetPosition(&background_segment, guiding_vec3f(
P));
433 openpgl::cpp::SetNormal(&background_segment, guiding_vec3f(normal));
434 openpgl::cpp::SetDirectionOut(&background_segment, guiding_vec3f(-ray_D));
435 openpgl::cpp::SetDirectContribution(&background_segment, guiding_vec3f(L_rgb));
436 openpgl::cpp::SetMiWeight(&background_segment, mis_weight);
437 kg->opgl_path_segment_storage->AddSegment(background_segment);
446#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
450 if (
state->shadow_path.path_segment) {
458 if (mis_weight == 0.0f) {
461 openpgl::cpp::AddScatteredContribution(
state->shadow_path.path_segment,
462 guiding_vec3f(Lo_rgb));
467 openpgl::cpp::SetDirectContribution(
state->shadow_path.path_segment,
468 guiding_vec3f(Lo_rgb / mis_weight));
469 openpgl::cpp::SetMiWeight(
state->shadow_path.path_segment, mis_weight);
480#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
487 if (
state->guiding.path_segment) {
488 openpgl::cpp::SetRussianRouletteProbability(
state->guiding.path_segment,
489 continuation_probability);
504#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
505# ifdef WITH_CYCLES_DEBUG
517 float guiding_prob =
state->guiding.surface_guiding_sampling_prob;
522 float avg_roughness = 0.0f;
523 float sum_sample_weight = 0.0f;
524 for (
int i = 0;
i < sd->num_closure;
i++) {
531 sum_sample_weight += sc->sample_weight;
534 avg_roughness = avg_roughness > 0.0f ? avg_roughness / sum_sample_weight : 0.0f;
554#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
555 if (guiding_ssd->Init(guiding_guiding_field, guiding_point3f(
P), rand)) {
556 guiding_ssd->ApplyCosineProduct(guiding_point3f(
N));
567#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
569 const pgl_point2f rand = {rand_bsdf.
x, rand_bsdf.
y};
570 const float pdf = guiding_ssd->SamplePDF(rand, pgl_wo);
580#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
581 return guiding_ssd->PDF(guiding_vec3f(wo));
590#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
591 return guiding_ssd->IncomingRadiancePDF(guiding_vec3f(wo));
602#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
604 if (
fabsf(g) >= 0.99f) {
608 if (guiding_vsd->Init(guiding_guiding_field, guiding_point3f(
P), rand)) {
609 guiding_vsd->ApplySingleLobeHenyeyGreensteinProduct(guiding_vec3f(
D), g);
621#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
623 const pgl_point2f rand = {rand_phase.
x, rand_phase.
y};
624 const float pdf = guiding_vsd->SamplePDF(rand, pgl_wo);
634#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
635 return guiding_vsd->PDF(guiding_vec3f(wo));
MINLINE float safe_sqrtf(float a)
ATTR_WARN_UNUSED_RESULT const BMVert * v
CCL_NAMESPACE_BEGIN ccl_device_inline float bsdf_get_specular_roughness_squared(const ccl_private ShaderClosure *sc)
ccl_device_inline Spectrum safe_divide_color(Spectrum a, Spectrum b, const float fallback=0.0f)
#define kernel_assert(cond)
#define ccl_device_forceinline
const ThreadKernelGlobalsCPU * KernelGlobals
#define CLOSURE_IS_BSDF_OR_BSSRDF(type)
#define CCL_NAMESPACE_END
#define assert(assertion)
constexpr T clamp(T, U, U) RET
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
ccl_device_forceinline void guiding_write_debug_passes(KernelGlobals kg, IntegratorState state, const ccl_private ShaderData *sd, ccl_global float *ccl_restrict render_buffer)
ccl_device_forceinline void guiding_record_background(KernelGlobals kg, IntegratorState state, const Spectrum L, const float mis_weight)
ccl_device_forceinline void guiding_record_volume_segment(KernelGlobals kg, IntegratorState state, const float3 P, const float3 I)
ccl_device_forceinline bool guiding_bsdf_init(KernelGlobals kg, const float3 P, const float3 N, ccl_private float &rand)
ccl_device_forceinline float guiding_surface_incoming_radiance_pdf(KernelGlobals kg, const float3 wo)
ccl_device_forceinline void guiding_record_light_surface_segment(KernelGlobals kg, IntegratorState state, const ccl_private Intersection *ccl_restrict isect)
ccl_device_forceinline void guiding_record_surface_emission(KernelGlobals kg, IntegratorState state, const Spectrum Le, const float mis_weight)
ccl_device_forceinline bool guiding_phase_init(KernelGlobals kg, const float3 P, const float3 D, const float g, ccl_private float &rand)
ccl_device_forceinline float guiding_bsdf_pdf(KernelGlobals kg, const float3 wo)
ccl_device_forceinline float guiding_phase_pdf(KernelGlobals kg, const float3 wo)
ccl_device_forceinline void guiding_record_volume_emission(KernelGlobals kg, IntegratorState state, const Spectrum Le)
ccl_device_forceinline void guiding_record_bssrdf_bounce(KernelGlobals kg, IntegratorState state, const float pdf, const float3 N, const float3 wo, const Spectrum weight, const Spectrum albedo)
ccl_device_forceinline void guiding_record_surface_bounce(KernelGlobals kg, IntegratorState state, const Spectrum weight, const float pdf, const float3 N, const float3 wo, const float2 roughness, const float eta)
ccl_device_forceinline void guiding_record_direct_light(KernelGlobals kg, IntegratorShadowState state)
ccl_device_forceinline void guiding_record_volume_bounce(KernelGlobals kg, IntegratorState state, const Spectrum weight, const float pdf, const float3 wo, const float roughness)
ccl_device_forceinline float guiding_bsdf_sample(KernelGlobals kg, const float2 rand_bsdf, ccl_private float3 *wo)
ccl_device_forceinline bool calculate_ris_target(ccl_private GuidingRISSample *ris_sample, const ccl_private float guiding_sampling_prob)
ccl_device_forceinline void guiding_record_continuation_probability(KernelGlobals kg, IntegratorState state, const float continuation_probability)
ccl_device_forceinline void guiding_record_volume_transmission(KernelGlobals kg, IntegratorState state, const float3 transmittance_weight)
ccl_device_forceinline void guiding_record_surface_segment(KernelGlobals kg, IntegratorState state, const ccl_private ShaderData *sd)
ccl_device_forceinline float guiding_phase_sample(KernelGlobals kg, const float2 rand_phase, ccl_private float3 *wo)
ccl_device_forceinline void guiding_record_bssrdf_segment(KernelGlobals kg, IntegratorState state, const float3 P, const float3 wi)
ccl_device_forceinline void guiding_record_bssrdf_weight(KernelGlobals kg, IntegratorState state, const Spectrum weight, const Spectrum albedo)
@ PATH_RAY_SHADOW_CATCHER_PASS
ccl_device_inline float3 spectrum_to_rgb(Spectrum s)
ccl_device_inline float3 one_float3()
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
IntegratorShadowStateCPU * IntegratorShadowState
#define INTEGRATOR_STATE(state, nested_struct, member)
IntegratorStateCPU * IntegratorState
float incoming_radiance_pdf
ccl_device_inline void film_write_pass_float(ccl_global float *ccl_restrict buffer, const float value)
CCL_NAMESPACE_BEGIN ccl_device_forceinline ccl_global float * film_pass_pixel_render_buffer(KernelGlobals kg, ConstIntegratorState state, ccl_global float *ccl_restrict render_buffer)