Blender  V2.93
bsdf.h
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // clang-format off
34 #include "kernel/closure/bssrdf.h"
35 #include "kernel/closure/volume.h"
36 // clang-format on
37 
39 
40 /* Returns the square of the roughness of the closure if it has roughness,
41  * 0 for singular closures and 1 otherwise. */
43 {
44  if (CLOSURE_IS_BSDF_SINGULAR(sc->type)) {
45  return 0.0f;
46  }
47 
48  if (CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
49  MicrofacetBsdf *bsdf = (MicrofacetBsdf *)sc;
50  return bsdf->alpha_x * bsdf->alpha_y;
51  }
52 
53  return 1.0f;
54 }
55 
57 {
58  /* This version includes diffuse, mainly for baking Principled BSDF
59  * where specular and metallic zero otherwise does not bake the
60  * specified roughness parameter. */
61  if (sc->type == CLOSURE_BSDF_OREN_NAYAR_ID) {
62  OrenNayarBsdf *bsdf = (OrenNayarBsdf *)sc;
63  return sqr(sqr(bsdf->roughness));
64  }
65 
66  if (sc->type == CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID) {
68  return sqr(sqr(bsdf->roughness));
69  }
70 
71  if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
72  return 0.0f;
73  }
74 
76 }
77 
78 /* An additional term to smooth illumination on grazing angles when using bump mapping.
79  * Based on "Taming the Shadow Terminator" by Matt Jen-Yuan Chiang,
80  * Yining Karl Li and Brent Burley. */
82 {
83  float g = safe_divide(dot(Ng, I), dot(N, I) * dot(Ng, N));
84 
85  /* If the incoming light is on the unshadowed side, return full brightness. */
86  if (g >= 1.0f) {
87  return 1.0f;
88  }
89 
90  /* If the incoming light points away from the surface, return black. */
91  if (g < 0.0f) {
92  return 0.0f;
93  }
94 
95  /* Return smoothed value to avoid discontinuity at perpendicular angle. */
96  float g2 = sqr(g);
97  return -g2 * g + g2 + g;
98 }
99 
100 /* Shadow terminator workaround, taken from Appleseed.
101  * Original code is under the MIT License
102  * Copyright (c) 2019 Francois Beaune, The appleseedhq Organization */
103 ccl_device_inline float shift_cos_in(float cos_in, const float frequency_multiplier)
104 {
105  cos_in = min(cos_in, 1.0f);
106 
107  const float angle = fast_acosf(cos_in);
108  const float val = max(cosf(angle * frequency_multiplier), 0.0f) / cos_in;
109  return val;
110 }
111 
112 ccl_device_inline int bsdf_sample(KernelGlobals *kg,
113  ShaderData *sd,
114  const ShaderClosure *sc,
115  float randu,
116  float randv,
117  float3 *eval,
118  float3 *omega_in,
119  differential3 *domega_in,
120  float *pdf)
121 {
122  /* For curves use the smooth normal, particularly for ribbons the geometric
123  * normal gives too much darkening otherwise. */
124  int label;
125  const float3 Ng = (sd->type & PRIMITIVE_ALL_CURVE) ? sc->N : sd->Ng;
126 
127  switch (sc->type) {
131  Ng,
132  sd->I,
133  sd->dI.dx,
134  sd->dI.dy,
135  randu,
136  randv,
137  eval,
138  omega_in,
139  &domega_in->dx,
140  &domega_in->dy,
141  pdf);
142  break;
143 #ifdef __SVM__
146  Ng,
147  sd->I,
148  sd->dI.dx,
149  sd->dI.dy,
150  randu,
151  randv,
152  eval,
153  omega_in,
154  &domega_in->dx,
155  &domega_in->dy,
156  pdf);
157  break;
158 # ifdef __OSL__
160  label = bsdf_phong_ramp_sample(sc,
161  Ng,
162  sd->I,
163  sd->dI.dx,
164  sd->dI.dy,
165  randu,
166  randv,
167  eval,
168  omega_in,
169  &domega_in->dx,
170  &domega_in->dy,
171  pdf);
172  break;
174  label = bsdf_diffuse_ramp_sample(sc,
175  Ng,
176  sd->I,
177  sd->dI.dx,
178  sd->dI.dy,
179  randu,
180  randv,
181  eval,
182  omega_in,
183  &domega_in->dx,
184  &domega_in->dy,
185  pdf);
186  break;
187 # endif
190  Ng,
191  sd->I,
192  sd->dI.dx,
193  sd->dI.dy,
194  randu,
195  randv,
196  eval,
197  omega_in,
198  &domega_in->dx,
199  &domega_in->dy,
200  pdf);
201  break;
204  Ng,
205  sd->I,
206  sd->dI.dx,
207  sd->dI.dy,
208  randu,
209  randv,
210  eval,
211  omega_in,
212  &domega_in->dx,
213  &domega_in->dy,
214  pdf);
215  break;
218  Ng,
219  sd->I,
220  sd->dI.dx,
221  sd->dI.dy,
222  randu,
223  randv,
224  eval,
225  omega_in,
226  &domega_in->dx,
227  &domega_in->dy,
228  pdf);
229  break;
232  Ng,
233  sd->I,
234  sd->dI.dx,
235  sd->dI.dy,
236  randu,
237  randv,
238  eval,
239  omega_in,
240  &domega_in->dx,
241  &domega_in->dy,
242  pdf);
243  break;
249  sc,
250  Ng,
251  sd->I,
252  sd->dI.dx,
253  sd->dI.dy,
254  randu,
255  randv,
256  eval,
257  omega_in,
258  &domega_in->dx,
259  &domega_in->dy,
260  pdf);
261  break;
265  sc,
266  Ng,
267  sd->I,
268  sd->dI.dx,
269  sd->dI.dy,
270  randu,
271  randv,
272  eval,
273  omega_in,
274  &domega_in->dx,
275  &domega_in->dy,
276  pdf,
277  &sd->lcg_state);
278  break;
282  sc,
283  Ng,
284  sd->I,
285  sd->dI.dx,
286  sd->dI.dy,
287  randu,
288  randv,
289  eval,
290  omega_in,
291  &domega_in->dx,
292  &domega_in->dy,
293  pdf,
294  &sd->lcg_state);
295  break;
299  sc,
300  Ng,
301  sd->I,
302  sd->dI.dx,
303  sd->dI.dy,
304  randu,
305  randv,
306  eval,
307  omega_in,
308  &domega_in->dx,
309  &domega_in->dy,
310  pdf);
311  break;
314  Ng,
315  sd->I,
316  sd->dI.dx,
317  sd->dI.dy,
318  randu,
319  randv,
320  eval,
321  omega_in,
322  &domega_in->dx,
323  &domega_in->dy,
324  pdf);
325  break;
328  Ng,
329  sd->I,
330  sd->dI.dx,
331  sd->dI.dy,
332  randu,
333  randv,
334  eval,
335  omega_in,
336  &domega_in->dx,
337  &domega_in->dy,
338  pdf);
339  break;
342  Ng,
343  sd->I,
344  sd->dI.dx,
345  sd->dI.dy,
346  randu,
347  randv,
348  eval,
349  omega_in,
350  &domega_in->dx,
351  &domega_in->dy,
352  pdf);
353  break;
356  Ng,
357  sd->I,
358  sd->dI.dx,
359  sd->dI.dy,
360  randu,
361  randv,
362  eval,
363  omega_in,
364  &domega_in->dx,
365  &domega_in->dy,
366  pdf);
367  break;
370  Ng,
371  sd->I,
372  sd->dI.dx,
373  sd->dI.dy,
374  randu,
375  randv,
376  eval,
377  omega_in,
378  &domega_in->dx,
379  &domega_in->dy,
380  pdf);
381  break;
384  Ng,
385  sd->I,
386  sd->dI.dx,
387  sd->dI.dy,
388  randu,
389  randv,
390  eval,
391  omega_in,
392  &domega_in->dx,
393  &domega_in->dy,
394  pdf);
395  break;
398  kg, sc, sd, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
399  break;
400 # ifdef __PRINCIPLED__
404  Ng,
405  sd->I,
406  sd->dI.dx,
407  sd->dI.dy,
408  randu,
409  randv,
410  eval,
411  omega_in,
412  &domega_in->dx,
413  &domega_in->dy,
414  pdf);
415  break;
418  Ng,
419  sd->I,
420  sd->dI.dx,
421  sd->dI.dy,
422  randu,
423  randv,
424  eval,
425  omega_in,
426  &domega_in->dx,
427  &domega_in->dy,
428  pdf);
429  break;
430 # endif /* __PRINCIPLED__ */
431 #endif
432 #ifdef __VOLUME__
435  sd->I,
436  sd->dI.dx,
437  sd->dI.dy,
438  randu,
439  randv,
440  eval,
441  omega_in,
442  &domega_in->dx,
443  &domega_in->dy,
444  pdf);
445  break;
446 #endif
447  default:
448  label = LABEL_NONE;
449  break;
450  }
451 
452  /* Test if BSDF sample should be treated as transparent for background. */
453  if (label & LABEL_TRANSMIT) {
454  float threshold_squared = kernel_data.background.transparent_roughness_squared_threshold;
455 
456  if (threshold_squared >= 0.0f) {
457  if (bsdf_get_specular_roughness_squared(sc) <= threshold_squared) {
459  }
460  }
461  }
462  else {
463  /* Shadow terminator offset. */
464  const float frequency_multiplier =
465  kernel_tex_fetch(__objects, sd->object).shadow_terminator_offset;
466  if (frequency_multiplier > 1.0f) {
467  *eval *= shift_cos_in(dot(*omega_in, sc->N), frequency_multiplier);
468  }
469  if (label & LABEL_DIFFUSE) {
470  if (!isequal_float3(sc->N, sd->N)) {
471  *eval *= bump_shadowing_term((label & LABEL_TRANSMIT) ? -sd->N : sd->N, sc->N, *omega_in);
472  }
473  }
474  }
475 
476  return label;
477 }
478 
479 #ifndef __KERNEL_CUDA__
481 #else
483 #endif
484  float3
485  bsdf_eval(KernelGlobals *kg,
486  ShaderData *sd,
487  const ShaderClosure *sc,
488  const float3 omega_in,
489  float *pdf)
490 {
491  /* For curves use the smooth normal, particularly for ribbons the geometric
492  * normal gives too much darkening otherwise. */
493  const float3 Ng = (sd->type & PRIMITIVE_ALL_CURVE) ? sd->N : sd->Ng;
494  float3 eval;
495 
496  if (dot(Ng, omega_in) >= 0.0f) {
497  switch (sc->type) {
500  eval = bsdf_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
501  break;
502 #ifdef __SVM__
504  eval = bsdf_oren_nayar_eval_reflect(sc, sd->I, omega_in, pdf);
505  break;
506 # ifdef __OSL__
508  eval = bsdf_phong_ramp_eval_reflect(sc, sd->I, omega_in, pdf);
509  break;
511  eval = bsdf_diffuse_ramp_eval_reflect(sc, sd->I, omega_in, pdf);
512  break;
513 # endif
515  eval = bsdf_translucent_eval_reflect(sc, sd->I, omega_in, pdf);
516  break;
518  eval = bsdf_reflection_eval_reflect(sc, sd->I, omega_in, pdf);
519  break;
521  eval = bsdf_refraction_eval_reflect(sc, sd->I, omega_in, pdf);
522  break;
524  eval = bsdf_transparent_eval_reflect(sc, sd->I, omega_in, pdf);
525  break;
530  eval = bsdf_microfacet_ggx_eval_reflect(sc, sd->I, omega_in, pdf);
531  break;
534  eval = bsdf_microfacet_multi_ggx_eval_reflect(sc, sd->I, omega_in, pdf, &sd->lcg_state);
535  break;
539  sc, sd->I, omega_in, pdf, &sd->lcg_state);
540  break;
543  eval = bsdf_microfacet_beckmann_eval_reflect(sc, sd->I, omega_in, pdf);
544  break;
546  eval = bsdf_ashikhmin_shirley_eval_reflect(sc, sd->I, omega_in, pdf);
547  break;
549  eval = bsdf_ashikhmin_velvet_eval_reflect(sc, sd->I, omega_in, pdf);
550  break;
552  eval = bsdf_diffuse_toon_eval_reflect(sc, sd->I, omega_in, pdf);
553  break;
555  eval = bsdf_glossy_toon_eval_reflect(sc, sd->I, omega_in, pdf);
556  break;
558  eval = bsdf_principled_hair_eval(kg, sd, sc, omega_in, pdf);
559  break;
561  eval = bsdf_hair_reflection_eval_reflect(sc, sd->I, omega_in, pdf);
562  break;
564  eval = bsdf_hair_transmission_eval_reflect(sc, sd->I, omega_in, pdf);
565  break;
566 # ifdef __PRINCIPLED__
569  eval = bsdf_principled_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
570  break;
572  eval = bsdf_principled_sheen_eval_reflect(sc, sd->I, omega_in, pdf);
573  break;
574 # endif /* __PRINCIPLED__ */
575 #endif
576 #ifdef __VOLUME__
578  eval = volume_henyey_greenstein_eval_phase(sc, sd->I, omega_in, pdf);
579  break;
580 #endif
581  default:
582  eval = make_float3(0.0f, 0.0f, 0.0f);
583  break;
584  }
585  if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
586  if (!isequal_float3(sc->N, sd->N)) {
587  eval *= bump_shadowing_term(sd->N, sc->N, omega_in);
588  }
589  }
590  /* Shadow terminator offset. */
591  const float frequency_multiplier =
592  kernel_tex_fetch(__objects, sd->object).shadow_terminator_offset;
593  if (frequency_multiplier > 1.0f) {
594  eval *= shift_cos_in(dot(omega_in, sc->N), frequency_multiplier);
595  }
596  }
597  else {
598  switch (sc->type) {
601  eval = bsdf_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
602  break;
603 #ifdef __SVM__
605  eval = bsdf_oren_nayar_eval_transmit(sc, sd->I, omega_in, pdf);
606  break;
608  eval = bsdf_translucent_eval_transmit(sc, sd->I, omega_in, pdf);
609  break;
611  eval = bsdf_reflection_eval_transmit(sc, sd->I, omega_in, pdf);
612  break;
614  eval = bsdf_refraction_eval_transmit(sc, sd->I, omega_in, pdf);
615  break;
617  eval = bsdf_transparent_eval_transmit(sc, sd->I, omega_in, pdf);
618  break;
623  eval = bsdf_microfacet_ggx_eval_transmit(sc, sd->I, omega_in, pdf);
624  break;
627  eval = bsdf_microfacet_multi_ggx_eval_transmit(sc, sd->I, omega_in, pdf, &sd->lcg_state);
628  break;
632  sc, sd->I, omega_in, pdf, &sd->lcg_state);
633  break;
636  eval = bsdf_microfacet_beckmann_eval_transmit(sc, sd->I, omega_in, pdf);
637  break;
639  eval = bsdf_ashikhmin_shirley_eval_transmit(sc, sd->I, omega_in, pdf);
640  break;
642  eval = bsdf_ashikhmin_velvet_eval_transmit(sc, sd->I, omega_in, pdf);
643  break;
645  eval = bsdf_diffuse_toon_eval_transmit(sc, sd->I, omega_in, pdf);
646  break;
648  eval = bsdf_glossy_toon_eval_transmit(sc, sd->I, omega_in, pdf);
649  break;
651  eval = bsdf_principled_hair_eval(kg, sd, sc, omega_in, pdf);
652  break;
654  eval = bsdf_hair_reflection_eval_transmit(sc, sd->I, omega_in, pdf);
655  break;
657  eval = bsdf_hair_transmission_eval_transmit(sc, sd->I, omega_in, pdf);
658  break;
659 # ifdef __PRINCIPLED__
662  eval = bsdf_principled_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
663  break;
665  eval = bsdf_principled_sheen_eval_transmit(sc, sd->I, omega_in, pdf);
666  break;
667 # endif /* __PRINCIPLED__ */
668 #endif
669 #ifdef __VOLUME__
671  eval = volume_henyey_greenstein_eval_phase(sc, sd->I, omega_in, pdf);
672  break;
673 #endif
674  default:
675  eval = make_float3(0.0f, 0.0f, 0.0f);
676  break;
677  }
678  if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
679  if (!isequal_float3(sc->N, sd->N)) {
680  eval *= bump_shadowing_term(-sd->N, sc->N, omega_in);
681  }
682  }
683  }
684 
685  return eval;
686 }
687 
688 ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness)
689 {
690  /* ToDo: do we want to blur volume closures? */
691 #ifdef __SVM__
692  switch (sc->type) {
698  break;
704  break;
708  break;
711  break;
714  break;
715  default:
716  break;
717  }
718 #endif
719 }
720 
722 {
723 #ifdef __SVM__
724  switch (a->type) {
726  return true;
730  return bsdf_diffuse_merge(a, b);
732  return bsdf_oren_nayar_merge(a, b);
746  return bsdf_microfacet_merge(a, b);
748  return bsdf_ashikhmin_velvet_merge(a, b);
751  return bsdf_toon_merge(a, b);
754  return bsdf_hair_merge(a, b);
755 # ifdef __PRINCIPLED__
758  return bsdf_principled_diffuse_merge(a, b);
759 # endif
760 # ifdef __VOLUME__
763 # endif
764  default:
765  return false;
766  }
767 #else
768  return false;
769 #endif
770 }
771 
MINLINE float safe_divide(float a, float b)
ccl_device_inline int bsdf_sample(KernelGlobals *kg, ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, differential3 *domega_in, float *pdf)
Definition: bsdf.h:112
ccl_device_inline float shift_cos_in(float cos_in, const float frequency_multiplier)
Definition: bsdf.h:103
CCL_NAMESPACE_BEGIN ccl_device_inline float bsdf_get_specular_roughness_squared(const ShaderClosure *sc)
Definition: bsdf.h:42
ccl_device_inline float bump_shadowing_term(float3 Ng, float3 N, float3 I)
Definition: bsdf.h:81
ccl_device bool bsdf_merge(ShaderClosure *a, ShaderClosure *b)
Definition: bsdf.h:721
ccl_device_inline float bsdf_get_roughness_squared(const ShaderClosure *sc)
Definition: bsdf.h:56
ccl_device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness)
Definition: bsdf.h:688
ccl_device float3 bsdf_eval(KernelGlobals *kg, ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
Definition: bsdf.h:485
ccl_device void bsdf_ashikhmin_shirley_blur(ShaderClosure *sc, float roughness)
ccl_device_forceinline float3 bsdf_ashikhmin_shirley_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_ashikhmin_shirley_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_ashikhmin_shirley_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device bool bsdf_ashikhmin_velvet_merge(const ShaderClosure *a, const ShaderClosure *b)
ccl_device float3 bsdf_ashikhmin_velvet_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_ashikhmin_velvet_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_diffuse.h:60
ccl_device int bsdf_diffuse_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
Definition: bsdf_diffuse.h:81
ccl_device bool bsdf_diffuse_merge(const ShaderClosure *a, const ShaderClosure *b)
Definition: bsdf_diffuse.h:52
ccl_device float3 bsdf_translucent_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_diffuse.h:130
ccl_device float3 bsdf_translucent_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_diffuse.h:122
ccl_device float3 bsdf_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_diffuse.h:73
ccl_device int bsdf_translucent_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
Definition: bsdf_diffuse.h:143
ccl_device bool bsdf_hair_merge(const ShaderClosure *a, const ShaderClosure *b)
Definition: bsdf_hair.h:65
ccl_device int bsdf_hair_reflection_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
Definition: bsdf_hair.h:183
ccl_device float3 bsdf_hair_reflection_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_hair.h:129
ccl_device float3 bsdf_hair_transmission_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_hair.h:137
ccl_device float3 bsdf_hair_transmission_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_hair.h:121
ccl_device float3 bsdf_hair_reflection_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_hair.h:74
ccl_device int bsdf_hair_transmission_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
Definition: bsdf_hair.h:244
ccl_device int bsdf_principled_hair_sample(KernelGlobals *kg, const ShaderClosure *sc, ShaderData *sd, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device void bsdf_principled_hair_blur(ShaderClosure *sc, float roughness)
ccl_device float3 bsdf_principled_hair_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_microfacet_beckmann_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device bool bsdf_microfacet_merge(const ShaderClosure *a, const ShaderClosure *b)
ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device void bsdf_microfacet_ggx_blur(ShaderClosure *sc, float roughness)
ccl_device void bsdf_microfacet_beckmann_blur(ShaderClosure *sc, float roughness)
ccl_device float3 bsdf_microfacet_multi_ggx_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf, ccl_addr_space uint *lcg_state)
ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf, ccl_addr_space uint *lcg_state)
ccl_device float3 bsdf_microfacet_multi_ggx_glass_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf, ccl_addr_space uint *lcg_state)
ccl_device void bsdf_microfacet_multi_ggx_blur(ShaderClosure *sc, float roughness)
ccl_device float3 bsdf_microfacet_multi_ggx_glass_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf, ccl_addr_space uint *lcg_state)
ccl_device float3 bsdf_microfacet_multi_ggx_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf, ccl_addr_space uint *lcg_state)
ccl_device int bsdf_microfacet_multi_ggx_sample(KernelGlobals *kg, const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf, ccl_addr_space uint *lcg_state)
ccl_device float3 bsdf_oren_nayar_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_oren_nayar_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_oren_nayar_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device bool bsdf_oren_nayar_merge(const ShaderClosure *a, const ShaderClosure *b)
ccl_device float3 bsdf_principled_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_principled_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device bool bsdf_principled_diffuse_merge(const ShaderClosure *a, const ShaderClosure *b)
ccl_device int bsdf_principled_diffuse_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device int bsdf_principled_sheen_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_principled_sheen_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_principled_sheen_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_reflection_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_reflection_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_reflection_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_refraction_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device int bsdf_refraction_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_refraction_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_diffuse_toon_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_toon.h:108
ccl_device int bsdf_glossy_toon_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
Definition: bsdf_toon.h:201
ccl_device float3 bsdf_diffuse_toon_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_toon.h:86
ccl_device float3 bsdf_glossy_toon_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_toon.h:193
ccl_device float3 bsdf_glossy_toon_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
Definition: bsdf_toon.h:165
ccl_device int bsdf_diffuse_toon_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
Definition: bsdf_toon.h:116
ccl_device bool bsdf_toon_merge(const ShaderClosure *a, const ShaderClosure *b)
Definition: bsdf_toon.h:58
ccl_device int bsdf_transparent_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 bsdf_transparent_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
ccl_device float3 bsdf_transparent_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
Definition: btVector3.h:356
const char * label
ccl_device int volume_henyey_greenstein_sample(const ShaderClosure *sc, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
ccl_device float3 volume_henyey_greenstein_eval_phase(const ShaderClosure *sc, const float3 I, float3 omega_in, float *pdf)
ccl_device bool volume_henyey_greenstein_merge(const ShaderClosure *a, const ShaderClosure *b)
#define kernel_data
#define kernel_tex_fetch(tex, index)
#define cosf(x)
#define ccl_device
#define ccl_device_inline
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
@ PRIMITIVE_ALL_CURVE
Definition: kernel_types.h:698
ShaderData
@ LABEL_TRANSMIT
Definition: kernel_types.h:328
@ LABEL_TRANSMIT_TRANSPARENT
Definition: kernel_types.h:335
@ LABEL_DIFFUSE
Definition: kernel_types.h:330
@ LABEL_NONE
Definition: kernel_types.h:327
ShaderClosure
Definition: kernel_types.h:831
static unsigned a[3]
Definition: RandGen.cpp:92
static const pxr::TfToken roughness("roughness", pxr::TfToken::Immortal)
#define I
params N
#define min(a, b)
Definition: sort.c:51
#define CLOSURE_IS_BSDF_MICROFACET(type)
Definition: svm_types.h:612
#define CLOSURE_IS_BSDF_SINGULAR(type)
Definition: svm_types.h:605
#define CLOSURE_IS_BSDF_DIFFUSE(type)
Definition: svm_types.h:596
@ CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID
Definition: svm_types.h:546
@ CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID
Definition: svm_types.h:559
@ CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID
Definition: svm_types.h:587
@ CLOSURE_BSDF_PHONG_RAMP_ID
Definition: svm_types.h:552
@ CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID
Definition: svm_types.h:550
@ CLOSURE_BSDF_DIFFUSE_RAMP_ID
Definition: svm_types.h:536
@ CLOSURE_BSDF_HAIR_PRINCIPLED_ID
Definition: svm_types.h:565
@ CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID
Definition: svm_types.h:537
@ CLOSURE_BSDF_DIFFUSE_ID
Definition: svm_types.h:534
@ CLOSURE_BSDF_TRANSPARENT_ID
Definition: svm_types.h:571
@ CLOSURE_BSDF_DIFFUSE_TOON_ID
Definition: svm_types.h:539
@ CLOSURE_BSDF_MICROFACET_GGX_ID
Definition: svm_types.h:544
@ CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID
Definition: svm_types.h:558
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID
Definition: svm_types.h:548
@ CLOSURE_BSDF_PRINCIPLED_SHEEN_ID
Definition: svm_types.h:538
@ CLOSURE_BSDF_HAIR_TRANSMISSION_ID
Definition: svm_types.h:566
@ CLOSURE_BSDF_REFRACTION_ID
Definition: svm_types.h:557
@ CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID
Definition: svm_types.h:570
@ CLOSURE_BSDF_MICROFACET_BECKMANN_ID
Definition: svm_types.h:547
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID
Definition: svm_types.h:560
@ CLOSURE_BSDF_OREN_NAYAR_ID
Definition: svm_types.h:535
@ CLOSURE_BSDF_GLOSSY_TOON_ID
Definition: svm_types.h:553
@ CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID
Definition: svm_types.h:545
@ CLOSURE_BSDF_BSSRDF_ID
Definition: svm_types.h:569
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID
Definition: svm_types.h:563
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID
Definition: svm_types.h:549
@ CLOSURE_BSDF_HAIR_REFLECTION_ID
Definition: svm_types.h:554
@ CLOSURE_BSDF_TRANSLUCENT_ID
Definition: svm_types.h:540
@ CLOSURE_BSDF_REFLECTION_ID
Definition: svm_types.h:543
@ CLOSURE_BSDF_ASHIKHMIN_VELVET_ID
Definition: svm_types.h:551
float max
ccl_device_inline float sqr(float a)
Definition: util_math.h:651
ccl_device float fast_acosf(float x)
ccl_device_inline float dot(const float2 &a, const float2 &b)
ccl_device_inline bool isequal_float3(const float3 a, const float3 b)