Blender V4.5
closures_setup.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2009-2010 Sony Pictures Imageworks Inc., et al. All Rights Reserved.
2 * SPDX-FileCopyrightText: 2011-2022 Blender Foundation
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 * Adapted code from Open Shading Language. */
7
8#pragma once
9
11#include "kernel/closure/bsdf.h"
15
16#include "kernel/geom/object.h"
17
18#include "kernel/osl/types.h"
19
21
22#define OSL_CLOSURE_STRUCT_BEGIN(Upper, lower) \
23 struct ccl_align(8) Upper##Closure \
24 { \
25 const char *label;
26#define OSL_CLOSURE_STRUCT_END(Upper, lower) \
27 } \
28 ;
29#define OSL_CLOSURE_STRUCT_MEMBER(Upper, TYPE, type, name, key) type name;
30#define OSL_CLOSURE_STRUCT_ARRAY_MEMBER(Upper, TYPE, type, name, key, size) type name[size];
31
32#include "closures_template.h"
33
34struct ccl_align(8) LayerClosure
35{
36 const ccl_private OSLClosure *base;
38};
39
40/* If we failed to allocate a layer-able closure, we need to zero out the albedo
41 * so that lower layers aren't falsely blocked.
42 * Therefore, to keep the code clean, set it to zero at the start and overwrite
43 * later if it succeeded. */
45{
46 if (layer_albedo != nullptr) {
47 *layer_albedo = zero_float3();
48 }
49}
50
52 const ccl_private ShaderData *sd,
53 const uint32_t path_flag,
54 const int scattering)
55{
56 /* Caustic options */
57 if ((scattering & LABEL_GLOSSY) && (path_flag & PATH_RAY_DIFFUSE)) {
58 const bool has_reflect = (scattering & LABEL_REFLECT);
59 const bool has_transmit = (scattering & LABEL_TRANSMIT);
60 const bool reflect_caustics_disabled = !kernel_data.integrator.caustics_reflective;
61 const bool refract_caustics_disabled = !kernel_data.integrator.caustics_refractive;
62
63 /* Reflective Caustics */
64 if (reflect_caustics_disabled && has_reflect && !has_transmit) {
65 return true;
66 }
67 /* Refractive Caustics */
68 if (refract_caustics_disabled && has_transmit && !has_reflect) {
69 return true;
70 }
71 /* Glass Caustics */
72 if (reflect_caustics_disabled && refract_caustics_disabled) {
73 return true;
74 }
75 }
76
77 return false;
78}
79
80/* Diffuse */
81
83 ccl_private ShaderData *sd,
84 const uint32_t path_flag,
85 const float3 weight,
86 const ccl_private DiffuseClosure *closure,
87 float3 *layer_albedo)
88{
89 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
90 return;
91 }
92
94 sd, sizeof(DiffuseBsdf), rgb_to_spectrum(weight));
95 if (!bsdf) {
96 return;
97 }
98
99 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
100
101 sd->flag |= bsdf_diffuse_setup(bsdf);
102}
103
104/* Deprecated form, will be removed in OSL 2.0. */
106 ccl_private ShaderData *sd,
107 const uint32_t path_flag,
108 const float3 weight,
109 const ccl_private OrenNayarClosure *closure,
110 float3 *layer_albedo)
111{
112 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
113 return;
114 }
115
117 sd, sizeof(OrenNayarBsdf), rgb_to_spectrum(weight));
118 if (!bsdf) {
119 return;
120 }
121
122 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
123 bsdf->roughness = closure->roughness;
124
125 sd->flag |= bsdf_oren_nayar_setup(sd, bsdf, rgb_to_spectrum(weight));
126}
127
129 KernelGlobals kg,
130 ccl_private ShaderData *sd,
131 const uint32_t path_flag,
132 const float3 weight,
133 const ccl_private OrenNayarDiffuseBSDFClosure *closure,
134 float3 *layer_albedo)
135{
136 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
137 return;
138 }
139
141 sd, sizeof(OrenNayarBsdf), rgb_to_spectrum(weight * closure->albedo));
142 if (!bsdf) {
143 return;
144 }
145
146 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
147 bsdf->roughness = closure->roughness;
148
149 sd->flag |= bsdf_oren_nayar_setup(sd, bsdf, rgb_to_spectrum(closure->albedo));
150}
151
153 KernelGlobals kg,
154 ccl_private ShaderData *sd,
155 uint32_t path_flag,
156 float3 weight,
157 ccl_private const BurleyDiffuseBSDFClosure *closure,
158 float3 *layer_albedo)
159{
160 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
161 return;
162 }
163
164 ccl_private BurleyBsdf *bsdf = (ccl_private BurleyBsdf *)bsdf_alloc(
165 sd, sizeof(BurleyBsdf), rgb_to_spectrum(weight * closure->albedo));
166 if (!bsdf) {
167 return;
168 }
169
170 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
171
172 sd->flag |= bsdf_burley_setup(bsdf, closure->roughness);
173}
174
176 ccl_private ShaderData *sd,
177 const uint32_t path_flag,
178 const float3 weight,
179 const ccl_private TranslucentClosure *closure,
180 float3 *layer_albedo)
181{
182 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
183 return;
184 }
185
187 sd, sizeof(DiffuseBsdf), rgb_to_spectrum(weight));
188 if (!bsdf) {
189 return;
190 }
191
192 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
193
194 sd->flag |= bsdf_translucent_setup(bsdf);
195}
196
198 ccl_private ShaderData *sd,
199 const uint32_t path_flag,
200 const float3 weight,
201 const ccl_private ReflectionClosure *closure,
202 float3 *layer_albedo)
203{
204 if (osl_closure_skip(kg, sd, path_flag, LABEL_SINGULAR)) {
205 return;
206 }
207
209 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
210 if (!bsdf) {
211 return;
212 }
213
214 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
215 bsdf->alpha_x = bsdf->alpha_y = 0.0f;
216
217 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
218}
219
221 ccl_private ShaderData *sd,
222 const uint32_t path_flag,
223 const float3 weight,
224 const ccl_private RefractionClosure *closure,
225 float3 *layer_albedo)
226{
227 if (osl_closure_skip(kg, sd, path_flag, LABEL_SINGULAR)) {
228 return;
229 }
230
232 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
233 if (!bsdf) {
234 return;
235 }
236
237 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
238 bsdf->ior = closure->ior;
239 bsdf->alpha_x = bsdf->alpha_y = 0.0f;
240
241 sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
242}
243
245 ccl_private ShaderData *sd,
246 const uint32_t path_flag,
247 const float3 weight,
248 const ccl_private TransparentClosure *closure,
249 float3 *layer_albedo)
250{
251 bsdf_transparent_setup(sd, rgb_to_spectrum(weight), path_flag);
252}
253
255 ccl_private ShaderData *sd,
256 const uint32_t path_flag,
257 const float3 weight,
258 const ccl_private RayPortalBSDFClosure *closure,
259 float3 *layer_albedo)
260{
262 sd, rgb_to_spectrum(weight), path_flag, closure->position, closure->direction);
263}
264
265/* MaterialX closures */
267 ccl_private ShaderData *sd,
268 const uint32_t path_flag,
269 const float3 weight,
270 const ccl_private DielectricBSDFClosure *closure,
271 float3 *layer_albedo)
272{
273 osl_zero_albedo(layer_albedo);
274
275 const bool has_reflection = !is_zero(closure->reflection_tint);
276 const bool has_transmission = !is_zero(closure->transmission_tint);
277
278 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
279 return;
280 }
281
283 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
284 if (!bsdf) {
285 return;
286 }
287
290 if (!fresnel) {
291 return;
292 }
293
294 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
295 bsdf->alpha_x = closure->alpha_x;
296 bsdf->alpha_y = closure->alpha_y;
297 bsdf->ior = closure->ior;
298 bsdf->T = closure->T;
299
300 bool preserve_energy = false;
301
302 /* Beckmann */
303 if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
304 if (has_reflection && has_transmission) {
305 sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
306 }
307 else if (has_transmission) {
309 }
310 else {
311 sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
312 }
313 }
314 /* GGX (either single- or multi-scattering). */
315 else {
316 if (has_reflection && has_transmission) {
317 sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
318 }
319 else if (has_transmission) {
320 sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
321 }
322 else {
323 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
324 }
325
326 preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
327 }
328
329 fresnel->reflection_tint = rgb_to_spectrum(closure->reflection_tint);
330 fresnel->transmission_tint = rgb_to_spectrum(closure->transmission_tint);
331 fresnel->thin_film.thickness = closure->thinfilm_thickness;
332 fresnel->thin_film.ior = closure->thinfilm_ior;
333 bsdf_microfacet_setup_fresnel_dielectric_tint(kg, bsdf, sd, fresnel, preserve_energy);
334
335 if (layer_albedo != nullptr) {
336 if (has_reflection && !has_transmission) {
337 *layer_albedo = bsdf_albedo(kg, sd, (ccl_private ShaderClosure *)bsdf, true, false);
338 }
339 else {
340 *layer_albedo = one_float3();
341 }
342 }
343}
344
346 ccl_private ShaderData *sd,
347 const uint32_t path_flag,
348 const float3 weight,
349 const ccl_private ConductorBSDFClosure *closure,
350 float3 *layer_albedo)
351{
352 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
353 return;
354 }
355
357 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
358 if (!bsdf) {
359 return;
360 }
361
363 sd, sizeof(FresnelConductor));
364 if (!fresnel) {
365 return;
366 }
367
368 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
369 bsdf->alpha_x = closure->alpha_x;
370 bsdf->alpha_y = closure->alpha_y;
371 bsdf->ior = 0.0f;
372 bsdf->T = closure->T;
373
374 bool preserve_energy = false;
375
376 /* Beckmann */
377 if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
378 sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
379 }
380 /* GGX (either single- or multi-scattering) */
381 else {
382 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
383 preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
384 }
385
386 fresnel->n = rgb_to_spectrum(closure->ior);
387 fresnel->k = rgb_to_spectrum(closure->extinction);
388 bsdf_microfacet_setup_fresnel_conductor(kg, bsdf, sd, fresnel, preserve_energy);
389}
390
392 KernelGlobals kg,
393 ccl_private ShaderData *sd,
394 const uint32_t path_flag,
395 const float3 weight,
396 const ccl_private GeneralizedSchlickBSDFClosure *closure,
397 float3 *layer_albedo)
398{
399 osl_zero_albedo(layer_albedo);
400
401 const bool has_reflection = !is_zero(closure->reflection_tint);
402 const bool has_transmission = !is_zero(closure->transmission_tint);
403
404 int label = LABEL_GLOSSY | LABEL_REFLECT;
405 if (has_transmission) {
406 label |= LABEL_TRANSMIT;
407 }
408
409 if (osl_closure_skip(kg, sd, path_flag, label)) {
410 return;
411 }
412
414 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
415 if (!bsdf) {
416 return;
417 }
418
421 if (!fresnel) {
422 return;
423 }
424
425 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
426 bsdf->alpha_x = closure->alpha_x;
427 bsdf->alpha_y = closure->alpha_y;
428 bsdf->T = closure->T;
429
430 if (closure->exponent < 0.0f) {
431 /* Trick for principled BSDF: Since we use the real Fresnel equation and remap
432 * to the F0...F90 range, this allows us to use the real IOR.
433 * Computing it back from F0 might give a different result in case of specular
434 * tinting. */
435 bsdf->ior = -closure->exponent;
436 }
437 else {
438 bsdf->ior = ior_from_F0(average(closure->f0));
439 }
440
441 bool preserve_energy = false;
442
443 /* Beckmann */
444 if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
445 if (has_reflection && has_transmission) {
446 sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
447 }
448 else if (has_transmission) {
450 }
451 else {
452 sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
453 }
454 }
455 /* GGX (either single- or multi-scattering) */
456 else {
457 if (has_reflection && has_transmission) {
458 sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
459 }
460 else if (has_transmission) {
461 sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
462 }
463 else {
464 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
465 }
466
467 preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
468 }
469
470 const bool reflective_caustics = (kernel_data.integrator.caustics_reflective ||
471 (path_flag & PATH_RAY_DIFFUSE) == 0);
472 const bool refractive_caustics = (kernel_data.integrator.caustics_refractive ||
473 (path_flag & PATH_RAY_DIFFUSE) == 0);
474
475 fresnel->reflection_tint = reflective_caustics ? rgb_to_spectrum(closure->reflection_tint) :
477 fresnel->transmission_tint = refractive_caustics ? rgb_to_spectrum(closure->transmission_tint) :
479 fresnel->f0 = rgb_to_spectrum(closure->f0);
480 fresnel->f90 = rgb_to_spectrum(closure->f90);
481 fresnel->exponent = closure->exponent;
482 fresnel->thin_film.thickness = closure->thinfilm_thickness;
483 fresnel->thin_film.ior = closure->thinfilm_ior;
484 bsdf_microfacet_setup_fresnel_generalized_schlick(kg, bsdf, sd, fresnel, preserve_energy);
485
486 if (layer_albedo != nullptr) {
487 if (has_reflection && !has_transmission) {
488 *layer_albedo = bsdf_albedo(kg, sd, (ccl_private ShaderClosure *)bsdf, true, false);
489 }
490 else {
491 *layer_albedo = one_float3();
492 }
493 }
494}
495
496/* Standard microfacet closures */
497
499 ccl_private ShaderData *sd,
500 const uint32_t path_flag,
501 const float3 weight,
502 const ccl_private MicrofacetClosure *closure,
503 float3 *layer_albedo)
504{
505 osl_zero_albedo(layer_albedo);
506
507 const int label = (closure->refract) ? LABEL_TRANSMIT : LABEL_REFLECT;
508 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY | label)) {
509 return;
510 }
511
513 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
514 if (!bsdf) {
515 return;
516 }
517
518 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
519 bsdf->alpha_x = closure->alpha_x;
520 bsdf->alpha_y = closure->alpha_y;
521 bsdf->ior = closure->ior;
522 bsdf->T = closure->T;
523
524 /* Beckmann */
525 if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
526 if (closure->refract == 1) {
528 }
529 else if (closure->refract == 2) {
530 sd->flag |= bsdf_microfacet_beckmann_glass_setup(bsdf);
531 }
532 else {
533 sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
534 }
535 }
536 /* Ashikhmin-Shirley */
537 else if (closure->distribution == make_string("ashikhmin_shirley", 11318482998918370922ull)) {
538 sd->flag |= bsdf_ashikhmin_shirley_setup(bsdf);
539 }
540 /* GGX (either single- or multi-scattering) */
541 else {
542 if (closure->refract == 1) {
543 sd->flag |= bsdf_microfacet_ggx_refraction_setup(bsdf);
544 }
545 else if (closure->refract == 2) {
546 sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
547 }
548 else {
549 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
550 }
551
552 if (closure->distribution == make_string("multi_ggx", 16842698693386468366ull)) {
553 /* Since there's no dedicated color input, the weight is the best we got. */
555 }
556 }
557
558 if (layer_albedo != nullptr) {
559 if (closure->refract == 0) {
560 *layer_albedo = bsdf_albedo(kg, sd, (ccl_private ShaderClosure *)bsdf, true, false);
561 }
562 else {
563 *layer_albedo = one_float3();
564 }
565 }
566}
567
568/* Special-purpose Microfacet closures */
569
571 KernelGlobals kg,
572 ccl_private ShaderData *sd,
573 const uint32_t path_flag,
574 const float3 weight,
575 const ccl_private MicrofacetF82TintClosure *closure,
576 float3 *layer_albedo)
577{
578 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
579 return;
580 }
581
583 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
584 if (!bsdf) {
585 return;
586 }
587
589 sd, sizeof(FresnelF82Tint));
590 if (!fresnel) {
591 return;
592 }
593
594 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
595 bsdf->alpha_x = closure->alpha_x;
596 bsdf->alpha_y = closure->alpha_y;
597 bsdf->ior = 0.0f;
598 bsdf->T = closure->T;
599
600 bool preserve_energy = false;
601
602 /* Beckmann */
603 if (closure->distribution == make_string("beckmann", 14712237670914973463ull)) {
604 sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
605 }
606 /* GGX (either single- or multi-scattering) */
607 else {
608 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
609 preserve_energy = (closure->distribution == make_string("multi_ggx", 16842698693386468366ull));
610 }
611
612 fresnel->f0 = rgb_to_spectrum(closure->f0);
614 kg, bsdf, sd, fresnel, rgb_to_spectrum(closure->f82), preserve_energy);
615}
616
618 KernelGlobals kg,
619 ccl_private ShaderData *sd,
620 const uint32_t path_flag,
621 const float3 weight,
622 const ccl_private MicrofacetMultiGGXGlassClosure *closure,
623 float3 *layer_albedo)
624{
625 /* Technically, the MultiGGX closure may also transmit. However,
626 * since this is set statically and only used for caustic flags, this
627 * is probably as good as it gets. */
628 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
629 return;
630 }
631
633 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
634 if (!bsdf) {
635 return;
636 }
637
638 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
639 bsdf->alpha_x = closure->alpha_x;
640 bsdf->alpha_y = bsdf->alpha_x;
641 bsdf->ior = closure->ior;
642
643 bsdf->T = zero_float3();
644
645 sd->flag |= bsdf_microfacet_ggx_glass_setup(bsdf);
646 bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd, rgb_to_spectrum(closure->color));
647}
648
650 KernelGlobals kg,
651 ccl_private ShaderData *sd,
652 const uint32_t path_flag,
653 const float3 weight,
654 const ccl_private MicrofacetMultiGGXClosure *closure,
655 float3 *layer_albedo)
656{
657 osl_zero_albedo(layer_albedo);
658
659 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY | LABEL_REFLECT)) {
660 return;
661 }
662
664 sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
665 if (!bsdf) {
666 return;
667 }
668
669 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
670 bsdf->alpha_x = closure->alpha_x;
671 bsdf->alpha_y = closure->alpha_y;
672 bsdf->ior = 1.0f;
673
674 bsdf->T = closure->T;
675
676 sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
677 bsdf_microfacet_setup_fresnel_constant(kg, bsdf, sd, rgb_to_spectrum(closure->color));
678
679 if (layer_albedo != nullptr) {
680 *layer_albedo = bsdf_albedo(kg, sd, (ccl_private ShaderClosure *)bsdf, true, false);
681 }
682}
683
684/* Ashikhmin Velvet */
685
687 KernelGlobals kg,
688 ccl_private ShaderData *sd,
689 const uint32_t path_flag,
690 const float3 weight,
691 const ccl_private AshikhminVelvetClosure *closure,
692 float3 *layer_albedo)
693{
694 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
695 return;
696 }
697
699 sd, sizeof(VelvetBsdf), rgb_to_spectrum(weight));
700 if (!bsdf) {
701 return;
702 }
703
704 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
705 bsdf->sigma = closure->sigma;
706
707 sd->flag |= bsdf_ashikhmin_velvet_setup(bsdf);
708}
709
710/* Sheen */
711
713 ccl_private ShaderData *sd,
714 const uint32_t path_flag,
715 const float3 weight,
716 const ccl_private SheenClosure *closure,
717 float3 *layer_albedo)
718{
719 osl_zero_albedo(layer_albedo);
720
721 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
722 return;
723 }
724
726 sd, sizeof(SheenBsdf), rgb_to_spectrum(weight));
727 if (!bsdf) {
728 return;
729 }
730
731 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
732 bsdf->roughness = closure->roughness;
733
734 const int sheen_flag = bsdf_sheen_setup(kg, sd, bsdf);
735
736 if (sheen_flag) {
737 sd->flag |= sheen_flag;
738
739 if (layer_albedo != nullptr) {
740 *layer_albedo = bsdf->weight;
741 }
742 }
743}
744
745/* MaterialX compatibility */
747 ccl_private ShaderData *sd,
748 const uint32_t path_flag,
749 const float3 weight,
750 const ccl_private SheenBSDFClosure *closure,
751 float3 *layer_albedo)
752{
753 osl_zero_albedo(layer_albedo);
754
755 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
756 return;
757 }
758
760 sd, sizeof(SheenBsdf), rgb_to_spectrum(weight * closure->albedo));
761 if (!bsdf) {
762 return;
763 }
764
765 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
766 bsdf->roughness = closure->roughness;
767
768 const int sheen_flag = bsdf_sheen_setup(kg, sd, bsdf);
769
770 if (sheen_flag) {
771 sd->flag |= sheen_flag;
772
773 if (layer_albedo != nullptr) {
774 *layer_albedo = bsdf->weight * closure->albedo;
775 }
776 }
777}
778
780 ccl_private ShaderData *sd,
781 const uint32_t path_flag,
782 const float3 weight,
783 const ccl_private DiffuseToonClosure *closure,
784 float3 *layer_albedo)
785{
786 if (osl_closure_skip(kg, sd, path_flag, LABEL_DIFFUSE)) {
787 return;
788 }
789
791 sd, sizeof(ToonBsdf), rgb_to_spectrum(weight));
792 if (!bsdf) {
793 return;
794 }
795
796 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
797 bsdf->size = closure->size;
798 bsdf->smooth = closure->smooth;
799
800 sd->flag |= bsdf_diffuse_toon_setup(bsdf);
801}
802
804 ccl_private ShaderData *sd,
805 const uint32_t path_flag,
806 const float3 weight,
807 const ccl_private GlossyToonClosure *closure,
808 float3 *layer_albedo)
809{
810 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY)) {
811 return;
812 }
813
815 sd, sizeof(ToonBsdf), rgb_to_spectrum(weight));
816 if (!bsdf) {
817 return;
818 }
819
820 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
821 bsdf->size = closure->size;
822 bsdf->smooth = closure->smooth;
823
824 sd->flag |= bsdf_glossy_toon_setup(bsdf);
825}
826
827/* Variable cone emissive closure
828 *
829 * This primitive emits in a cone having a configurable penumbra area where the light decays to 0
830 * reaching the outer_angle limit. It can also behave as a lambertian emitter if the provided
831 * angles are PI/2, which is the default
832 */
834 ccl_private ShaderData *sd,
835 uint32_t /*path_flag*/,
836 float3 weight,
837 const ccl_private GenericEmissiveClosure *closure,
838 float3 *layer_albedo)
839{
840 if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
841 weight *= object_volume_density(kg, sd->object);
842 }
843 emission_setup(sd, rgb_to_spectrum(weight));
844}
845
846/* Generic background closure
847 *
848 * We only have a background closure for the shaders to return a color in background shaders. No
849 * methods, only the weight is taking into account
850 */
852 ccl_private ShaderData *sd,
853 uint32_t /*path_flag*/,
854 const float3 weight,
855 const ccl_private GenericBackgroundClosure *closure,
856 float3 *layer_albedo)
857{
859}
860
861/* Uniform EDF
862 *
863 * This is a duplicate of emission above except an emittance value can be passed to the weight.
864 * This is for MaterialX closure compatibility found in `stdosl.h`.
865 */
867 ccl_private ShaderData *sd,
868 uint32_t /*path_flag*/,
869 float3 weight,
870 const ccl_private UniformEDFClosure *closure,
871 float3 *layer_albedo)
872{
873 weight *= closure->emittance;
874 if (sd->flag & SD_IS_VOLUME_SHADER_EVAL) {
875 weight *= object_volume_density(kg, sd->object);
876 }
877 emission_setup(sd, rgb_to_spectrum(weight));
878}
879
880/* Holdout closure
881 *
882 * This will be used by the shader to mark the amount of holdout for the current shading point. No
883 * parameters, only the weight will be used
884 */
886 ccl_private ShaderData *sd,
887 uint32_t /*path_flag*/,
888 const float3 weight,
889 const ccl_private HoldoutClosure *closure,
890 float3 *layer_albedo)
891{
892 closure_alloc(sd, sizeof(ShaderClosure), CLOSURE_HOLDOUT_ID, rgb_to_spectrum(weight));
893 sd->flag |= SD_HOLDOUT;
894}
895
897 ccl_private ShaderData *sd,
898 uint32_t /*path_flag*/,
899 const float3 weight,
900 const ccl_private DiffuseRampClosure *closure,
901 float3 *layer_albedo)
902{
903 ccl_private DiffuseRampBsdf *bsdf = (ccl_private DiffuseRampBsdf *)bsdf_alloc(
904 sd, sizeof(DiffuseRampBsdf), rgb_to_spectrum(weight));
905
906 if (!bsdf) {
907 return;
908 }
909
910 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
911
912 bsdf->colors = (float3 *)closure_alloc_extra(sd, sizeof(float3) * 8);
913 if (!bsdf->colors) {
914 return;
915 }
916
917 for (int i = 0; i < 8; i++) {
918 bsdf->colors[i] = closure->colors[i];
919 }
920
921 sd->flag |= bsdf_diffuse_ramp_setup(bsdf);
922}
923
925 ccl_private ShaderData *sd,
926 uint32_t /*path_flag*/,
927 const float3 weight,
928 const ccl_private PhongRampClosure *closure,
929 float3 *layer_albedo)
930{
931 ccl_private PhongRampBsdf *bsdf = (ccl_private PhongRampBsdf *)bsdf_alloc(
932 sd, sizeof(PhongRampBsdf), rgb_to_spectrum(weight));
933 if (!bsdf) {
934 return;
935 }
936
937 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
938 bsdf->exponent = closure->exponent;
939
940 bsdf->colors = (float3 *)closure_alloc_extra(sd, sizeof(float3) * 8);
941 if (!bsdf->colors) {
942 return;
943 }
944
945 for (int i = 0; i < 8; i++) {
946 bsdf->colors[i] = closure->colors[i];
947 }
948
949 sd->flag |= bsdf_phong_ramp_setup(bsdf);
950}
951
953 ccl_private ShaderData *sd,
954 const uint32_t path_flag,
955 const float3 weight,
956 const ccl_private BSSRDFClosure *closure,
957 float3 *layer_albedo)
958{
959 ClosureType type;
960 if (closure->method == make_string("burley", 186330084368958868ull)) {
962 }
963 else if (closure->method == make_string("random_walk", 11360609267673527222ull)) {
965 }
966 else if (closure->method == make_string("random_walk_skin", 3096325052680726300ull)) {
968 }
969 else {
970 return;
971 }
972
974 if (!bssrdf) {
975 return;
976 }
977
978 bssrdf->radius = closure->radius;
979
980 bssrdf->albedo = closure->albedo;
982 safe_normalize_fallback(closure->N, sd->N));
983 bssrdf->alpha = closure->roughness;
984 bssrdf->ior = closure->ior;
985 bssrdf->anisotropy = closure->anisotropy;
986
987 sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, type);
988}
989
990/* MaterialX-compatible subsurface_bssrdf */
992 KernelGlobals kg,
993 ccl_private ShaderData *sd,
994 const uint32_t path_flag,
995 const float3 weight,
996 const ccl_private SubsurfaceBSSRDFClosure *closure,
997 float3 *layer_albedo)
998{
1000 if (!bssrdf) {
1001 return;
1002 }
1003
1004#if OSL_LIBRARY_VERSION_CODE >= 11401
1005 bssrdf->radius = closure->radius;
1006#else
1007 bssrdf->radius = closure->transmission_depth * closure->transmission_color;
1008#endif
1009
1010 bssrdf->albedo = closure->albedo;
1012 safe_normalize_fallback(closure->N, sd->N));
1013 bssrdf->alpha = 1.0f;
1014 bssrdf->ior = 1.4f;
1015 bssrdf->anisotropy = closure->anisotropy;
1016
1017 sd->flag |= bssrdf_setup(sd, bssrdf, path_flag, CLOSURE_BSSRDF_RANDOM_WALK_ID);
1018}
1019
1020/* Hair */
1021
1023 ccl_private ShaderData *sd,
1024 const uint32_t path_flag,
1025 const float3 weight,
1026 const ccl_private HairReflectionClosure *closure,
1027 float3 *layer_albedo)
1028{
1029 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY)) {
1030 return;
1031 }
1032
1034 sd, sizeof(HairBsdf), rgb_to_spectrum(weight));
1035 if (!bsdf) {
1036 return;
1037 }
1038
1039 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
1040 bsdf->T = closure->T;
1041 bsdf->roughness1 = closure->roughness1;
1042 bsdf->roughness2 = closure->roughness2;
1043 bsdf->offset = closure->offset;
1044
1045 sd->flag |= bsdf_hair_reflection_setup(bsdf);
1046}
1047
1049 KernelGlobals kg,
1050 ccl_private ShaderData *sd,
1051 const uint32_t path_flag,
1052 const float3 weight,
1053 const ccl_private HairTransmissionClosure *closure,
1054 float3 *layer_albedo)
1055{
1056 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY)) {
1057 return;
1058 }
1059
1061 sd, sizeof(HairBsdf), rgb_to_spectrum(weight));
1062 if (!bsdf) {
1063 return;
1064 }
1065
1066 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
1067 bsdf->T = closure->T;
1068 bsdf->roughness1 = closure->roughness1;
1069 bsdf->roughness2 = closure->roughness2;
1070 bsdf->offset = closure->offset;
1071
1072 sd->flag |= bsdf_hair_transmission_setup(bsdf);
1073}
1074
1076 ccl_private ShaderData *sd,
1077 const uint32_t path_flag,
1078 const float3 weight,
1079 const ccl_private ChiangHairClosure *closure,
1080 float3 *layer_albedo)
1081{
1082#ifdef __HAIR__
1083 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY)) {
1084 return;
1085 }
1086
1088 sd, sizeof(ChiangHairBSDF), rgb_to_spectrum(weight));
1089 if (!bsdf) {
1090 return;
1091 }
1092
1093 bsdf->N = maybe_ensure_valid_specular_reflection(sd, safe_normalize_fallback(closure->N, sd->N));
1094 bsdf->sigma = closure->sigma;
1095 bsdf->v = closure->v;
1096 bsdf->s = closure->s;
1097 bsdf->alpha = closure->alpha;
1098 bsdf->eta = closure->eta;
1099 bsdf->m0_roughness = closure->m0_roughness;
1100
1101 sd->flag |= bsdf_hair_chiang_setup(sd, bsdf);
1102#endif
1103}
1104
1106 ccl_private ShaderData *sd,
1107 const uint32_t path_flag,
1108 const float3 weight,
1109 const ccl_private HuangHairClosure *closure,
1110 float3 *layer_albedo)
1111{
1112#ifdef __HAIR__
1113 if (osl_closure_skip(kg, sd, path_flag, LABEL_GLOSSY)) {
1114 return;
1115 }
1116
1117 if (closure->r_lobe <= 0.0f && closure->tt_lobe <= 0.0f && closure->trt_lobe <= 0.0f) {
1118 return;
1119 }
1120
1122 sd, sizeof(HuangHairBSDF), rgb_to_spectrum(weight));
1123 if (!bsdf) {
1124 return;
1125 }
1126
1128 sd, sizeof(HuangHairExtra));
1129 if (!extra) {
1130 return;
1131 }
1132
1133 bsdf->N = safe_normalize_fallback(closure->N, sd->N);
1134 bsdf->sigma = closure->sigma;
1135 bsdf->roughness = closure->roughness;
1136 bsdf->tilt = closure->tilt;
1137 bsdf->eta = closure->eta;
1138 bsdf->aspect_ratio = closure->aspect_ratio;
1139
1140 bsdf->extra = extra;
1141 bsdf->extra->R = closure->r_lobe;
1142 bsdf->extra->TT = closure->tt_lobe;
1143 bsdf->extra->TRT = closure->trt_lobe;
1144
1145 bsdf->extra->pixel_coverage = 1.0f;
1146
1147 /* For camera ray, check if the hair covers more than one pixel, in which case a nearfield model
1148 * is needed to prevent ribbon-like appearance. */
1149 if ((path_flag & PATH_RAY_CAMERA) && (sd->type & PRIMITIVE_CURVE)) {
1150 /* Interpolate radius between curve keys. */
1151 const KernelCurve kcurve = kernel_data_fetch(curves, sd->prim);
1152 const int k0 = kcurve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type);
1153 const int k1 = k0 + 1;
1154 const float radius = mix(
1155 kernel_data_fetch(curve_keys, k0).w, kernel_data_fetch(curve_keys, k1).w, sd->u);
1156
1157 bsdf->extra->pixel_coverage = 0.5f * sd->dP / radius;
1158 }
1159
1160 sd->flag |= bsdf_hair_huang_setup(sd, bsdf, path_flag);
1161#endif
1162}
1163
1164/* Volume */
1165
1167 ccl_private ShaderData *sd,
1168 const uint32_t path_flag,
1169 float3 weight,
1170 const ccl_private VolumeAbsorptionClosure *closure,
1171 float3 *layer_albedo)
1172{
1173 volume_extinction_setup(sd, rgb_to_spectrum(weight * object_volume_density(kg, sd->object)));
1174}
1175
1177 KernelGlobals kg,
1178 ccl_private ShaderData *sd,
1179 const uint32_t path_flag,
1180 float3 weight,
1181 const ccl_private VolumeHenyeyGreensteinClosure *closure,
1182 float3 *layer_albedo)
1183{
1184 weight *= object_volume_density(kg, sd->object);
1186
1188 sd, sizeof(HenyeyGreensteinVolume), rgb_to_spectrum(weight));
1189 if (!volume) {
1190 return;
1191 }
1192
1193 volume->g = closure->g;
1194
1195 sd->flag |= volume_henyey_greenstein_setup(volume);
1196}
1197
1199 KernelGlobals kg,
1200 ccl_private ShaderData *sd,
1201 const uint32_t path_flag,
1202 const float3 weight,
1203 const ccl_private VolumeFournierForandClosure *closure,
1204 float3 *layer_albedo)
1205{
1207
1209 sd, sizeof(FournierForandVolume), rgb_to_spectrum(weight));
1210 if (!volume) {
1211 return;
1212 }
1213
1214 sd->flag |= volume_fournier_forand_setup(volume, closure->B, closure->IOR);
1215}
1216
1218 ccl_private ShaderData *sd,
1219 const uint32_t path_flag,
1220 const float3 weight,
1221 const ccl_private VolumeDraineClosure *closure,
1222 float3 *layer_albedo)
1223{
1225
1227 sd, sizeof(DraineVolume), rgb_to_spectrum(weight));
1228 if (!volume) {
1229 return;
1230 }
1231
1232 volume->g = closure->g;
1233 volume->alpha = closure->alpha;
1234
1235 sd->flag |= volume_draine_setup(volume);
1236}
1237
1239 ccl_private ShaderData *sd,
1240 const uint32_t path_flag,
1241 const float3 weight,
1242 const ccl_private VolumeRayleighClosure *closure,
1243 float3 *layer_albedo)
1244{
1246
1248 sd, sizeof(RayleighVolume), rgb_to_spectrum(weight));
1249 if (!volume) {
1250 return;
1251 }
1252
1253 sd->flag |= volume_rayleigh_setup(volume);
1254}
1255
CCL_NAMESPACE_BEGIN ccl_device ccl_private ShaderClosure * closure_alloc(ccl_private ShaderData *sd, const int size, ClosureType type, Spectrum weight)
Definition alloc.h:11
ccl_device_inline ccl_private ShaderClosure * bsdf_alloc(ccl_private ShaderData *sd, const int size, Spectrum weight)
Definition alloc.h:55
ccl_device ccl_private void * closure_alloc_extra(ccl_private ShaderData *sd, const int size)
Definition alloc.h:34
ccl_device_inline Spectrum bsdf_albedo(KernelGlobals kg, const ccl_private ShaderData *sd, const ccl_private ShaderClosure *sc, const bool reflection, const bool transmission)
Definition bsdf.h:633
CCL_NAMESPACE_BEGIN ccl_device int bsdf_ashikhmin_shirley_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_ashikhmin_velvet_setup(ccl_private VelvetBsdf *bsdf)
ccl_device int bsdf_translucent_setup(ccl_private DiffuseBsdf *bsdf)
ccl_device int bsdf_diffuse_setup(ccl_private DiffuseBsdf *bsdf)
ccl_device int bsdf_hair_reflection_setup(ccl_private HairBsdf *bsdf)
Definition bsdf_hair.h:27
ccl_device int bsdf_hair_transmission_setup(ccl_private HairBsdf *bsdf)
Definition bsdf_hair.h:35
ccl_device void bsdf_microfacet_setup_fresnel_f82_tint(KernelGlobals kg, ccl_private MicrofacetBsdf *bsdf, const ccl_private ShaderData *sd, ccl_private FresnelF82Tint *fresnel, const Spectrum f82_tint, const bool preserve_energy)
ccl_device int bsdf_microfacet_beckmann_glass_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_beckmann_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device void bsdf_microfacet_setup_fresnel_constant(KernelGlobals kg, ccl_private MicrofacetBsdf *bsdf, const ccl_private ShaderData *sd, const Spectrum color)
ccl_device void bsdf_microfacet_setup_fresnel_generalized_schlick(KernelGlobals kg, ccl_private MicrofacetBsdf *bsdf, const ccl_private ShaderData *sd, ccl_private FresnelGeneralizedSchlick *fresnel, const bool preserve_energy)
ccl_device void bsdf_microfacet_setup_fresnel_conductor(KernelGlobals kg, ccl_private MicrofacetBsdf *bsdf, const ccl_private ShaderData *sd, ccl_private FresnelConductor *fresnel, const bool preserve_energy)
ccl_device void bsdf_microfacet_setup_fresnel_dielectric_tint(KernelGlobals kg, ccl_private MicrofacetBsdf *bsdf, const ccl_private ShaderData *sd, ccl_private FresnelDielectricTint *fresnel, const bool preserve_energy)
ccl_device int bsdf_microfacet_beckmann_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_ggx_glass_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_ggx_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_microfacet_ggx_refraction_setup(ccl_private MicrofacetBsdf *bsdf)
ccl_device int bsdf_oren_nayar_setup(const ccl_private ShaderData *sd, ccl_private OrenNayarBsdf *bsdf, const Spectrum color)
ccl_device void bsdf_ray_portal_setup(ccl_private ShaderData *sd, const Spectrum weight, const uint32_t path_flag, const float3 position, float3 direction)
ccl_device int bsdf_sheen_setup(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private SheenBsdf *bsdf)
Definition bsdf_sheen.h:27
ccl_device int bsdf_diffuse_toon_setup(ccl_private ToonBsdf *bsdf)
Definition bsdf_toon.h:35
ccl_device int bsdf_glossy_toon_setup(ccl_private ToonBsdf *bsdf)
Definition bsdf_toon.h:119
CCL_NAMESPACE_BEGIN ccl_device void bsdf_transparent_setup(ccl_private ShaderData *sd, const Spectrum weight, const uint32_t path_flag)
ccl_device float3 maybe_ensure_valid_specular_reflection(ccl_private ShaderData *sd, const float3 N)
Definition bsdf_util.h:281
ccl_device float ior_from_F0(const float f0)
Definition bsdf_util.h:166
ccl_device_inline ccl_private Bssrdf * bssrdf_alloc(ccl_private ShaderData *sd, Spectrum weight)
Definition bssrdf.h:270
ccl_device int bssrdf_setup(ccl_private ShaderData *sd, ccl_private Bssrdf *bssrdf, const int path_flag, ClosureType type)
Definition bssrdf.h:288
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
ccl_device void osl_closure_sheen_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private SheenBSDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_refraction_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private RefractionClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_diffuse_toon_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private DiffuseToonClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_emission_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t, float3 weight, const ccl_private GenericEmissiveClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_subsurface_bssrdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private SubsurfaceBSSRDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_microfacet_multi_ggx_aniso_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private MicrofacetMultiGGXClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_phong_ramp_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t, const float3 weight, const ccl_private PhongRampClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_oren_nayar_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private OrenNayarClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_ashikhmin_velvet_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private AshikhminVelvetClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_hair_chiang_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private ChiangHairClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_translucent_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private TranslucentClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_oren_nayar_diffuse_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private OrenNayarDiffuseBSDFClosure *closure, float3 *layer_albedo)
ccl_device_forceinline bool osl_closure_skip(KernelGlobals kg, const ccl_private ShaderData *sd, const uint32_t path_flag, const int scattering)
ccl_device void osl_closure_ray_portal_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private RayPortalBSDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_dielectric_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private DielectricBSDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_uniform_edf_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t, float3 weight, const ccl_private UniformEDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_burley_diffuse_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t path_flag, float3 weight, ccl_private const BurleyDiffuseBSDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_draine_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private VolumeDraineClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_holdout_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t, const float3 weight, const ccl_private HoldoutClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_reflection_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private ReflectionClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_hair_huang_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private HuangHairClosure *closure, float3 *layer_albedo)
ccl_device_forceinline void osl_zero_albedo(float3 *layer_albedo)
ccl_device void osl_closure_henyey_greenstein_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, float3 weight, const ccl_private VolumeHenyeyGreensteinClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_absorption_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, float3 weight, const ccl_private VolumeAbsorptionClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_diffuse_ramp_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t, const float3 weight, const ccl_private DiffuseRampClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_transparent_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private TransparentClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_background_setup(KernelGlobals kg, ccl_private ShaderData *sd, uint32_t, const float3 weight, const ccl_private GenericBackgroundClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_hair_reflection_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private HairReflectionClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_glossy_toon_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private GlossyToonClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_sheen_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private SheenClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_diffuse_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private DiffuseClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_conductor_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private ConductorBSDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_microfacet_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private MicrofacetClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_rayleigh_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private VolumeRayleighClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_microfacet_multi_ggx_glass_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private MicrofacetMultiGGXGlassClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_bssrdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private BSSRDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_generalized_schlick_bsdf_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private GeneralizedSchlickBSDFClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_hair_transmission_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private HairTransmissionClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_microfacet_f82_tint_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private MicrofacetF82TintClosure *closure, float3 *layer_albedo)
ccl_device void osl_closure_fournier_forand_setup(KernelGlobals kg, ccl_private ShaderData *sd, const uint32_t path_flag, const float3 weight, const ccl_private VolumeFournierForandClosure *closure, float3 *layer_albedo)
#define kernel_data
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
#define PRIMITIVE_UNPACK_SEGMENT(type)
#define ccl_device
#define zero_spectrum
#define ccl_private
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_align(...)
#define CCL_NAMESPACE_END
ccl_device void emission_setup(ccl_private ShaderData *sd, const Spectrum weight)
Definition emissive.h:29
CCL_NAMESPACE_BEGIN ccl_device void background_setup(ccl_private ShaderData *sd, const Spectrum weight)
Definition emissive.h:16
uint top
#define mix(a, b, c)
Definition hash.h:35
CCL_NAMESPACE_BEGIN ccl_device void volume_extinction_setup(ccl_private ShaderData *sd, Spectrum weight)
ccl_device_inline float object_volume_density(KernelGlobals kg, const int object)
ccl_device_inline DeviceString make_string(const char *str, const size_t hash)
ClosureType
@ CLOSURE_BSSRDF_BURLEY_ID
@ CLOSURE_BSSRDF_RANDOM_WALK_ID
@ CLOSURE_HOLDOUT_ID
@ CLOSURE_BSSRDF_RANDOM_WALK_SKIN_ID
@ SD_IS_VOLUME_SHADER_EVAL
@ SD_HOLDOUT
@ PRIMITIVE_CURVE
@ PATH_RAY_DIFFUSE
@ PATH_RAY_CAMERA
@ LABEL_TRANSMIT
@ LABEL_DIFFUSE
@ LABEL_SINGULAR
@ LABEL_GLOSSY
@ LABEL_REFLECT
ccl_device_inline Spectrum rgb_to_spectrum(const float3 rgb)
ccl_device_inline bool is_zero(const float2 a)
ccl_device_inline float average(const float2 a)
ccl_device_inline float3 safe_normalize_fallback(const float3 a, const float3 fallback)
ccl_device_inline float3 one_float3()
Definition math_float3.h:24
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:15
closure color bssrdf(string method, normal N, vector radius, color albedo) BUILTIN
i
Definition text_draw.cc:230
ccl_device int volume_draine_setup(ccl_private DraineVolume *volume)
ccl_device int volume_fournier_forand_setup(ccl_private FournierForandVolume *volume, float B, float IOR)
ccl_device int volume_henyey_greenstein_setup(ccl_private HenyeyGreensteinVolume *volume)
ccl_device int volume_rayleigh_setup(ccl_private RayleighVolume *volume)