Blender  V3.3
bsdf.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #pragma once
5 
6 // clang-format off
23 #include "kernel/closure/bssrdf.h"
24 #include "kernel/closure/volume.h"
25 // clang-format on
26 
28 
29 /* Returns the square of the roughness of the closure if it has roughness,
30  * 0 for singular closures and 1 otherwise. */
32 {
33  if (CLOSURE_IS_BSDF_SINGULAR(sc->type)) {
34  return 0.0f;
35  }
36 
37  if (CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
39  return bsdf->alpha_x * bsdf->alpha_y;
40  }
41 
42  return 1.0f;
43 }
44 
46 {
47  /* This version includes diffuse, mainly for baking Principled BSDF
48  * where specular and metallic zero otherwise does not bake the
49  * specified roughness parameter. */
50  if (sc->type == CLOSURE_BSDF_OREN_NAYAR_ID) {
52  return sqr(sqr(bsdf->roughness));
53  }
54 
55  if (sc->type == CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID) {
57  return sqr(sqr(bsdf->roughness));
58  }
59 
60  if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
61  return 0.0f;
62  }
63 
65 }
66 
67 /* An additional term to smooth illumination on grazing angles when using bump mapping.
68  * Based on "Taming the Shadow Terminator" by Matt Jen-Yuan Chiang,
69  * Yining Karl Li and Brent Burley. */
71 {
72  float g = safe_divide(dot(Ng, I), dot(N, I) * dot(Ng, N));
73 
74  /* If the incoming light is on the unshadowed side, return full brightness. */
75  if (g >= 1.0f) {
76  return 1.0f;
77  }
78 
79  /* If the incoming light points away from the surface, return black. */
80  if (g < 0.0f) {
81  return 0.0f;
82  }
83 
84  /* Return smoothed value to avoid discontinuity at perpendicular angle. */
85  float g2 = sqr(g);
86  return -g2 * g + g2 + g;
87 }
88 
89 ccl_device_inline float shift_cos_in(float cos_in, const float frequency_multiplier)
90 {
91  /* Shadow terminator workaround, taken from Appleseed.
92  * SPDX-License-Identifier: MIT
93  * Copyright (c) 2019 Francois Beaune, The appleseedhq Organization */
94  cos_in = min(cos_in, 1.0f);
95 
96  const float angle = fast_acosf(cos_in);
97  const float val = max(cosf(angle * frequency_multiplier), 0.0f) / cos_in;
98  return val;
99 }
100 
103  ccl_private const ShaderClosure *sc,
104  float randu,
105  float randv,
106  ccl_private float3 *eval,
107  ccl_private float3 *omega_in,
108  ccl_private differential3 *domega_in,
109  ccl_private float *pdf)
110 {
111  /* For curves use the smooth normal, particularly for ribbons the geometric
112  * normal gives too much darkening otherwise. */
113  int label;
114  const float3 Ng = (sd->type & PRIMITIVE_CURVE) ? sc->N : sd->Ng;
115 
116  switch (sc->type) {
119  Ng,
120  sd->I,
121  sd->dI.dx,
122  sd->dI.dy,
123  randu,
124  randv,
125  eval,
126  omega_in,
127  &domega_in->dx,
128  &domega_in->dy,
129  pdf);
130  break;
131 #ifdef __SVM__
134  Ng,
135  sd->I,
136  sd->dI.dx,
137  sd->dI.dy,
138  randu,
139  randv,
140  eval,
141  omega_in,
142  &domega_in->dx,
143  &domega_in->dy,
144  pdf);
145  break;
146 # ifdef __OSL__
148  label = bsdf_phong_ramp_sample(sc,
149  Ng,
150  sd->I,
151  sd->dI.dx,
152  sd->dI.dy,
153  randu,
154  randv,
155  eval,
156  omega_in,
157  &domega_in->dx,
158  &domega_in->dy,
159  pdf);
160  break;
162  label = bsdf_diffuse_ramp_sample(sc,
163  Ng,
164  sd->I,
165  sd->dI.dx,
166  sd->dI.dy,
167  randu,
168  randv,
169  eval,
170  omega_in,
171  &domega_in->dx,
172  &domega_in->dy,
173  pdf);
174  break;
175 # endif
178  Ng,
179  sd->I,
180  sd->dI.dx,
181  sd->dI.dy,
182  randu,
183  randv,
184  eval,
185  omega_in,
186  &domega_in->dx,
187  &domega_in->dy,
188  pdf);
189  break;
192  Ng,
193  sd->I,
194  sd->dI.dx,
195  sd->dI.dy,
196  randu,
197  randv,
198  eval,
199  omega_in,
200  &domega_in->dx,
201  &domega_in->dy,
202  pdf);
203  break;
206  Ng,
207  sd->I,
208  sd->dI.dx,
209  sd->dI.dy,
210  randu,
211  randv,
212  eval,
213  omega_in,
214  &domega_in->dx,
215  &domega_in->dy,
216  pdf);
217  break;
220  Ng,
221  sd->I,
222  sd->dI.dx,
223  sd->dI.dy,
224  randu,
225  randv,
226  eval,
227  omega_in,
228  &domega_in->dx,
229  &domega_in->dy,
230  pdf);
231  break;
237  sc,
238  Ng,
239  sd->I,
240  sd->dI.dx,
241  sd->dI.dy,
242  randu,
243  randv,
244  eval,
245  omega_in,
246  &domega_in->dx,
247  &domega_in->dy,
248  pdf);
249  break;
253  sc,
254  Ng,
255  sd->I,
256  sd->dI.dx,
257  sd->dI.dy,
258  randu,
259  randv,
260  eval,
261  omega_in,
262  &domega_in->dx,
263  &domega_in->dy,
264  pdf,
265  &sd->lcg_state);
266  break;
270  sc,
271  Ng,
272  sd->I,
273  sd->dI.dx,
274  sd->dI.dy,
275  randu,
276  randv,
277  eval,
278  omega_in,
279  &domega_in->dx,
280  &domega_in->dy,
281  pdf,
282  &sd->lcg_state);
283  break;
287  sc,
288  Ng,
289  sd->I,
290  sd->dI.dx,
291  sd->dI.dy,
292  randu,
293  randv,
294  eval,
295  omega_in,
296  &domega_in->dx,
297  &domega_in->dy,
298  pdf);
299  break;
302  Ng,
303  sd->I,
304  sd->dI.dx,
305  sd->dI.dy,
306  randu,
307  randv,
308  eval,
309  omega_in,
310  &domega_in->dx,
311  &domega_in->dy,
312  pdf);
313  break;
316  Ng,
317  sd->I,
318  sd->dI.dx,
319  sd->dI.dy,
320  randu,
321  randv,
322  eval,
323  omega_in,
324  &domega_in->dx,
325  &domega_in->dy,
326  pdf);
327  break;
330  Ng,
331  sd->I,
332  sd->dI.dx,
333  sd->dI.dy,
334  randu,
335  randv,
336  eval,
337  omega_in,
338  &domega_in->dx,
339  &domega_in->dy,
340  pdf);
341  break;
344  Ng,
345  sd->I,
346  sd->dI.dx,
347  sd->dI.dy,
348  randu,
349  randv,
350  eval,
351  omega_in,
352  &domega_in->dx,
353  &domega_in->dy,
354  pdf);
355  break;
358  Ng,
359  sd->I,
360  sd->dI.dx,
361  sd->dI.dy,
362  randu,
363  randv,
364  eval,
365  omega_in,
366  &domega_in->dx,
367  &domega_in->dy,
368  pdf);
369  break;
372  Ng,
373  sd->I,
374  sd->dI.dx,
375  sd->dI.dy,
376  randu,
377  randv,
378  eval,
379  omega_in,
380  &domega_in->dx,
381  &domega_in->dy,
382  pdf);
383  break;
386  kg, sc, sd, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
387  break;
388 # ifdef __PRINCIPLED__
391  Ng,
392  sd->I,
393  sd->dI.dx,
394  sd->dI.dy,
395  randu,
396  randv,
397  eval,
398  omega_in,
399  &domega_in->dx,
400  &domega_in->dy,
401  pdf);
402  break;
405  Ng,
406  sd->I,
407  sd->dI.dx,
408  sd->dI.dy,
409  randu,
410  randv,
411  eval,
412  omega_in,
413  &domega_in->dx,
414  &domega_in->dy,
415  pdf);
416  break;
417 # endif /* __PRINCIPLED__ */
418 #endif
419  default:
420  label = LABEL_NONE;
421  break;
422  }
423 
424  /* Test if BSDF sample should be treated as transparent for background. */
425  if (label & LABEL_TRANSMIT) {
426  float threshold_squared = kernel_data.background.transparent_roughness_squared_threshold;
427 
428  if (threshold_squared >= 0.0f && !(label & LABEL_DIFFUSE)) {
429  if (bsdf_get_specular_roughness_squared(sc) <= threshold_squared) {
431  }
432  }
433  }
434  else {
435  /* Shadow terminator offset. */
436  const float frequency_multiplier =
437  kernel_data_fetch(objects, sd->object).shadow_terminator_shading_offset;
438  if (frequency_multiplier > 1.0f) {
439  *eval *= shift_cos_in(dot(*omega_in, sc->N), frequency_multiplier);
440  }
441  if (label & LABEL_DIFFUSE) {
442  if (!isequal(sc->N, sd->N)) {
443  *eval *= bump_shadowing_term((label & LABEL_TRANSMIT) ? -sd->N : sd->N, sc->N, *omega_in);
444  }
445  }
446  }
447 
448 #ifdef WITH_CYCLES_DEBUG
449  kernel_assert(*pdf >= 0.0f);
450  kernel_assert(eval->x >= 0.0f && eval->y >= 0.0f && eval->z >= 0.0f);
451 #endif
452 
453  return label;
454 }
455 
456 #ifndef __KERNEL_CUDA__
458 #else
460 #endif
461  float3
464  ccl_private const ShaderClosure *sc,
465  const float3 omega_in,
466  const bool is_transmission,
467  ccl_private float *pdf)
468 {
469  float3 eval = zero_float3();
470 
471  if (!is_transmission) {
472  switch (sc->type) {
474  eval = bsdf_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
475  break;
476 #ifdef __SVM__
478  eval = bsdf_oren_nayar_eval_reflect(sc, sd->I, omega_in, pdf);
479  break;
480 # ifdef __OSL__
482  eval = bsdf_phong_ramp_eval_reflect(sc, sd->I, omega_in, pdf);
483  break;
485  eval = bsdf_diffuse_ramp_eval_reflect(sc, sd->I, omega_in, pdf);
486  break;
487 # endif
489  eval = bsdf_translucent_eval_reflect(sc, sd->I, omega_in, pdf);
490  break;
492  eval = bsdf_reflection_eval_reflect(sc, sd->I, omega_in, pdf);
493  break;
495  eval = bsdf_refraction_eval_reflect(sc, sd->I, omega_in, pdf);
496  break;
498  eval = bsdf_transparent_eval_reflect(sc, sd->I, omega_in, pdf);
499  break;
504  eval = bsdf_microfacet_ggx_eval_reflect(sc, sd->I, omega_in, pdf);
505  break;
508  eval = bsdf_microfacet_multi_ggx_eval_reflect(sc, sd->I, omega_in, pdf, &sd->lcg_state);
509  break;
513  sc, sd->I, omega_in, pdf, &sd->lcg_state);
514  break;
517  eval = bsdf_microfacet_beckmann_eval_reflect(sc, sd->I, omega_in, pdf);
518  break;
520  eval = bsdf_ashikhmin_shirley_eval_reflect(sc, sd->I, omega_in, pdf);
521  break;
523  eval = bsdf_ashikhmin_velvet_eval_reflect(sc, sd->I, omega_in, pdf);
524  break;
526  eval = bsdf_diffuse_toon_eval_reflect(sc, sd->I, omega_in, pdf);
527  break;
529  eval = bsdf_glossy_toon_eval_reflect(sc, sd->I, omega_in, pdf);
530  break;
532  eval = bsdf_principled_hair_eval(kg, sd, sc, omega_in, pdf);
533  break;
535  eval = bsdf_hair_reflection_eval_reflect(sc, sd->I, omega_in, pdf);
536  break;
538  eval = bsdf_hair_transmission_eval_reflect(sc, sd->I, omega_in, pdf);
539  break;
540 # ifdef __PRINCIPLED__
542  eval = bsdf_principled_diffuse_eval_reflect(sc, sd->I, omega_in, pdf);
543  break;
545  eval = bsdf_principled_sheen_eval_reflect(sc, sd->I, omega_in, pdf);
546  break;
547 # endif /* __PRINCIPLED__ */
548 #endif
549  default:
550  break;
551  }
552  if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
553  if (!isequal(sc->N, sd->N)) {
554  eval *= bump_shadowing_term(sd->N, sc->N, omega_in);
555  }
556  }
557  /* Shadow terminator offset. */
558  const float frequency_multiplier =
559  kernel_data_fetch(objects, sd->object).shadow_terminator_shading_offset;
560  if (frequency_multiplier > 1.0f) {
561  eval *= shift_cos_in(dot(omega_in, sc->N), frequency_multiplier);
562  }
563  }
564  else {
565  switch (sc->type) {
567  eval = bsdf_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
568  break;
569 #ifdef __SVM__
571  eval = bsdf_oren_nayar_eval_transmit(sc, sd->I, omega_in, pdf);
572  break;
574  eval = bsdf_translucent_eval_transmit(sc, sd->I, omega_in, pdf);
575  break;
577  eval = bsdf_reflection_eval_transmit(sc, sd->I, omega_in, pdf);
578  break;
580  eval = bsdf_refraction_eval_transmit(sc, sd->I, omega_in, pdf);
581  break;
583  eval = bsdf_transparent_eval_transmit(sc, sd->I, omega_in, pdf);
584  break;
589  eval = bsdf_microfacet_ggx_eval_transmit(sc, sd->I, omega_in, pdf);
590  break;
593  eval = bsdf_microfacet_multi_ggx_eval_transmit(sc, sd->I, omega_in, pdf, &sd->lcg_state);
594  break;
598  sc, sd->I, omega_in, pdf, &sd->lcg_state);
599  break;
602  eval = bsdf_microfacet_beckmann_eval_transmit(sc, sd->I, omega_in, pdf);
603  break;
605  eval = bsdf_ashikhmin_shirley_eval_transmit(sc, sd->I, omega_in, pdf);
606  break;
608  eval = bsdf_ashikhmin_velvet_eval_transmit(sc, sd->I, omega_in, pdf);
609  break;
611  eval = bsdf_diffuse_toon_eval_transmit(sc, sd->I, omega_in, pdf);
612  break;
614  eval = bsdf_glossy_toon_eval_transmit(sc, sd->I, omega_in, pdf);
615  break;
617  eval = bsdf_principled_hair_eval(kg, sd, sc, omega_in, pdf);
618  break;
620  eval = bsdf_hair_reflection_eval_transmit(sc, sd->I, omega_in, pdf);
621  break;
623  eval = bsdf_hair_transmission_eval_transmit(sc, sd->I, omega_in, pdf);
624  break;
625 # ifdef __PRINCIPLED__
627  eval = bsdf_principled_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
628  break;
630  eval = bsdf_principled_sheen_eval_transmit(sc, sd->I, omega_in, pdf);
631  break;
632 # endif /* __PRINCIPLED__ */
633 #endif
634  default:
635  break;
636  }
637  if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
638  if (!isequal(sc->N, sd->N)) {
639  eval *= bump_shadowing_term(-sd->N, sc->N, omega_in);
640  }
641  }
642  }
643 #ifdef WITH_CYCLES_DEBUG
644  kernel_assert(*pdf >= 0.0f);
645  kernel_assert(eval.x >= 0.0f && eval.y >= 0.0f && eval.z >= 0.0f);
646 #endif
647  return eval;
648 }
649 
651 {
652  /* TODO: do we want to blur volume closures? */
653 #ifdef __SVM__
654  switch (sc->type) {
660  break;
666  break;
670  break;
673  break;
676  break;
677  default:
678  break;
679  }
680 #endif
681 }
682 
ccl_device_inline int bsdf_sample(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private const ShaderClosure *sc, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private differential3 *domega_in, ccl_private float *pdf)
Definition: bsdf.h:101
ccl_device_inline float bsdf_get_roughness_squared(ccl_private const ShaderClosure *sc)
Definition: bsdf.h:45
CCL_NAMESPACE_BEGIN ccl_device_inline float bsdf_get_specular_roughness_squared(ccl_private const ShaderClosure *sc)
Definition: bsdf.h:31
ccl_device_inline float shift_cos_in(float cos_in, const float frequency_multiplier)
Definition: bsdf.h:89
ccl_device_inline float bump_shadowing_term(float3 Ng, float3 N, float3 I)
Definition: bsdf.h:70
ccl_device void bsdf_blur(KernelGlobals kg, ccl_private ShaderClosure *sc, float roughness)
Definition: bsdf.h:650
ccl_device float3 bsdf_eval(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private const ShaderClosure *sc, const float3 omega_in, const bool is_transmission, ccl_private float *pdf)
Definition: bsdf.h:462
ccl_device void bsdf_ashikhmin_shirley_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device float3 bsdf_ashikhmin_shirley_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device_forceinline float3 bsdf_ashikhmin_shirley_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_ashikhmin_shirley_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device int bsdf_ashikhmin_velvet_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_ashikhmin_velvet_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_ashikhmin_velvet_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_translucent_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_diffuse.h:102
ccl_device float3 bsdf_diffuse_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_diffuse.h:29
ccl_device float3 bsdf_translucent_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_diffuse.h:93
ccl_device float3 bsdf_diffuse_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_diffuse.h:42
ccl_device int bsdf_diffuse_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
Definition: bsdf_diffuse.h:51
ccl_device int bsdf_translucent_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
Definition: bsdf_diffuse.h:115
ccl_device int bsdf_hair_transmission_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
Definition: bsdf_hair.h:212
ccl_device float3 bsdf_hair_transmission_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_hair.h:87
ccl_device float3 bsdf_hair_reflection_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_hair.h:96
ccl_device float3 bsdf_hair_transmission_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_hair.h:105
ccl_device int bsdf_hair_reflection_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
Definition: bsdf_hair.h:151
ccl_device float3 bsdf_hair_reflection_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_hair.h:40
ccl_device void bsdf_principled_hair_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device int bsdf_principled_hair_sample(KernelGlobals kg, ccl_private const ShaderClosure *sc, ccl_private ShaderData *sd, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_principled_hair_eval(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private const ShaderClosure *sc, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_microfacet_ggx_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device void bsdf_microfacet_ggx_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals kg, ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals kg, ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_microfacet_beckmann_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_microfacet_ggx_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device void bsdf_microfacet_beckmann_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device float3 bsdf_microfacet_multi_ggx_glass_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf, ccl_private uint *lcg_state)
ccl_device void bsdf_microfacet_multi_ggx_blur(ccl_private ShaderClosure *sc, float roughness)
ccl_device float3 bsdf_microfacet_multi_ggx_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf, ccl_private uint *lcg_state)
ccl_device float3 bsdf_microfacet_multi_ggx_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf, ccl_private uint *lcg_state)
ccl_device float3 bsdf_microfacet_multi_ggx_glass_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf, ccl_private uint *lcg_state)
ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals kg, ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf, ccl_private uint *lcg_state)
ccl_device int bsdf_microfacet_multi_ggx_sample(KernelGlobals kg, ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf, ccl_private uint *lcg_state)
ccl_device float3 bsdf_oren_nayar_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_oren_nayar_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_oren_nayar_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_principled_diffuse_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_principled_diffuse_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_principled_diffuse_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_principled_sheen_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_principled_sheen_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_principled_sheen_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_reflection_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_reflection_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_reflection_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_refraction_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_refraction_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
ccl_device float3 bsdf_refraction_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_glossy_toon_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
Definition: bsdf_toon.h:175
ccl_device int bsdf_diffuse_toon_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
Definition: bsdf_toon.h:83
ccl_device float3 bsdf_diffuse_toon_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_toon.h:74
ccl_device float3 bsdf_glossy_toon_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_toon.h:166
ccl_device float3 bsdf_glossy_toon_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_toon.h:138
ccl_device float3 bsdf_diffuse_toon_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
Definition: bsdf_toon.h:52
ccl_device float3 bsdf_transparent_eval_reflect(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device float3 bsdf_transparent_eval_transmit(ccl_private const ShaderClosure *sc, const float3 I, const float3 omega_in, ccl_private float *pdf)
ccl_device int bsdf_transparent_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, ccl_private float3 *eval, ccl_private float3 *omega_in, ccl_private float3 *domega_in_dx, ccl_private float3 *domega_in_dy, ccl_private float *pdf)
SIMD_FORCE_INLINE btScalar angle(const btVector3 &v) const
Return the angle between this and another vector.
Definition: btVector3.h:356
#define kernel_assert(cond)
Definition: cpu/compat.h:34
#define cosf(x)
Definition: cuda/compat.h:101
#define ccl_device
Definition: cuda/compat.h:32
#define ccl_private
Definition: cuda/compat.h:48
#define ccl_device_inline
Definition: cuda/compat.h:34
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
const char * label
#define kernel_data
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define CLOSURE_IS_BSDF_MICROFACET(type)
#define CLOSURE_IS_BSDF_SINGULAR(type)
#define CLOSURE_IS_BSDF_DIFFUSE(type)
@ CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID
@ CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID
@ CLOSURE_BSDF_PHONG_RAMP_ID
@ CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID
@ CLOSURE_BSDF_DIFFUSE_RAMP_ID
@ CLOSURE_BSDF_HAIR_PRINCIPLED_ID
@ CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID
@ CLOSURE_BSDF_DIFFUSE_ID
@ CLOSURE_BSDF_TRANSPARENT_ID
@ CLOSURE_BSDF_DIFFUSE_TOON_ID
@ CLOSURE_BSDF_MICROFACET_GGX_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_ID
@ CLOSURE_BSDF_PRINCIPLED_SHEEN_ID
@ CLOSURE_BSDF_HAIR_TRANSMISSION_ID
@ CLOSURE_BSDF_REFRACTION_ID
@ CLOSURE_BSDF_MICROFACET_BECKMANN_ID
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID
@ CLOSURE_BSDF_OREN_NAYAR_ID
@ CLOSURE_BSDF_GLOSSY_TOON_ID
@ CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID
@ CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID
@ CLOSURE_BSDF_HAIR_REFLECTION_ID
@ CLOSURE_BSDF_TRANSLUCENT_ID
@ CLOSURE_BSDF_REFLECTION_ID
@ CLOSURE_BSDF_ASHIKHMIN_VELVET_ID
@ PRIMITIVE_CURVE
Definition: kernel/types.h:564
ShaderData
Definition: kernel/types.h:925
@ LABEL_TRANSMIT
Definition: kernel/types.h:317
@ LABEL_TRANSMIT_TRANSPARENT
Definition: kernel/types.h:324
@ LABEL_DIFFUSE
Definition: kernel/types.h:319
@ LABEL_NONE
Definition: kernel/types.h:316
ShaderClosure
Definition: kernel/types.h:726
ccl_device float fast_acosf(float x)
Definition: math_fast.h:253
ccl_device_inline bool isequal(const float3 a, const float3 b)
Definition: math_float3.h:524
ccl_device_inline float3 zero_float3()
Definition: math_float3.h:80
#define N
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
T safe_divide(const T &a, const T &b)
static const pxr::TfToken g("g", pxr::TfToken::Immortal)
static const pxr::TfToken roughness("roughness", pxr::TfToken::Immortal)
#define I
#define min(a, b)
Definition: sort.c:35
float z
float y
float x
float max
ccl_device_inline float sqr(float a)
Definition: util/math.h:746