21 sd->closure_transparent_extinction += weight;
25 sd->closure_transparent_extinction = weight;
78 if (c1->type != c2->type) {
85 return v1->c1 ==
v2->c1 && v1->c2 ==
v2->c2 && v1->c3 ==
v2->c3;
92 return v1->g ==
v2->g && v1->alpha ==
v2->alpha;
97 return v1->g ==
v2->g;
132#define VOLUME_THROUGHPUT_EPSILON 1e-6f
136 return exp(-sigma * t);
152 const float sum_weights =
reduce_add(weights);
154 if ((1.0f - sum_weights) < 1.0f) {
157 return weights / sum_weights;
170 float pdf_sum = 0.0f;
173 if (*rand < pdf_sum + channel_pdf) {
175 *rand = (*rand - pdf_sum) / channel_pdf;
178 pdf_sum += channel_pdf;
ATTR_WARN_UNUSED_RESULT const BMVert * v2
#define kernel_assert(cond)
#define SPECTRUM_CHANNELS
#define ccl_device_inline
#define FOREACH_SPECTRUM_CHANNEL(counter)
#define GET_SPECTRUM_CHANNEL(v, i)
#define CCL_NAMESPACE_END
CCL_NAMESPACE_BEGIN ccl_device void volume_extinction_setup(ccl_private ShaderData *sd, Spectrum weight)
ccl_device bool volume_phase_equal(const ccl_private ShaderClosure *c1, const ccl_private ShaderClosure *c2)
ccl_device Spectrum volume_color_transmittance(Spectrum sigma, const float t)
ccl_device int volume_sample_channel(Spectrum albedo, Spectrum throughput, ccl_private float *rand, ccl_private Spectrum *pdf)
ccl_device Spectrum volume_phase_eval(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float3 wo, ccl_private float *pdf)
ccl_device_inline Spectrum volume_sample_channel_pdf(Spectrum albedo, Spectrum throughput)
ccl_device float volume_phase_get_g(const ccl_private ShaderVolumeClosure *svc)
ccl_device float volume_channel_get(Spectrum value, const int channel)
ccl_device int volume_phase_sample(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
@ CLOSURE_VOLUME_RAYLEIGH_ID
@ CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID
@ CLOSURE_VOLUME_DRAINE_ID
@ CLOSURE_VOLUME_FOURNIER_FORAND_ID
ccl_device_inline dual1 reduce_add(const dual< T > a)
ccl_device_inline float2 fabs(const float2 a)
ccl_device int volume_draine_sample(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device Spectrum volume_draine_eval(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float3 wo, ccl_private float *pdf)
ccl_device Spectrum volume_fournier_forand_eval(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float3 wo, ccl_private float *pdf)
ccl_device int volume_fournier_forand_sample(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device Spectrum volume_henyey_greenstein_eval(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float3 wo, ccl_private float *pdf)
ccl_device int volume_henyey_greenstein_sample(const ccl_private ShaderData *sd, const ccl_private ShaderVolumeClosure *svc, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device Spectrum volume_rayleigh_eval(const ccl_private ShaderData *sd, const float3 wo, ccl_private float *pdf)
ccl_device int volume_rayleigh_sample(const ccl_private ShaderData *sd, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)