27#ifdef __PATH_GUIDING__
29ccl_device float surface_shader_average_sample_weight_squared_roughness(
32 float avg_squared_roughness = 0.0f;
33 float sum_sample_weight = 0.0f;
34 for (
int i = 0;
i < sd->num_closure;
i++) {
41 sum_sample_weight += sc->sample_weight;
44 avg_squared_roughness = avg_squared_roughness > 0.0f ?
45 avg_squared_roughness / sum_sample_weight :
47 return avg_squared_roughness;
57 state->guiding.use_surface_guiding =
false;
61 const float surface_guiding_probability =
kernel_data.integrator.surface_guiding_probability;
62 const int guiding_directional_sampling_type =
63 kernel_data.integrator.guiding_directional_sampling_type;
64 const float guiding_roughness_threshold =
kernel_data.integrator.guiding_roughness_threshold;
68 float diffuse_sampling_fraction = 0.0f;
69 float bssrdf_sampling_fraction = 0.0f;
70 float bsdf_bssrdf_sampling_sum = 0.0f;
72 bool fully_opaque =
true;
74 for (
int i = 0;
i < sd->num_closure;
i++) {
75 ShaderClosure *sc = &sd->closure[
i];
77 const float sweight = sc->sample_weight;
80 bsdf_bssrdf_sampling_sum += sweight;
82 diffuse_sampling_fraction += sweight;
85 bssrdf_sampling_fraction += sweight;
94 if (bsdf_bssrdf_sampling_sum > 0.0f) {
95 diffuse_sampling_fraction /= bsdf_bssrdf_sampling_sum;
96 bssrdf_sampling_fraction /= bsdf_bssrdf_sampling_sum;
102 float avg_roughness = surface_shader_average_sample_weight_squared_roughness(sd);
104 if (!fully_opaque || avg_roughness < guiding_roughness_threshold ||
106 (diffuse_sampling_fraction <= 0.0f)) ||
109 state->guiding.use_surface_guiding =
false;
110 state->guiding.surface_guiding_sampling_prob = 0.0f;
114 state->guiding.use_surface_guiding =
true;
115 if (
kernel_data.integrator.guiding_directional_sampling_type ==
118 state->guiding.surface_guiding_sampling_prob = surface_guiding_probability *
119 diffuse_sampling_fraction;
121 else if (
kernel_data.integrator.guiding_directional_sampling_type ==
124 state->guiding.surface_guiding_sampling_prob = surface_guiding_probability;
127 state->guiding.surface_guiding_sampling_prob = surface_guiding_probability * avg_roughness;
129 state->guiding.bssrdf_sampling_prob = bssrdf_sampling_fraction;
130 state->guiding.sample_surface_guiding_rand = rand_bsdf_guiding;
133 state->guiding.surface_guiding_sampling_prob <= 1.0f);
140 const uint32_t path_flag)
144 const int filter_closures =
kernel_data.integrator.filter_closures;
154 for (
int i = 0;
i < sd->num_closure;
i++) {
160 const bool filter_glass = filter_glossy && filter_transmission;
167 sc->sample_weight = 0.0f;
173 sc->sample_weight = 0.0f;
190 const float blur_pdf =
kernel_data.integrator.filter_glossy *
193 if (blur_pdf < 1.0f) {
194 const float blur_roughness =
sqrtf(1.0f - blur_pdf) * 0.5f;
196 for (
int i = 0;
i < sd->num_closure;
i++) {
213#ifdef WITH_CYCLES_DEBUG
218 const float2 org_roughness,
235 const uint light_shader_flags)
257 if ((light_shader_flags & exclude_glass) == exclude_glass) {
271 float sum_sample_weight,
272 const uint light_shader_flags)
276 for (
int i = 0;
i < sd->num_closure;
i++) {
285 float bsdf_pdf = 0.0f;
288 if (bsdf_pdf != 0.0f) {
290 sum_pdf += bsdf_pdf * sc->sample_weight;
294 sum_sample_weight += sc->sample_weight;
298 return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
306 const uint light_shader_flags)
310 float sum_pdf = 0.0f;
311 float sum_sample_weight = 0.0f;
313 for (
int i = 0;
i < sd->num_closure;
i++) {
318 float bsdf_pdf = 0.0f;
321 if (bsdf_pdf != 0.0f) {
323 sum_pdf += bsdf_pdf * sc->sample_weight;
325 pdfs[
i] = bsdf_pdf * sc->sample_weight;
335 sum_sample_weight += sc->sample_weight;
341 if (sum_pdf > 0.0f) {
342 for (
int i = 0;
i < sd->num_closure;
i++) {
347 return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
350#ifndef __KERNEL_CUDA__
361 const uint light_shader_flags)
366 kg, sd, wo,
nullptr,
bsdf_eval, 0.0f, 0.0f, light_shader_flags);
374#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
375 if (pdf > 0.0f &&
state->guiding.use_surface_guiding) {
376 const float guiding_sampling_prob =
state->guiding.surface_guiding_sampling_prob;
377 const float bssrdf_sampling_prob =
state->guiding.bssrdf_sampling_prob;
380 if (
kernel_data.integrator.guiding_directional_sampling_type ==
383 pdf = (0.5f * guide_pdf * (1.0f - bssrdf_sampling_prob)) + 0.5f * pdf;
386 pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) +
387 (1.0f - guiding_sampling_prob) * pdf;
401 if (sd->num_closure > 1) {
405 for (
int i = 0;
i < sd->num_closure;
i++) {
409 sum += sc->sample_weight;
413 const float r = (*rand_bsdf).z *
sum;
414 float partial_sum = 0.0f;
416 for (
int i = 0;
i < sd->num_closure;
i++) {
420 const float next_sum = partial_sum + sc->sample_weight;
426 (*rand_bsdf).z = (r - partial_sum) / sc->sample_weight;
430 partial_sum = next_sum;
435 return &sd->closure[sampled];
443 Spectrum weight = bssrdf_sc->weight;
445 if (sd->num_closure > 1) {
447 for (
int i = 0;
i < sd->num_closure;
i++) {
451 sum += sc->sample_weight;
454 weight *=
sum / bssrdf_sc->sample_weight;
460#ifdef __PATH_GUIDING__
479 const bool use_surface_guiding =
state->guiding.use_surface_guiding;
480 const float guiding_sampling_prob =
state->guiding.surface_guiding_sampling_prob;
481 const float bssrdf_sampling_prob =
state->guiding.bssrdf_sampling_prob;
484 bool sample_guiding =
false;
485 float rand_bsdf_guiding =
state->guiding.sample_surface_guiding_rand;
487 if (use_surface_guiding && rand_bsdf_guiding < guiding_sampling_prob) {
488 sample_guiding =
true;
489 rand_bsdf_guiding /= guiding_sampling_prob;
492 rand_bsdf_guiding -= guiding_sampling_prob;
493 rand_bsdf_guiding /= (1.0f - guiding_sampling_prob);
501 *unguided_bsdf_pdf = 0.0f;
502 float guide_pdf = 0.0f;
504 if (sample_guiding) {
509 if (guide_pdf != 0.0f) {
513 kg, sd, *wo,
bsdf_eval, unguided_bsdf_pdfs, 0);
514 *bsdf_pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) +
515 ((1.0f - guiding_sampling_prob) * (*unguided_bsdf_pdf));
516 float sum_pdfs = 0.0f;
518 if (*unguided_bsdf_pdf > 0.0f) {
520 for (
int i = 0;
i < sd->num_closure;
i++) {
521 sum_pdfs += unguided_bsdf_pdfs[
i];
522 if (rand_bsdf_guiding <= sum_pdfs) {
532 idx = (rand_bsdf_guiding > sum_pdfs) ? sd->num_closure - 1 : idx;
534 label =
bsdf_label(kg, &sd->closure[idx], *wo);
538 *unguided_bsdf_pdf = 0.0f;
560# ifdef WITH_CYCLES_DEBUG
564 if (*unguided_bsdf_pdf > 0.0f) {
565 surface_shader_validate_bsdf_sample(kg, sc, *wo, label, *sampled_roughness, *eta);
569 if (*unguided_bsdf_pdf != 0.0f) {
574 if (sd->num_closure > 1) {
575 const float sweight = sc->sample_weight;
577 kg, sd, *wo, sc,
bsdf_eval, (*unguided_bsdf_pdf) * sweight, sweight, 0);
580 *bsdf_pdf = *unguided_bsdf_pdf;
582 if (use_surface_guiding) {
584 *bsdf_pdf *= 1.0f - guiding_sampling_prob;
585 *bsdf_pdf += guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob);
612 const bool use_surface_guiding =
state->guiding.use_surface_guiding;
613 const float guiding_sampling_prob =
state->guiding.surface_guiding_sampling_prob;
614 const float bssrdf_sampling_prob =
state->guiding.bssrdf_sampling_prob;
617 const float rand_bsdf_guiding =
state->guiding.sample_surface_guiding_rand;
624 *unguided_bsdf_pdf = 0.0f;
625 float guide_pdf = 0.0f;
627 if (use_surface_guiding && guiding_sampling_prob > 0.0f) {
635 ris_samples[0].
rand = rand_bsdf;
646 &ris_samples[0].eval,
648 &ris_samples[0].bsdf_pdf,
649 &ris_samples[0].sampled_roughness,
650 &ris_samples[0].eta);
653 &ris_samples[0].
bsdf_eval, sc, ris_samples[0].wo, ris_samples[0].eval * sc->weight);
654 if (ris_samples[0].bsdf_pdf > 0.0f) {
655 if (sd->num_closure > 1) {
656 const float sweight = sc->sample_weight;
662 (ris_samples[0].bsdf_pdf) *
670 ris_samples[0].
guide_pdf *= (1.0f - bssrdf_sampling_prob);
672 kg,
state, ris_samples[0].wo);
673 ris_samples[0].
bsdf_pdf =
max(0.0f, ris_samples[0].bsdf_pdf);
683 ris_samples[1].
guide_pdf *= (1.0f - bssrdf_sampling_prob);
685 kg,
state, ris_samples[1].wo);
687 kg, sd, ris_samples[1].wo, &ris_samples[1].
bsdf_eval, unguided_bsdf_pdfs, 0);
690 ris_samples[1].
bsdf_pdf =
max(0.0f, ris_samples[1].bsdf_pdf);
695 int num_ris_candidates = 0;
696 float sum_ris_weights = 0.0f;
699 num_ris_candidates++;
706 num_ris_candidates++;
714 if (num_ris_candidates == 0 || !(sum_ris_weights > 1e-10f)) {
720 const float rand_ris_select = rand_bsdf_guiding * sum_ris_weights;
722 float sum_ris = 0.0f;
723 for (
int i = 0;
i < 2;
i++) {
725 if (rand_ris_select <= sum_ris) {
737 guide_pdf = ris_samples[ris_idx].
ris_target * (2.0f / sum_ris_weights);
738 *unguided_bsdf_pdf = ris_samples[ris_idx].
bsdf_pdf;
739 *mis_pdf = 0.5f * (ris_samples[ris_idx].
bsdf_pdf + ris_samples[ris_idx].
guide_pdf);
740 *bsdf_pdf = guide_pdf;
742 *wo = ris_samples[ris_idx].
wo;
743 label = ris_samples[ris_idx].
label;
746 *eta = ris_samples[ris_idx].
eta;
752 if (!(*bsdf_pdf > 1e-10f)) {
763 if (ris_idx == 1 && ris_samples[1].bsdf_pdf > 0.0f) {
767 float sum_pdfs = 0.0f;
769 for (
int i = 0;
i < sd->num_closure;
i++) {
770 sum_pdfs += unguided_bsdf_pdfs[
i];
771 if (rnd <= sum_pdfs) {
780 idx = (rnd > sum_pdfs) ? sd->num_closure - 1 : idx;
782 label =
bsdf_label(kg, &sd->closure[idx], *wo);
803# ifdef WITH_CYCLES_DEBUG
807 if (*unguided_bsdf_pdf > 0.0f) {
808 surface_shader_validate_bsdf_sample(kg, sc, *wo, label, *sampled_roughness, *eta);
812 if (*unguided_bsdf_pdf != 0.0f) {
817 if (sd->num_closure > 1) {
818 const float sweight = sc->sample_weight;
820 kg, sd, *wo, sc,
bsdf_eval, (*unguided_bsdf_pdf) * sweight, sweight, 0);
823 *bsdf_pdf = *unguided_bsdf_pdf;
824 *mis_pdf = *bsdf_pdf;
848 if (
kernel_data.integrator.guiding_directional_sampling_type ==
850 kernel_data.integrator.guiding_directional_sampling_type ==
853 label = surface_shader_bsdf_guided_sample_closure_mis(kg,
864 *mis_pdf = (*unguided_bsdf_pdf > 0.0f) ? *bsdf_pdf : 0.0f;
866 else if (
kernel_data.integrator.guiding_directional_sampling_type ==
869 label = surface_shader_bsdf_guided_sample_closure_ris(kg,
883 if (!(*unguided_bsdf_pdf > 0.0f)) {
912 label =
bsdf_sample(kg, sd, sc, path_flag, rand_bsdf, &eval, wo, pdf, sampled_roughness, eta);
917 if (sd->num_closure > 1) {
918 const float sweight = sc->sample_weight;
931 float roughness = 0.0f;
932 float sum_weight = 0.0f;
934 for (
int i = 0;
i < sd->num_closure;
i++) {
944 sum_weight += weight;
949 return (sum_weight > 0.0f) ? roughness / sum_weight : 1.0f;
958 return sd->closure_transparent_extinction;
976 for (
int i = 0;
i < sd->num_closure;
i++) {
991 for (
int i = 0;
i < sd->num_closure;
i++) {
1006 for (
int i = 0;
i < sd->num_closure;
i++) {
1021 for (
int i = 0;
i < sd->num_closure;
i++) {
1033 const float ao_factor,
1039 for (
int i = 0;
i < sd->num_closure;
i++) {
1044 eval += sc->weight * ao_factor;
1053#ifdef __SUBSURFACE__
1058 for (
int i = 0;
i < sd->num_closure;
i++) {
1100 return sd->closure_emission_background;
1125 weight =
one_spectrum() - sd->closure_transparent_extinction;
1127 for (
int i = 0;
i < sd->num_closure;
i++) {
1141 for (
int i = 0;
i < sd->num_closure;
i++) {
1144 weight += sc->weight;
1154template<u
int node_feature_mask,
typename ConstIntegratorGenericState>
1156 ConstIntegratorGenericState
state,
1159 const uint32_t path_flag,
1160 bool use_caustics_storage =
false)
1173 sd->num_closure = 0;
1174 sd->num_closure_left = max_closures;
1194 if (bsdf !=
nullptr) {
MINLINE float safe_sqrtf(float a)
ccl_device_inline ccl_private ShaderClosure * bsdf_alloc(ccl_private ShaderData *sd, const int size, Spectrum weight)
CCL_NAMESPACE_BEGIN ccl_device_inline float bsdf_get_specular_roughness_squared(const ccl_private ShaderClosure *sc)
ccl_device Spectrum bsdf_eval(KernelGlobals kg, ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, const float3 wo, ccl_private float *pdf)
ccl_device_inline int bsdf_sample(KernelGlobals kg, ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, const int path_flag, const float3 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf, ccl_private float2 *sampled_roughness, ccl_private float *eta)
ccl_device_inline float bsdf_get_roughness_pass_squared(const ccl_private ShaderClosure *sc)
ccl_device_inline int bsdf_label(const KernelGlobals kg, const ccl_private ShaderClosure *sc, const float3 wo)
ccl_device_inline void bsdf_roughness_eta(const KernelGlobals kg, const ccl_private ShaderClosure *sc, const float3 wo, ccl_private float2 *roughness, ccl_private float *eta)
ccl_device void bsdf_blur(KernelGlobals kg, ccl_private ShaderClosure *sc, const float roughness)
ccl_device_inline Spectrum bsdf_albedo(KernelGlobals kg, const ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, const bool reflection, const bool transmission)
ccl_device int bsdf_diffuse_setup(ccl_private DiffuseBsdf *bsdf)
static T sum(const btAlignedObjectArray< T > &items)
void osl_eval_nodes< SHADER_TYPE_SURFACE >(const ThreadKernelGlobalsCPU *kg, const void *state, ShaderData *sd, const uint32_t path_flag)
#define kernel_assert(cond)
#define CLOSURE_IS_GLASS(type)
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
#define CLOSURE_IS_HOLDOUT(type)
#define CLOSURE_IS_BSDF_TRANSPARENT(type)
#define CLOSURE_IS_BSDF_TRANSMISSION(type)
#define CLOSURE_IS_BSDF(type)
#define KERNEL_FEATURE_OSL_SHADING
#define CLOSURE_IS_BSDF_GLOSSY(type)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CLOSURE_IS_BSDF_DIFFUSE(type)
#define CLOSURE_IS_BSDF_OR_BSSRDF(type)
#define CLOSURE_IS_BSSRDF(type)
#define CAUSTICS_MAX_CLOSURE
#define BSDF_ROUGHNESS_SQ_THRESH
#define CCL_NAMESPACE_END
ccl_device Spectrum emissive_simple_eval(const float3 Ng, const float3 wi)
VecBase< float, D > normalize(VecOp< float, D >) RET
ccl_device_forceinline float guiding_bsdf_pdf(KernelGlobals kg, IntegratorState state, const float3 wo)
ccl_device_forceinline bool calculate_ris_target(ccl_private GuidingRISSample *ris_sample, const ccl_private float guiding_sampling_prob)
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_bsdf_init(KernelGlobals kg, IntegratorState state, const float3 P, const float3 N, ccl_private float &rand)
ccl_device void svm_eval_nodes(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *sd, ccl_global float *render_buffer, const uint32_t path_flag)
@ CLOSURE_BSDF_TRANSLUCENT_ID
@ FILTER_CLOSURE_EMISSION
@ FILTER_CLOSURE_TRANSPARENT
@ FILTER_CLOSURE_DIRECT_LIGHT
@ FILTER_CLOSURE_TRANSMISSION
@ SD_HAS_CONSTANT_EMISSION
@ PRNG_SURFACE_BSDF_GUIDING
@ PRNG_SURFACE_RIS_GUIDING_0
@ PRNG_SURFACE_RIS_GUIDING_1
@ SHADER_EXCLUDE_TRANSMIT
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT_MIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS
ccl_device_inline Spectrum rgb_to_spectrum(const float3 rgb)
CCL_NAMESPACE_BEGIN ccl_device_inline void bsdf_eval_init(ccl_private BsdfEval *eval, const ccl_private ShaderClosure *sc, const float3 wo, Spectrum value)
ccl_device_inline void bsdf_eval_accum(ccl_private BsdfEval *eval, const ccl_private ShaderClosure *sc, const float3 wo, Spectrum value)
ccl_device_inline Spectrum bsdf_eval_sum(const ccl_private BsdfEval *eval)
ccl_device_inline float sqr(const float a)
ccl_device_inline bool isfinite_safe(const float f)
ccl_device_inline bool is_zero(const float2 a)
ccl_device_inline float average(const float2 a)
ccl_device_inline float reduce_min(const float2 a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
ccl_device_inline float path_state_rng_1D(KernelGlobals kg, const ccl_private RNGState *rng_state, const int dimension)
ccl_device_inline float3 path_state_rng_3D(KernelGlobals kg, const ccl_private RNGState *rng_state, const int dimension)
#define INTEGRATOR_STATE(state, nested_struct, member)
IntegratorStateCPU * IntegratorState
const IntegratorStateCPU * ConstIntegratorState
closure color bssrdf(string method, normal N, vector radius, color albedo) BUILTIN
float incoming_radiance_pdf
const ccl_device_inline ccl_private ShaderClosure * surface_shader_bsdf_bssrdf_pick(const ccl_private ShaderData *ccl_restrict sd, ccl_private float3 *rand_bsdf)
ccl_device float surface_shader_bsdf_eval(KernelGlobals kg, IntegratorState state, ccl_private ShaderData *sd, const float3 wo, ccl_private BsdfEval *bsdf_eval, const uint light_shader_flags)
ccl_device float surface_shader_average_roughness(const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_transmission(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_ao(KernelGlobals kg, const ccl_private ShaderData *sd, const float ao_factor, ccl_private float3 *N_)
ccl_device_forceinline bool _surface_shader_exclude(ClosureType type, const uint light_shader_flags)
ccl_device void surface_shader_eval(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *ccl_restrict sd, ccl_global float *ccl_restrict buffer, const uint32_t path_flag, bool use_caustics_storage=false)
ccl_device float3 surface_shader_average_normal(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_transparency(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device_inline float surface_shader_bsdf_eval_pdfs(const KernelGlobals kg, ccl_private ShaderData *sd, const float3 wo, ccl_private BsdfEval *result_eval, ccl_private float *pdfs, const uint light_shader_flags)
CCL_NAMESPACE_BEGIN ccl_device_inline void surface_shader_prepare_closures(KernelGlobals kg, ConstIntegratorState state, ccl_private ShaderData *sd, const uint32_t path_flag)
ccl_device Spectrum surface_shader_background(const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_glossy(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device int surface_shader_bsdf_sample_closure(KernelGlobals kg, ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, const int path_flag, const float3 rand_bsdf, ccl_private BsdfEval *bsdf_eval, ccl_private float3 *wo, ccl_private float *pdf, ccl_private float2 *sampled_roughness, ccl_private float *eta)
ccl_device Spectrum surface_shader_diffuse(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_apply_holdout(KernelGlobals kg, ccl_private ShaderData *sd)
ccl_device_inline Spectrum surface_shader_bssrdf_sample_weight(const ccl_private ShaderData *ccl_restrict sd, const ccl_private ShaderClosure *ccl_restrict bssrdf_sc)
ccl_device Spectrum surface_shader_alpha(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_emission(const ccl_private ShaderData *sd)
ccl_device_inline float _surface_shader_bsdf_eval_mis(KernelGlobals kg, ccl_private ShaderData *sd, const float3 wo, const ccl_private ShaderClosure *skip_sc, ccl_private BsdfEval *result_eval, float sum_pdf, float sum_sample_weight, const uint light_shader_flags)
ccl_device bool surface_shader_constant_emission(KernelGlobals kg, const int shader, ccl_private Spectrum *eval)