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++) {
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);
144 const int filter_closures =
kernel_data.integrator.filter_closures;
151 sd->flag &= ~SD_BSDF_HAS_EVAL;
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 float blur_pdf =
kernel_data.integrator.filter_glossy *
193 if (blur_pdf < 1.0f) {
194 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,
256 if ((light_shader_flags & exclude_glass) == exclude_glass) {
270 float sum_sample_weight,
271 const uint light_shader_flags)
275 for (
int i = 0; i < sd->num_closure; i++) {
284 float bsdf_pdf = 0.0f;
287 if (bsdf_pdf != 0.0f) {
289 sum_pdf += bsdf_pdf * sc->sample_weight;
293 sum_sample_weight += sc->sample_weight;
297 return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
305 const uint light_shader_flags)
309 float sum_pdf = 0.0f;
310 float sum_sample_weight = 0.0f;
312 for (
int i = 0; i < sd->num_closure; i++) {
317 float bsdf_pdf = 0.0f;
320 if (bsdf_pdf != 0.0f) {
322 sum_pdf += bsdf_pdf * sc->sample_weight;
324 pdfs[i] = bsdf_pdf * sc->sample_weight;
334 sum_sample_weight += sc->sample_weight;
340 if (sum_pdf > 0.0f) {
341 for (
int i = 0; i < sd->num_closure; i++) {
346 return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
349#ifndef __KERNEL_CUDA__
360 const uint light_shader_flags)
365 kg, sd, wo,
NULL,
bsdf_eval, 0.0f, 0.0f, light_shader_flags);
373#if defined(__PATH_GUIDING__) && PATH_GUIDING_LEVEL >= 4
374 if (pdf > 0.0f &&
state->guiding.use_surface_guiding) {
375 const float guiding_sampling_prob =
state->guiding.surface_guiding_sampling_prob;
376 const float bssrdf_sampling_prob =
state->guiding.bssrdf_sampling_prob;
379 if (
kernel_data.integrator.guiding_directional_sampling_type ==
382 pdf = (0.5f * guide_pdf * (1.0f - bssrdf_sampling_prob)) + 0.5f * pdf;
385 pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) +
386 (1.0f - guiding_sampling_prob) * pdf;
400 if (sd->num_closure > 1) {
404 for (
int i = 0; i < sd->num_closure; i++) {
408 sum += sc->sample_weight;
412 float r = (*rand_bsdf).z *
sum;
413 float partial_sum = 0.0f;
415 for (
int i = 0; i < sd->num_closure; i++) {
419 float next_sum = partial_sum + sc->sample_weight;
425 (*rand_bsdf).z = (r - partial_sum) / sc->sample_weight;
429 partial_sum = next_sum;
434 return &sd->closure[sampled];
442 Spectrum weight = bssrdf_sc->weight;
444 if (sd->num_closure > 1) {
446 for (
int i = 0; i < sd->num_closure; i++) {
450 sum += sc->sample_weight;
453 weight *=
sum / bssrdf_sc->sample_weight;
459#ifdef __PATH_GUIDING__
478 const bool use_surface_guiding =
state->guiding.use_surface_guiding;
479 const float guiding_sampling_prob =
state->guiding.surface_guiding_sampling_prob;
480 const float bssrdf_sampling_prob =
state->guiding.bssrdf_sampling_prob;
483 bool sample_guiding =
false;
484 float rand_bsdf_guiding =
state->guiding.sample_surface_guiding_rand;
486 if (use_surface_guiding && rand_bsdf_guiding < guiding_sampling_prob) {
487 sample_guiding =
true;
488 rand_bsdf_guiding /= guiding_sampling_prob;
491 rand_bsdf_guiding -= guiding_sampling_prob;
492 rand_bsdf_guiding /= (1.0f - guiding_sampling_prob);
500 *unguided_bsdf_pdf = 0.0f;
501 float guide_pdf = 0.0f;
503 if (sample_guiding) {
508 if (guide_pdf != 0.0f) {
512 kg, sd, *wo,
bsdf_eval, unguided_bsdf_pdfs, 0);
513 *bsdf_pdf = (guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob)) +
514 ((1.0f - guiding_sampling_prob) * (*unguided_bsdf_pdf));
515 float sum_pdfs = 0.0f;
517 if (*unguided_bsdf_pdf > 0.0f) {
519 for (
int i = 0; i < sd->num_closure; i++) {
520 sum_pdfs += unguided_bsdf_pdfs[i];
521 if (rand_bsdf_guiding <= sum_pdfs) {
531 idx = (rand_bsdf_guiding > sum_pdfs) ? sd->num_closure - 1 : idx;
537 *unguided_bsdf_pdf = 0.0f;
559# ifdef WITH_CYCLES_DEBUG
563 if (*unguided_bsdf_pdf > 0.0f) {
564 surface_shader_validate_bsdf_sample(kg, sc, *wo,
label, *sampled_roughness, *eta);
568 if (*unguided_bsdf_pdf != 0.0f) {
573 if (sd->num_closure > 1) {
574 float sweight = sc->sample_weight;
576 kg, sd, *wo, sc,
bsdf_eval, (*unguided_bsdf_pdf) * sweight, sweight, 0);
579 *bsdf_pdf = *unguided_bsdf_pdf;
581 if (use_surface_guiding) {
583 *bsdf_pdf *= 1.0f - guiding_sampling_prob;
584 *bsdf_pdf += guiding_sampling_prob * guide_pdf * (1.0f - bssrdf_sampling_prob);
611 const bool use_surface_guiding =
state->guiding.use_surface_guiding;
612 const float guiding_sampling_prob =
state->guiding.surface_guiding_sampling_prob;
613 const float bssrdf_sampling_prob =
state->guiding.bssrdf_sampling_prob;
616 float rand_bsdf_guiding =
state->guiding.sample_surface_guiding_rand;
623 *unguided_bsdf_pdf = 0.0f;
624 float guide_pdf = 0.0f;
626 if (use_surface_guiding && guiding_sampling_prob > 0.0f) {
634 ris_samples[0].
rand = rand_bsdf;
645 &ris_samples[0].eval,
647 &ris_samples[0].bsdf_pdf,
648 &ris_samples[0].sampled_roughness,
649 &ris_samples[0].eta);
652 &ris_samples[0].
bsdf_eval, sc, ris_samples[0].wo, ris_samples[0].eval * sc->weight);
653 if (ris_samples[0].bsdf_pdf > 0.0f) {
654 if (sd->num_closure > 1) {
655 float sweight = sc->sample_weight;
661 (ris_samples[0].bsdf_pdf) *
669 ris_samples[0].
guide_pdf *= (1.0f - bssrdf_sampling_prob);
671 kg,
state, ris_samples[0].wo);
672 ris_samples[0].
bsdf_pdf =
max(0.0f, ris_samples[0].bsdf_pdf);
682 ris_samples[1].
guide_pdf *= (1.0f - bssrdf_sampling_prob);
684 kg,
state, ris_samples[1].wo);
686 kg, sd, ris_samples[1].wo, &ris_samples[1].
bsdf_eval, unguided_bsdf_pdfs, 0);
689 ris_samples[1].
bsdf_pdf =
max(0.0f, ris_samples[1].bsdf_pdf);
694 int num_ris_candidates = 0;
695 float sum_ris_weights = 0.0f;
698 num_ris_candidates++;
705 num_ris_candidates++;
713 if (num_ris_candidates == 0 || !(sum_ris_weights > 1e-10f)) {
719 float rand_ris_select = rand_bsdf_guiding * sum_ris_weights;
721 float sum_ris = 0.0f;
722 for (
int i = 0; i < 2; i++) {
724 if (rand_ris_select <= sum_ris) {
736 guide_pdf = ris_samples[ris_idx].
ris_target * (2.0f / sum_ris_weights);
737 *unguided_bsdf_pdf = ris_samples[ris_idx].
bsdf_pdf;
738 *mis_pdf = 0.5f * (ris_samples[ris_idx].
bsdf_pdf + ris_samples[ris_idx].
guide_pdf);
739 *bsdf_pdf = guide_pdf;
741 *wo = ris_samples[ris_idx].
wo;
745 *eta = ris_samples[ris_idx].
eta;
751 if (!(*bsdf_pdf > 1e-10f)) {
762 if (ris_idx == 1 && ris_samples[1].bsdf_pdf > 0.0f) {
766 float sum_pdfs = 0.0f;
768 for (
int i = 0; i < sd->num_closure; i++) {
769 sum_pdfs += unguided_bsdf_pdfs[i];
770 if (rnd <= sum_pdfs) {
779 idx = (rnd > sum_pdfs) ? sd->num_closure - 1 : idx;
802# ifdef WITH_CYCLES_DEBUG
806 if (*unguided_bsdf_pdf > 0.0f) {
807 surface_shader_validate_bsdf_sample(kg, sc, *wo,
label, *sampled_roughness, *eta);
811 if (*unguided_bsdf_pdf != 0.0f) {
816 if (sd->num_closure > 1) {
817 float sweight = sc->sample_weight;
819 kg, sd, *wo, sc,
bsdf_eval, (*unguided_bsdf_pdf) * sweight, sweight, 0);
822 *bsdf_pdf = *unguided_bsdf_pdf;
823 *mis_pdf = *bsdf_pdf;
847 if (
kernel_data.integrator.guiding_directional_sampling_type ==
849 kernel_data.integrator.guiding_directional_sampling_type ==
852 label = surface_shader_bsdf_guided_sample_closure_mis(kg,
863 *mis_pdf = (*unguided_bsdf_pdf > 0.0f) ? *bsdf_pdf : 0.0f;
865 else if (
kernel_data.integrator.guiding_directional_sampling_type ==
868 label = surface_shader_bsdf_guided_sample_closure_ris(kg,
882 if (!(*unguided_bsdf_pdf > 0.0f)) {
911 label =
bsdf_sample(kg, sd, sc, path_flag, rand_bsdf, &eval, wo, pdf, sampled_roughness, eta);
916 if (sd->num_closure > 1) {
917 float sweight = sc->sample_weight;
930 float roughness = 0.0f;
931 float sum_weight = 0.0f;
933 for (
int i = 0; i < sd->num_closure; i++) {
943 sum_weight += weight;
948 return (sum_weight > 0.0f) ? roughness / sum_weight : 1.0f;
957 return sd->closure_transparent_extinction;
977 for (
int i = 0; i < sd->num_closure; i++) {
991 for (
int i = 0; i < sd->num_closure; i++) {
1005 for (
int i = 0; i < sd->num_closure; i++) {
1019 for (
int i = 0; i < sd->num_closure; i++) {
1031 const float ao_factor,
1037 for (
int i = 0; i < sd->num_closure; i++) {
1042 eval += sc->weight * ao_factor;
1051#ifdef __SUBSURFACE__
1056 for (
int i = 0; i < sd->num_closure; i++) {
1098 return sd->closure_emission_background;
1127 weight =
one_spectrum() - sd->closure_transparent_extinction;
1129 for (
int i = 0; i < sd->num_closure; i++) {
1143 for (
int i = 0; i < sd->num_closure; i++) {
1146 weight += sc->weight;
1156template<u
int node_feature_mask,
typename ConstIntegratorGenericState>
1158 ConstIntegratorGenericState
state,
1162 bool use_caustics_storage =
false)
1175 sd->num_closure = 0;
1176 sd->num_closure_left = max_closures;
MINLINE float safe_sqrtf(float a)
ccl_device_inline ccl_private ShaderClosure * bsdf_alloc(ccl_private ShaderData *sd, int size, Spectrum weight)
ccl_device_inline int bsdf_label(const KernelGlobals kg, ccl_private const ShaderClosure *sc, const float3 wo)
ccl_device_inline void bsdf_roughness_eta(const KernelGlobals kg, ccl_private const ShaderClosure *sc, const float3 wo, ccl_private float2 *roughness, ccl_private float *eta)
CCL_NAMESPACE_BEGIN ccl_device_inline float bsdf_get_specular_roughness_squared(ccl_private const ShaderClosure *sc)
ccl_device_inline float bsdf_get_roughness_pass_squared(ccl_private const ShaderClosure *sc)
ccl_device_inline int bsdf_sample(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private const 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 void bsdf_blur(KernelGlobals kg, ccl_private ShaderClosure *sc, float roughness)
ccl_device Spectrum bsdf_eval(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private const ShaderClosure *sc, const float3 wo, ccl_private float *pdf)
ccl_device_inline Spectrum bsdf_albedo(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private const 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)
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
void osl_eval_nodes< SHADER_TYPE_SURFACE >(const KernelGlobalsCPU *kg, const void *state, ShaderData *sd, uint32_t path_flag)
#define kernel_assert(cond)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device Spectrum emissive_simple_eval(const float3 Ng, const float3 wi)
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, ccl_private const 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, uint32_t path_flag)
#define CLOSURE_IS_GLASS(type)
#define CLOSURE_IS_HOLDOUT(type)
#define CLOSURE_IS_BSDF_TRANSPARENT(type)
#define CLOSURE_IS_BSDF_TRANSMISSION(type)
#define CLOSURE_IS_BSDF(type)
#define CLOSURE_IS_BSDF_GLOSSY(type)
#define CLOSURE_IS_BSDF_DIFFUSE(type)
#define CLOSURE_IS_BSDF_OR_BSSRDF(type)
@ CLOSURE_BSDF_TRANSLUCENT_ID
#define CLOSURE_IS_BSSRDF(type)
#define BSDF_ROUGHNESS_SQ_THRESH
@ 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
#define KERNEL_FEATURE_OSL
@ SHADER_EXCLUDE_TRANSMIT
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT_MIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS
#define CAUSTICS_MAX_CLOSURE
ccl_device_inline Spectrum rgb_to_spectrum(float3 rgb)
ccl_device_inline Spectrum bsdf_eval_sum(ccl_private const BsdfEval *eval)
CCL_NAMESPACE_BEGIN ccl_device_inline void bsdf_eval_init(ccl_private BsdfEval *eval, ccl_private const ShaderClosure *sc, const float3 wo, Spectrum value)
ccl_device_inline void bsdf_eval_accum(ccl_private BsdfEval *eval, ccl_private const ShaderClosure *sc, const float3 wo, Spectrum value)
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 float3 path_state_rng_3D(KernelGlobals kg, ccl_private const RNGState *rng_state, const int dimension)
ccl_device_inline float path_state_rng_1D(KernelGlobals kg, ccl_private const RNGState *rng_state, const int dimension)
IntegratorStateCPU *ccl_restrict IntegratorState
const IntegratorStateCPU *ccl_restrict ConstIntegratorState
#define INTEGRATOR_STATE(state, nested_struct, member)
closure color bssrdf(string method, normal N, vector radius, color albedo) BUILTIN
float incoming_radiance_pdf
ccl_device Spectrum surface_shader_emission(ccl_private const ShaderData *sd)
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 bool surface_shader_constant_emission(KernelGlobals kg, int shader, ccl_private Spectrum *eval)
ccl_device_inline float _surface_shader_bsdf_eval_mis(KernelGlobals kg, ccl_private ShaderData *sd, const float3 wo, ccl_private const ShaderClosure *skip_sc, ccl_private BsdfEval *result_eval, float sum_pdf, float sum_sample_weight, 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, uint32_t path_flag, bool use_caustics_storage=false)
ccl_device_inline Spectrum surface_shader_bssrdf_sample_weight(ccl_private const ShaderData *ccl_restrict sd, ccl_private const ShaderClosure *ccl_restrict bssrdf_sc)
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_diffuse(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device float3 surface_shader_average_normal(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_glossy(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device_forceinline bool _surface_shader_exclude(ClosureType type, uint light_shader_flags)
ccl_device Spectrum surface_shader_transparency(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device_inline ccl_private const ShaderClosure * surface_shader_bsdf_bssrdf_pick(ccl_private const ShaderData *ccl_restrict sd, ccl_private float3 *rand_bsdf)
ccl_device Spectrum surface_shader_ao(KernelGlobals kg, ccl_private const ShaderData *sd, const float ao_factor, ccl_private float3 *N_)
ccl_device Spectrum surface_shader_background(ccl_private const ShaderData *sd)
ccl_device int surface_shader_bsdf_sample_closure(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private const 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_apply_holdout(KernelGlobals kg, ccl_private ShaderData *sd)
ccl_device float surface_shader_average_roughness(ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_alpha(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device Spectrum surface_shader_transmission(KernelGlobals kg, ccl_private const ShaderData *sd)
SPECTRUM_DATA_TYPE Spectrum
ccl_device_inline float sqr(float a)
ccl_device_inline bool isfinite_safe(float f)
ccl_device_inline float2 float3_to_float2(const float3 a)