37#if defined(__PATH_GUIDING__)
38 const float pi_factor = 2.0f;
39 if (ris_sample->avg_bsdf_eval > 0.0f && ris_sample->bsdf_pdf > 1e-10f &&
40 ris_sample->guide_pdf > 0.0f)
42 ris_sample->ris_target = (ris_sample->avg_bsdf_eval *
43 ((((1.0f - guiding_sampling_prob) * (1.0f / (pi_factor *
M_PI_F))) +
44 (guiding_sampling_prob * ris_sample->incoming_radiance_pdf))));
45 ris_sample->ris_pdf = (0.5f * (ris_sample->bsdf_pdf + ris_sample->guide_pdf));
46 ris_sample->ris_weight = ris_sample->ris_target / ris_sample->ris_pdf;
49 ris_sample->ris_target = 0.0f;
50 ris_sample->ris_pdf = 0.0f;
57#if defined(__PATH_GUIDING__)
58static pgl_vec3f guiding_vec3f(
const float3 v)
60 return openpgl::cpp::Vector3(
v.x,
v.y,
v.z);
63static pgl_point3f guiding_point3f(
const float3 v)
65 return openpgl::cpp::Point3(
v.x,
v.y,
v.z);
80#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
85 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
86 const pgl_vec3f one = guiding_vec3f(
one_float3());
88 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
89 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(sd->P));
90 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(sd->wi));
91 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
92 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
93 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
94 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
95 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0);
110#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
115 const bool is_delta = (min_roughness == 0.0f);
121 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(
one_float3()));
122 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
123 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(normal));
124 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(wo));
125 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, pdf);
126 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
127 openpgl::cpp::SetIsDelta(
state->guiding.path_segment, is_delta);
128 openpgl::cpp::SetEta(
state->guiding.path_segment, eta);
129 openpgl::cpp::SetRoughness(
state->guiding.path_segment, min_roughness);
137 const float mis_weight)
139#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
145 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, guiding_vec3f(Le_rgb));
146 openpgl::cpp::SetMiWeight(
state->guiding.path_segment, mis_weight);
161#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
165 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
166 const pgl_vec3f one = guiding_vec3f(
one_float3());
168 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
169 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(
P));
170 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(wi));
171 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
true);
172 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
173 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
174 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
175 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0);
186#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
196 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(
zero_float3()));
197 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
198 openpgl::cpp::SetIsDelta(
state->guiding.path_segment,
false);
199 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0f);
200 openpgl::cpp::SetRoughness(
state->guiding.path_segment, 1.0f);
216#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
225 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
226 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(normal));
227 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(wo));
228 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, pdf);
229 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
243#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
247 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
248 const pgl_vec3f one = guiding_vec3f(
one_float3());
250 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
252 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(
P));
253 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(
I));
254 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
true);
255 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
256 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
257 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
258 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0);
269 const float roughness)
271#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
280 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
true);
281 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, guiding_vec3f(
one_float3()));
282 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(normal));
283 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(wo));
284 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, pdf);
285 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, guiding_vec3f(weight_rgb));
286 openpgl::cpp::SetIsDelta(
state->guiding.path_segment,
false);
287 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0f);
288 openpgl::cpp::SetRoughness(
state->guiding.path_segment, roughness);
296 const float3 transmittance_weight)
298#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
303 if (
state->guiding.path_segment) {
305 if ((transmittance_weight[0] < 0.0f || !std::isfinite(transmittance_weight[0]) ||
306 std::isnan(transmittance_weight[0])) ||
307 (transmittance_weight[1] < 0.0f || !std::isfinite(transmittance_weight[1]) ||
308 std::isnan(transmittance_weight[1])) ||
309 (transmittance_weight[2] < 0.0f || !std::isfinite(transmittance_weight[2]) ||
310 std::isnan(transmittance_weight[2])))
314 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment,
315 guiding_vec3f(transmittance_weight));
326#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
331 if (
state->guiding.path_segment) {
334 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, guiding_vec3f(Le_rgb));
335 openpgl::cpp::SetMiWeight(
state->guiding.path_segment, 1.0f);
349#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
353 const pgl_vec3f zero = guiding_vec3f(
zero_float3());
354 const pgl_vec3f one = guiding_vec3f(
one_float3());
357 const float3 P = ray_P + isect->t * ray_D;
359 state->guiding.path_segment = kg->opgl_path_segment_storage->NextSegment();
360 openpgl::cpp::SetPosition(
state->guiding.path_segment, guiding_point3f(
P));
361 openpgl::cpp::SetDirectionOut(
state->guiding.path_segment, guiding_vec3f(-ray_D));
362 openpgl::cpp::SetNormal(
state->guiding.path_segment, guiding_vec3f(-ray_D));
363 openpgl::cpp::SetDirectionIn(
state->guiding.path_segment, guiding_vec3f(ray_D));
364 openpgl::cpp::SetPDFDirectionIn(
state->guiding.path_segment, 1.0f);
365 openpgl::cpp::SetVolumeScatter(
state->guiding.path_segment,
false);
366 openpgl::cpp::SetScatteredContribution(
state->guiding.path_segment, zero);
367 openpgl::cpp::SetDirectContribution(
state->guiding.path_segment, zero);
368 openpgl::cpp::SetTransmittanceWeight(
state->guiding.path_segment, one);
369 openpgl::cpp::SetScatteringWeight(
state->guiding.path_segment, one);
370 openpgl::cpp::SetEta(
state->guiding.path_segment, 1.0f);
381 const float mis_weight)
383#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
391 const float3 P = ray_P + (1e6f) * ray_D;
394 openpgl::cpp::PathSegment background_segment;
395 openpgl::cpp::SetPosition(&background_segment, guiding_vec3f(
P));
396 openpgl::cpp::SetNormal(&background_segment, guiding_vec3f(normal));
397 openpgl::cpp::SetDirectionOut(&background_segment, guiding_vec3f(-ray_D));
398 openpgl::cpp::SetDirectContribution(&background_segment, guiding_vec3f(L_rgb));
399 openpgl::cpp::SetMiWeight(&background_segment, mis_weight);
400 kg->opgl_path_segment_storage->AddSegment(background_segment);
409#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
413 if (
state->shadow_path.path_segment) {
421 if (mis_weight == 0.0f) {
424 openpgl::cpp::AddScatteredContribution(
state->shadow_path.path_segment,
425 guiding_vec3f(Lo_rgb));
430 openpgl::cpp::SetDirectContribution(
state->shadow_path.path_segment,
431 guiding_vec3f(Lo_rgb / mis_weight));
432 openpgl::cpp::SetMiWeight(
state->shadow_path.path_segment, mis_weight);
443#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 1
448 if (
state->guiding.path_segment) {
449 openpgl::cpp::SetRussianRouletteProbability(
state->guiding.path_segment,
450 continuation_probability);
465#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
466# ifdef WITH_CYCLES_DEBUG
478 float guiding_prob =
state->guiding.surface_guiding_sampling_prob;
483 float avg_roughness = 0.0f;
484 float sum_sample_weight = 0.0f;
485 for (
int i = 0; i < sd->num_closure; i++) {
492 sum_sample_weight += sc->sample_weight;
495 avg_roughness = avg_roughness > 0.0f ? avg_roughness / sum_sample_weight : 0.0f;
511#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
512 if (kg->opgl_surface_sampling_distribution->Init(
513 kg->opgl_guiding_field, guiding_point3f(
P), rand))
515 kg->opgl_surface_sampling_distribution->ApplyCosineProduct(guiding_point3f(
N));
528#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
530 const pgl_point2f rand = openpgl::cpp::Point2(rand_bsdf.
x, rand_bsdf.
y);
531 const float pdf = kg->opgl_surface_sampling_distribution->SamplePDF(rand, pgl_wo);
543#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
544 return kg->opgl_surface_sampling_distribution->PDF(guiding_vec3f(wo));
554#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
555 return kg->opgl_surface_sampling_distribution->IncomingRadiancePDF(guiding_vec3f(wo));
570#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
572 if (
fabsf(g) >= 0.99f) {
576 if (kg->opgl_volume_sampling_distribution->Init(
577 kg->opgl_guiding_field, guiding_point3f(
P), rand))
579 kg->opgl_volume_sampling_distribution->ApplySingleLobeHenyeyGreensteinProduct(guiding_vec3f(D),
593#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
595 const pgl_point2f rand = openpgl::cpp::Point2(rand_phase.
x, rand_phase.
y);
596 const float pdf = kg->opgl_volume_sampling_distribution->SamplePDF(rand, pgl_wo);
608#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
609 return kg->opgl_volume_sampling_distribution->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(ccl_private const ShaderClosure *sc)
#define kernel_assert(cond)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define ccl_device_forceinline
#define CCL_NAMESPACE_END
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int ccl_global float * render_buffer
ccl_device_forceinline float guiding_bsdf_pdf(KernelGlobals kg, IntegratorState state, const float3 wo)
ccl_device_forceinline void guiding_record_surface_bounce(KernelGlobals kg, IntegratorState state, ccl_private const ShaderData *sd, const Spectrum weight, const float pdf, const float3 N, const float3 wo, const float2 roughness, const float eta)
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 void guiding_record_surface_emission(KernelGlobals kg, IntegratorState state, const Spectrum Le, const float mis_weight)
ccl_device_forceinline float guiding_phase_sample(KernelGlobals kg, IntegratorState state, const float2 rand_phase, ccl_private float3 *wo)
ccl_device_forceinline float guiding_phase_pdf(KernelGlobals kg, IntegratorState state, const float3 wo)
ccl_device_forceinline void guiding_write_debug_passes(KernelGlobals kg, IntegratorState state, ccl_private const ShaderData *sd, ccl_global float *ccl_restrict render_buffer)
ccl_device_forceinline bool calculate_ris_target(ccl_private GuidingRISSample *ris_sample, ccl_private const float guiding_sampling_prob)
ccl_device_forceinline void guiding_record_light_surface_segment(KernelGlobals kg, IntegratorState state, ccl_private const Intersection *ccl_restrict isect)
ccl_device_forceinline void guiding_record_volume_bounce(KernelGlobals kg, IntegratorState state, ccl_private const ShaderData *sd, const Spectrum weight, const float pdf, const float3 wo, const float roughness)
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_direct_light(KernelGlobals kg, IntegratorShadowState state)
ccl_device_forceinline void guiding_record_continuation_probability(KernelGlobals kg, IntegratorState state, const float continuation_probability)
ccl_device_forceinline void guiding_record_surface_segment(KernelGlobals kg, IntegratorState state, ccl_private const ShaderData *sd)
ccl_device_forceinline void guiding_record_volume_transmission(KernelGlobals kg, IntegratorState state, const float3 transmittance_weight)
ccl_device_forceinline float guiding_bsdf_sample(KernelGlobals kg, IntegratorState state, const float2 rand_bsdf, ccl_private float3 *wo)
ccl_device_forceinline float guiding_surface_incoming_radiance_pdf(KernelGlobals kg, IntegratorState state, const float3 wo)
ccl_device_forceinline bool guiding_phase_init(KernelGlobals kg, IntegratorState state, const float3 P, const float3 D, const float g, ccl_private float &rand)
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)
ccl_device_forceinline bool guiding_bsdf_init(KernelGlobals kg, IntegratorState state, const float3 P, const float3 N, ccl_private float &rand)
#define CLOSURE_IS_BSDF_OR_BSSRDF(type)
ccl_device_inline float3 spectrum_to_rgb(Spectrum s)
ccl_device_inline float3 one_float3()
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
IntegratorStateCPU *ccl_restrict IntegratorState
#define INTEGRATOR_STATE(state, nested_struct, member)
IntegratorShadowStateCPU *ccl_restrict IntegratorShadowState
float incoming_radiance_pdf
SPECTRUM_DATA_TYPE Spectrum
ccl_device_inline Spectrum safe_divide_color(Spectrum a, Spectrum b)
ccl_device_inline int clamp(int a, int mn, int mx)
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)
ccl_device_inline void film_write_pass_float(ccl_global float *ccl_restrict buffer, float value)