27#if defined(__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;
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)) ||
115 if (
kernel_data.integrator.guiding_directional_sampling_type ==
119 state, guiding, surface_guiding_sampling_prob) = surface_guiding_probability *
120 diffuse_sampling_fraction;
122 else if (
kernel_data.integrator.guiding_directional_sampling_type ==
126 state, guiding, surface_guiding_sampling_prob) = surface_guiding_probability;
130 state, guiding, surface_guiding_sampling_prob) = surface_guiding_probability *
144 const uint32_t path_flag)
148 const int filter_closures =
kernel_data.integrator.filter_closures;
158 for (
int i = 0;
i < sd->num_closure;
i++) {
164 const bool filter_glass = filter_glossy && filter_transmission;
171 sc->sample_weight = 0.0f;
177 sc->sample_weight = 0.0f;
194 const float blur_pdf =
kernel_data.integrator.filter_glossy *
197 if (blur_pdf < 1.0f) {
198 const float blur_roughness =
sqrtf(1.0f - blur_pdf) * 0.5f;
200 for (
int i = 0;
i < sd->num_closure;
i++) {
217#ifdef WITH_CYCLES_DEBUG
222 const float2 org_roughness,
240 const uint light_shader_flags)
262 if ((light_shader_flags & exclude_glass) == exclude_glass) {
276 float sum_sample_weight,
277 const uint light_shader_flags)
281 for (
int i = 0;
i < sd->num_closure;
i++) {
290 float bsdf_pdf = 0.0f;
293 if (bsdf_pdf != 0.0f) {
297 sum_pdf += bsdf_pdf * sc->sample_weight;
301 sum_sample_weight += sc->sample_weight;
305 return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
313 const uint light_shader_flags)
317 float sum_pdf = 0.0f;
318 float sum_sample_weight = 0.0f;
320 for (
int i = 0;
i < sd->num_closure;
i++) {
325 float bsdf_pdf = 0.0f;
328 if (bsdf_pdf != 0.0f) {
332 sum_pdf += bsdf_pdf * sc->sample_weight;
334 pdfs[
i] = bsdf_pdf * sc->sample_weight;
344 sum_sample_weight += sc->sample_weight;
350 if (sum_pdf > 0.0f) {
351 for (
int i = 0;
i < sd->num_closure;
i++) {
356 return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
359#ifndef __KERNEL_CUDA__
370 const uint light_shader_flags)
375 kg, sd, wo,
nullptr,
bsdf_eval, 0.0f, 0.0f, light_shader_flags);
383#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
387 state, guiding, surface_guiding_sampling_prob);
391 if (
kernel_data.integrator.guiding_directional_sampling_type ==
394 pdf = (0.5f * guide_pdf * (1.0f - bssrdf_sampling_prob)) + 0.5f * pdf;
397 pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) +
398 (1.0f - guiding_sampling_prob) * pdf;
413 if (sd->num_closure > 1) {
417 for (
int i = 0;
i < sd->num_closure;
i++) {
421 sum += sc->sample_weight;
425 const float r = (*rand_bsdf).z *
sum;
426 float partial_sum = 0.0f;
428 for (
int i = 0;
i < sd->num_closure;
i++) {
432 const float next_sum = partial_sum + sc->sample_weight;
438 (*rand_bsdf).z = (r - partial_sum) / sc->sample_weight;
442 partial_sum = next_sum;
447 return &sd->closure[sampled];
455 Spectrum weight = bssrdf_sc->weight;
457 if (sd->num_closure > 1) {
459 for (
int i = 0;
i < sd->num_closure;
i++) {
463 sum += sc->sample_weight;
466 weight *=
sum / bssrdf_sc->sample_weight;
472#if defined(__PATH_GUIDING__)
493 state, guiding, surface_guiding_sampling_prob);
497 bool sample_guiding =
false;
500 if (use_surface_guiding && rand_bsdf_guiding < guiding_sampling_prob) {
501 sample_guiding =
true;
502 rand_bsdf_guiding /= guiding_sampling_prob;
505 rand_bsdf_guiding -= guiding_sampling_prob;
506 rand_bsdf_guiding /= (1.0f - guiding_sampling_prob);
514 *unguided_bsdf_pdf = 0.0f;
515 float guide_pdf = 0.0f;
517 if (sample_guiding) {
522 if (guide_pdf != 0.0f) {
526 kg, sd, *wo,
bsdf_eval, unguided_bsdf_pdfs, 0);
527 *bsdf_pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) +
528 ((1.0f - guiding_sampling_prob) * (*unguided_bsdf_pdf));
529 float sum_pdfs = 0.0f;
531 if (*unguided_bsdf_pdf > 0.0f) {
533 for (
int i = 0;
i < sd->num_closure;
i++) {
534 sum_pdfs += unguided_bsdf_pdfs[
i];
535 if (rand_bsdf_guiding <= sum_pdfs) {
545 idx = (rand_bsdf_guiding > sum_pdfs) ? sd->num_closure - 1 : idx;
547 label =
bsdf_label(kg, &sd->closure[idx], *wo);
551 *unguided_bsdf_pdf = 0.0f;
564 kg, sd, sc, rand_bsdf, &eval, wo, unguided_bsdf_pdf, sampled_roughness, eta);
565# ifdef WITH_CYCLES_DEBUG
569 if (*unguided_bsdf_pdf > 0.0f) {
570 surface_shader_validate_bsdf_sample(kg, sc, *wo, label, *sampled_roughness, *eta);
574 if (*unguided_bsdf_pdf != 0.0f) {
579 if (sd->num_closure > 1) {
580 const float sweight = sc->sample_weight;
582 kg, sd, *wo, sc,
bsdf_eval, (*unguided_bsdf_pdf) * sweight, sweight, 0);
585 *bsdf_pdf = *unguided_bsdf_pdf;
587 if (use_surface_guiding) {
589 *bsdf_pdf *= 1.0f - guiding_sampling_prob;
590 *bsdf_pdf += guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob);
619 state, guiding, surface_guiding_sampling_prob);
630 *unguided_bsdf_pdf = 0.0f;
631 float guide_pdf = 0.0f;
633 if (use_surface_guiding && guiding_sampling_prob > 0.0f) {
641 ris_samples[0].
rand = rand_bsdf;
651 &ris_samples[0].eval,
653 &ris_samples[0].bsdf_pdf,
654 &ris_samples[0].sampled_roughness,
655 &ris_samples[0].eta);
658 &ris_samples[0].
bsdf_eval, sc, ris_samples[0].wo, ris_samples[0].eval * sc->weight);
659 if (ris_samples[0].bsdf_pdf > 0.0f) {
660 if (sd->num_closure > 1) {
661 const float sweight = sc->sample_weight;
667 (ris_samples[0].bsdf_pdf) *
675 ris_samples[0].
guide_pdf *= (1.0f - bssrdf_sampling_prob);
677 kg, ris_samples[0].wo);
678 ris_samples[0].
bsdf_pdf =
max(0.0f, ris_samples[0].bsdf_pdf);
687 kg,
make_float2(ris_samples[1].rand), &ris_samples[1].wo);
688 ris_samples[1].
guide_pdf *= (1.0f - bssrdf_sampling_prob);
690 kg, ris_samples[1].wo);
692 kg, sd, ris_samples[1].wo, &ris_samples[1].
bsdf_eval, unguided_bsdf_pdfs, 0);
695 ris_samples[1].
bsdf_pdf =
max(0.0f, ris_samples[1].bsdf_pdf);
700 int num_ris_candidates = 0;
701 float sum_ris_weights = 0.0f;
704 num_ris_candidates++;
711 num_ris_candidates++;
719 if (num_ris_candidates == 0 || !(sum_ris_weights > 1e-10f)) {
725 const float rand_ris_select = rand_bsdf_guiding * sum_ris_weights;
727 float sum_ris = 0.0f;
728 for (
int i = 0;
i < 2;
i++) {
730 if (rand_ris_select <= sum_ris) {
742 guide_pdf = ris_samples[ris_idx].
ris_target * (2.0f / sum_ris_weights);
743 *unguided_bsdf_pdf = ris_samples[ris_idx].
bsdf_pdf;
744 *mis_pdf = 0.5f * (ris_samples[ris_idx].
bsdf_pdf + ris_samples[ris_idx].
guide_pdf);
745 *bsdf_pdf = guide_pdf;
747 *wo = ris_samples[ris_idx].
wo;
748 label = ris_samples[ris_idx].
label;
751 *eta = ris_samples[ris_idx].
eta;
757 if (!(*bsdf_pdf > 1e-10f)) {
768 if (ris_idx == 1 && ris_samples[1].bsdf_pdf > 0.0f) {
772 float sum_pdfs = 0.0f;
774 for (
int i = 0;
i < sd->num_closure;
i++) {
775 sum_pdfs += unguided_bsdf_pdfs[
i];
776 if (rnd <= sum_pdfs) {
785 idx = (rnd > sum_pdfs) ? sd->num_closure - 1 : idx;
787 label =
bsdf_label(kg, &sd->closure[idx], *wo);
799 kg, sd, sc, rand_bsdf, &eval, wo, unguided_bsdf_pdf, sampled_roughness, eta);
800# ifdef WITH_CYCLES_DEBUG
804 if (*unguided_bsdf_pdf > 0.0f) {
805 surface_shader_validate_bsdf_sample(kg, sc, *wo, label, *sampled_roughness, *eta);
809 if (*unguided_bsdf_pdf != 0.0f) {
814 if (sd->num_closure > 1) {
815 const float sweight = sc->sample_weight;
817 kg, sd, *wo, sc,
bsdf_eval, (*unguided_bsdf_pdf) * sweight, sweight, 0);
820 *bsdf_pdf = *unguided_bsdf_pdf;
821 *mis_pdf = *bsdf_pdf;
845 if (
kernel_data.integrator.guiding_directional_sampling_type ==
847 kernel_data.integrator.guiding_directional_sampling_type ==
850 label = surface_shader_bsdf_guided_sample_closure_mis(kg,
861 *mis_pdf = (*unguided_bsdf_pdf > 0.0f) ? *bsdf_pdf : 0.0f;
863 else if (
kernel_data.integrator.guiding_directional_sampling_type ==
866 label = surface_shader_bsdf_guided_sample_closure_ris(kg,
880 if (!(*unguided_bsdf_pdf > 0.0f)) {
908 label =
bsdf_sample(kg, sd, sc, rand_bsdf, &eval, wo, pdf, sampled_roughness, eta);
913 if (sd->num_closure > 1) {
914 const float sweight = sc->sample_weight;
927 float roughness = 0.0f;
928 float sum_weight = 0.0f;
930 for (
int i = 0;
i < sd->num_closure;
i++) {
940 sum_weight += weight;
945 return (sum_weight > 0.0f) ? roughness / sum_weight : 1.0f;
954 return sd->closure_transparent_extinction;
972 for (
int i = 0;
i < sd->num_closure;
i++) {
987 for (
int i = 0;
i < sd->num_closure;
i++) {
1002 for (
int i = 0;
i < sd->num_closure;
i++) {
1017 for (
int i = 0;
i < sd->num_closure;
i++) {
1028 const float ao_factor,
1034 for (
int i = 0;
i < sd->num_closure;
i++) {
1039 eval += sc->weight * ao_factor;
1048#ifdef __SUBSURFACE__
1053 for (
int i = 0;
i < sd->num_closure;
i++) {
1095 return sd->closure_emission_background;
1120 weight =
one_spectrum() - sd->closure_transparent_extinction;
1122 for (
int i = 0;
i < sd->num_closure;
i++) {
1136 for (
int i = 0;
i < sd->num_closure;
i++) {
1139 weight += sc->weight;
1149template<u
int node_feature_mask,
typename ConstIntegratorGenericState>
1151 ConstIntegratorGenericState
state,
1154 const uint32_t path_flag,
1155 bool use_caustics_storage =
false)
1168 sd->num_closure = 0;
1169 sd->num_closure_left = max_closures;
1189 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 void bsdf_roughness_eta(const ccl_private ShaderClosure *sc, const float3 wo, ccl_private float2 *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 int bsdf_sample(KernelGlobals kg, ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, 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 Spectrum bsdf_albedo(KernelGlobals kg, const ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, const bool reflection, const bool transmission)
ccl_device void bsdf_blur(ccl_private ShaderClosure *sc, const float roughness)
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_FEATURE_PATH_GUIDING
#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 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 float guiding_bsdf_pdf(KernelGlobals kg, const float3 wo)
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 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 bool isfinite_safe(const float f)
ccl_device_inline bool is_zero(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_WRITE(state, nested_struct, member)
#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 int surface_shader_bsdf_sample_closure(KernelGlobals kg, ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, 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_forceinline bool _surface_shader_exclude(ClosureType type, const uint light_shader_flags)
ccl_device float3 surface_shader_average_normal(const ccl_private ShaderData *sd)
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_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_ao(const ccl_private ShaderData *sd, const float ao_factor, ccl_private float3 *N_)
ccl_device Spectrum surface_shader_transparency(const ccl_private ShaderData *sd)
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 Spectrum surface_shader_alpha(const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_apply_holdout(ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_diffuse(KernelGlobals kg, const 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_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)