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