2 * Copyright 2011-2013 Blender Foundation
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * ShaderData, used in four steps:
20 * Setup from incoming ray, sampled position and background.
21 * Execute for surface, volume or displacement.
22 * Evaluate one or more closures.
27 #include "kernel/closure/alloc.h"
28 #include "kernel/closure/bsdf_util.h"
29 #include "kernel/closure/bsdf.h"
30 #include "kernel/closure/emissive.h"
32 #include "kernel/svm/svm.h"
36 /* ShaderData setup from incoming ray */
38 #ifdef __OBJECT_MOTION__
39 ccl_device void shader_setup_object_transforms(KernelGlobals *kg, ShaderData *sd, float time)
41 if(sd->object_flag & SD_OBJECT_MOTION) {
42 sd->ob_tfm = object_fetch_transform_motion(kg, sd->object, time);
43 sd->ob_itfm = transform_quick_inverse(sd->ob_tfm);
46 sd->ob_tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
47 sd->ob_itfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
52 ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg,
54 const Intersection *isect,
58 sd->object = (isect->object == PRIM_NONE)? kernel_tex_fetch(__prim_object, isect->prim): isect->object;
62 sd->type = isect->type;
64 sd->object_flag = kernel_tex_fetch(__object_flag,
67 /* matrices and time */
68 #ifdef __OBJECT_MOTION__
69 shader_setup_object_transforms(kg, sd, ray->time);
73 sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
74 sd->ray_length = isect->t;
82 if(sd->type & PRIMITIVE_ALL_CURVE) {
84 float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
86 sd->shader = __float_as_int(curvedata.z);
87 sd->P = curve_refine(kg, sd, isect, ray);
91 if(sd->type & PRIMITIVE_TRIANGLE) {
93 float3 Ng = triangle_normal(kg, sd);
94 sd->shader = kernel_tex_fetch(__tri_shader, sd->prim);
97 sd->P = triangle_refine(kg, sd, isect, ray);
102 if(sd->shader & SHADER_SMOOTH_NORMAL)
103 sd->N = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, sd->v);
107 triangle_dPdudv(kg, sd->prim, &sd->dPdu, &sd->dPdv);
111 /* motion triangle */
112 motion_triangle_shader_setup(kg, sd, isect, ray, false);
117 sd->flag |= kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).flags;
119 #ifdef __INSTANCING__
120 if(isect->object != OBJECT_NONE) {
121 /* instance transform */
122 object_normal_transform_auto(kg, sd, &sd->N);
123 object_normal_transform_auto(kg, sd, &sd->Ng);
125 object_dir_transform_auto(kg, sd, &sd->dPdu);
126 object_dir_transform_auto(kg, sd, &sd->dPdv);
131 /* backfacing test */
132 bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
135 sd->flag |= SD_BACKFACING;
139 sd->dPdu = -sd->dPdu;
140 sd->dPdv = -sd->dPdv;
144 #ifdef __RAY_DIFFERENTIALS__
146 differential_transfer(&sd->dP, ray->dP, ray->D, ray->dD, sd->Ng, isect->t);
147 differential_incoming(&sd->dI, ray->dD);
148 differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
152 /* ShaderData setup from BSSRDF scatter */
154 #ifdef __SUBSURFACE__
155 # ifndef __KERNEL_CUDA__
160 void shader_setup_from_subsurface(
163 const Intersection *isect,
166 const bool backfacing = sd->flag & SD_BACKFACING;
168 /* object, matrices, time, ray_length stay the same */
170 sd->object_flag = kernel_tex_fetch(__object_flag, sd->object);
171 sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
172 sd->type = isect->type;
179 /* fetch triangle data */
180 if(sd->type == PRIMITIVE_TRIANGLE) {
181 float3 Ng = triangle_normal(kg, sd);
182 sd->shader = kernel_tex_fetch(__tri_shader, sd->prim);
184 /* static triangle */
185 sd->P = triangle_refine_local(kg, sd, isect, ray);
189 if(sd->shader & SHADER_SMOOTH_NORMAL)
190 sd->N = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, sd->v);
194 triangle_dPdudv(kg, sd->prim, &sd->dPdu, &sd->dPdv);
198 /* motion triangle */
199 motion_triangle_shader_setup(kg, sd, isect, ray, true);
202 sd->flag |= kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).flags;
204 # ifdef __INSTANCING__
205 if(isect->object != OBJECT_NONE) {
206 /* instance transform */
207 object_normal_transform_auto(kg, sd, &sd->N);
208 object_normal_transform_auto(kg, sd, &sd->Ng);
210 object_dir_transform_auto(kg, sd, &sd->dPdu);
211 object_dir_transform_auto(kg, sd, &sd->dPdv);
216 /* backfacing test */
218 sd->flag |= SD_BACKFACING;
222 sd->dPdu = -sd->dPdu;
223 sd->dPdv = -sd->dPdv;
227 /* should not get used in principle as the shading will only use a diffuse
228 * BSDF, but the shader might still access it */
231 # ifdef __RAY_DIFFERENTIALS__
233 differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
234 /* don't modify dP and dI */
239 /* ShaderData setup from position sampled on mesh */
241 ccl_device_inline void shader_setup_from_sample(KernelGlobals *kg,
246 int shader, int object, int prim,
247 float u, float v, float t,
258 if(prim != PRIM_NONE)
259 sd->type = PRIMITIVE_TRIANGLE;
260 else if(lamp != LAMP_NONE)
261 sd->type = PRIMITIVE_LAMP;
263 sd->type = PRIMITIVE_NONE;
266 #ifdef __INSTANCING__
269 sd->lamp = LAMP_NONE;
270 /* currently no access to bvh prim index for strand sd->prim*/
279 sd->flag = kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).flags;
281 if(sd->object != OBJECT_NONE) {
282 sd->object_flag |= kernel_tex_fetch(__object_flag,
285 #ifdef __OBJECT_MOTION__
286 shader_setup_object_transforms(kg, sd, time);
288 else if(lamp != LAMP_NONE) {
289 sd->ob_tfm = lamp_fetch_transform(kg, lamp, false);
290 sd->ob_itfm = lamp_fetch_transform(kg, lamp, true);
295 /* transform into world space */
297 object_position_transform_auto(kg, sd, &sd->P);
298 object_normal_transform_auto(kg, sd, &sd->Ng);
300 object_dir_transform_auto(kg, sd, &sd->I);
303 if(sd->type & PRIMITIVE_TRIANGLE) {
305 if(sd->shader & SHADER_SMOOTH_NORMAL) {
306 sd->N = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, sd->v);
308 #ifdef __INSTANCING__
309 if(!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
310 object_normal_transform_auto(kg, sd, &sd->N);
317 triangle_dPdudv(kg, sd->prim, &sd->dPdu, &sd->dPdv);
319 # ifdef __INSTANCING__
320 if(!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
321 object_dir_transform_auto(kg, sd, &sd->dPdu);
322 object_dir_transform_auto(kg, sd, &sd->dPdv);
329 sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
330 sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
334 /* backfacing test */
335 if(sd->prim != PRIM_NONE) {
336 bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
339 sd->flag |= SD_BACKFACING;
343 sd->dPdu = -sd->dPdu;
344 sd->dPdv = -sd->dPdv;
349 #ifdef __RAY_DIFFERENTIALS__
350 /* no ray differentials here yet */
351 sd->dP = differential3_zero();
352 sd->dI = differential3_zero();
353 sd->du = differential_zero();
354 sd->dv = differential_zero();
358 /* ShaderData setup for displacement */
360 ccl_device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
361 int object, int prim, float u, float v)
363 float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f);
366 triangle_point_normal(kg, object, prim, u, v, &P, &Ng, &shader);
368 /* force smooth shading for displacement */
369 shader |= SHADER_SMOOTH_NORMAL;
371 shader_setup_from_sample(kg, sd,
373 shader, object, prim,
375 !(kernel_tex_fetch(__object_flag, object) & SD_OBJECT_TRANSFORM_APPLIED),
379 /* ShaderData setup from ray into background */
381 ccl_device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray)
388 sd->shader = kernel_data.background.surface_shader;
389 sd->flag = kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).flags;
391 sd->time = ray->time;
392 sd->ray_length = 0.0f;
394 #ifdef __INSTANCING__
395 sd->object = PRIM_NONE;
397 sd->lamp = LAMP_NONE;
398 sd->prim = PRIM_NONE;
406 sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
407 sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
410 #ifdef __RAY_DIFFERENTIALS__
413 differential_incoming(&sd->dI, sd->dP);
414 sd->du = differential_zero();
415 sd->dv = differential_zero();
419 /* ShaderData setup from point inside volume */
422 ccl_device_inline void shader_setup_from_volume(KernelGlobals *kg, ShaderData *sd, const Ray *ray)
429 sd->shader = SHADER_NONE;
432 sd->time = ray->time;
433 sd->ray_length = 0.0f; /* todo: can we set this to some useful value? */
435 # ifdef __INSTANCING__
436 sd->object = PRIM_NONE; /* todo: fill this for texture coordinates */
438 sd->lamp = LAMP_NONE;
439 sd->prim = PRIM_NONE;
440 sd->type = PRIMITIVE_NONE;
449 sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
450 sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
453 # ifdef __RAY_DIFFERENTIALS__
456 differential_incoming(&sd->dI, sd->dP);
457 sd->du = differential_zero();
458 sd->dv = differential_zero();
461 /* for NDC coordinates */
463 sd->ray_dP = ray->dP;
465 #endif /* __VOLUME__ */
469 #if defined(__BRANCHED_PATH__) || defined(__VOLUME__)
470 ccl_device_inline void shader_merge_closures(ShaderData *sd)
472 /* merge identical closures, better when we sample a single closure at a time */
473 for(int i = 0; i < sd->num_closure; i++) {
474 ShaderClosure *sci = &sd->closure[i];
476 for(int j = i + 1; j < sd->num_closure; j++) {
477 ShaderClosure *scj = &sd->closure[j];
479 if(sci->type != scj->type)
481 if(!bsdf_merge(sci, scj))
484 sci->weight += scj->weight;
485 sci->sample_weight += scj->sample_weight;
487 int size = sd->num_closure - (j+1);
489 for(int k = 0; k < size; k++) {
495 kernel_assert(sd->num_closure >= 0);
500 #endif /* __BRANCHED_PATH__ || __VOLUME__ */
502 /* Defensive sampling. */
504 ccl_device_inline void shader_prepare_closures(ShaderData *sd,
505 ccl_addr_space PathState *state)
507 /* We can likely also do defensive sampling at deeper bounces, particularly
508 * for cases like a perfect mirror but possibly also others. This will need
509 * a good heuristic. */
510 if(state->bounce + state->transparent_bounce == 0 && sd->num_closure > 1) {
513 for(int i = 0; i < sd->num_closure; i++) {
514 ShaderClosure *sc = &sd->closure[i];
515 if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
516 sum += sc->sample_weight;
520 for(int i = 0; i < sd->num_closure; i++) {
521 ShaderClosure *sc = &sd->closure[i];
522 if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
523 sc->sample_weight = max(sc->sample_weight, 0.125f * sum);
532 ccl_device_inline void _shader_bsdf_multi_eval(KernelGlobals *kg, ShaderData *sd, const float3 omega_in, float *pdf,
533 const ShaderClosure *skip_sc, BsdfEval *result_eval, float sum_pdf, float sum_sample_weight)
535 /* this is the veach one-sample model with balance heuristic, some pdf
536 * factors drop out when using balance heuristic weighting */
537 for(int i = 0; i < sd->num_closure; i++) {
538 const ShaderClosure *sc = &sd->closure[i];
540 if(sc != skip_sc && CLOSURE_IS_BSDF(sc->type)) {
541 float bsdf_pdf = 0.0f;
542 float3 eval = bsdf_eval(kg, sd, sc, omega_in, &bsdf_pdf);
544 if(bsdf_pdf != 0.0f) {
545 bsdf_eval_accum(result_eval, sc->type, eval*sc->weight, 1.0f);
546 sum_pdf += bsdf_pdf*sc->sample_weight;
549 sum_sample_weight += sc->sample_weight;
553 *pdf = (sum_sample_weight > 0.0f)? sum_pdf/sum_sample_weight: 0.0f;
556 #ifdef __BRANCHED_PATH__
557 ccl_device_inline void _shader_bsdf_multi_eval_branched(KernelGlobals *kg,
559 const float3 omega_in,
560 BsdfEval *result_eval,
564 for(int i = 0; i < sd->num_closure; i++) {
565 const ShaderClosure *sc = &sd->closure[i];
566 if(CLOSURE_IS_BSDF(sc->type)) {
567 float bsdf_pdf = 0.0f;
568 float3 eval = bsdf_eval(kg, sd, sc, omega_in, &bsdf_pdf);
569 if(bsdf_pdf != 0.0f) {
570 float mis_weight = use_mis? power_heuristic(light_pdf, bsdf_pdf): 1.0f;
571 bsdf_eval_accum(result_eval,
579 #endif /* __BRANCHED_PATH__ */
582 #ifndef __KERNEL_CUDA__
587 void shader_bsdf_eval(KernelGlobals *kg,
589 const float3 omega_in,
594 bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
596 #ifdef __BRANCHED_PATH__
597 if(kernel_data.integrator.branched)
598 _shader_bsdf_multi_eval_branched(kg, sd, omega_in, eval, light_pdf, use_mis);
603 _shader_bsdf_multi_eval(kg, sd, omega_in, &pdf, NULL, eval, 0.0f, 0.0f);
605 float weight = power_heuristic(light_pdf, pdf);
606 bsdf_eval_mis(eval, weight);
611 ccl_device_inline const ShaderClosure *shader_bsdf_pick(ShaderData *sd,
614 /* Note the sampling here must match shader_bssrdf_pick,
615 * since we reuse the same random number. */
618 if(sd->num_closure > 1) {
619 /* Pick a BSDF or based on sample weights. */
622 for(int i = 0; i < sd->num_closure; i++) {
623 const ShaderClosure *sc = &sd->closure[i];
625 if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
626 sum += sc->sample_weight;
630 float r = (*randu)*sum;
631 float partial_sum = 0.0f;
633 for(int i = 0; i < sd->num_closure; i++) {
634 const ShaderClosure *sc = &sd->closure[i];
636 if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
637 float next_sum = partial_sum + sc->sample_weight;
642 /* Rescale to reuse for direction sample, to better
643 * preserve stratifaction. */
644 *randu = (r - partial_sum) / sc->sample_weight;
648 partial_sum = next_sum;
653 const ShaderClosure *sc = &sd->closure[sampled];
654 return CLOSURE_IS_BSDF(sc->type)? sc: NULL;
657 ccl_device_inline const ShaderClosure *shader_bssrdf_pick(ShaderData *sd,
658 ccl_addr_space float3 *throughput,
661 /* Note the sampling here must match shader_bsdf_pick,
662 * since we reuse the same random number. */
665 if(sd->num_closure > 1) {
666 /* Pick a BSDF or BSSRDF or based on sample weights. */
667 float sum_bsdf = 0.0f;
668 float sum_bssrdf = 0.0f;
670 for(int i = 0; i < sd->num_closure; i++) {
671 const ShaderClosure *sc = &sd->closure[i];
673 if(CLOSURE_IS_BSDF(sc->type)) {
674 sum_bsdf += sc->sample_weight;
676 else if(CLOSURE_IS_BSSRDF(sc->type)) {
677 sum_bssrdf += sc->sample_weight;
681 float r = (*randu)*(sum_bsdf + sum_bssrdf);
682 float partial_sum = 0.0f;
684 for(int i = 0; i < sd->num_closure; i++) {
685 const ShaderClosure *sc = &sd->closure[i];
687 if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
688 float next_sum = partial_sum + sc->sample_weight;
691 if(CLOSURE_IS_BSDF(sc->type)) {
692 *throughput *= (sum_bsdf + sum_bssrdf) / sum_bsdf;
696 *throughput *= (sum_bsdf + sum_bssrdf) / sum_bssrdf;
699 /* Rescale to reuse for direction sample, to better
700 * preserve stratifaction. */
701 *randu = (r - partial_sum) / sc->sample_weight;
706 partial_sum = next_sum;
711 const ShaderClosure *sc = &sd->closure[sampled];
712 return CLOSURE_IS_BSSRDF(sc->type)? sc: NULL;
715 ccl_device_inline int shader_bsdf_sample(KernelGlobals *kg,
717 float randu, float randv,
720 differential3 *domega_in,
723 const ShaderClosure *sc = shader_bsdf_pick(sd, &randu);
729 /* BSSRDF should already have been handled elsewhere. */
730 kernel_assert(CLOSURE_IS_BSDF(sc->type));
736 label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
739 bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
741 if(sd->num_closure > 1) {
742 float sweight = sc->sample_weight;
743 _shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sc, bsdf_eval, *pdf*sweight, sweight);
750 ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, ShaderData *sd,
751 const ShaderClosure *sc, float randu, float randv, BsdfEval *bsdf_eval,
752 float3 *omega_in, differential3 *domega_in, float *pdf)
758 label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
761 bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
766 ccl_device float shader_bsdf_average_roughness(ShaderData *sd)
768 float roughness = 0.0f;
769 float sum_weight = 0.0f;
771 for(int i = 0; i < sd->num_closure; i++) {
772 ShaderClosure *sc = &sd->closure[i];
774 if(CLOSURE_IS_BSDF(sc->type)) {
775 /* sqrt once to undo the squaring from multiplying roughness on the
776 * two axes, and once for the squared roughness convention. */
777 float weight = fabsf(average(sc->weight));
778 roughness += weight * sqrtf(safe_sqrtf(bsdf_get_roughness_squared(sc)));
779 sum_weight += weight;
783 return (sum_weight > 0.0f) ? roughness / sum_weight : 0.0f;
786 ccl_device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughness)
788 for(int i = 0; i < sd->num_closure; i++) {
789 ShaderClosure *sc = &sd->closure[i];
791 if(CLOSURE_IS_BSDF(sc->type))
792 bsdf_blur(kg, sc, roughness);
796 ccl_device float3 shader_bsdf_transparency(KernelGlobals *kg, const ShaderData *sd)
798 if(sd->flag & SD_HAS_ONLY_VOLUME) {
799 return make_float3(1.0f, 1.0f, 1.0f);
801 else if(sd->flag & SD_TRANSPARENT) {
802 return sd->closure_transparent_extinction;
805 return make_float3(0.0f, 0.0f, 0.0f);
809 ccl_device void shader_bsdf_disable_transparency(KernelGlobals *kg, ShaderData *sd)
811 if(sd->flag & SD_TRANSPARENT) {
812 for(int i = 0; i < sd->num_closure; i++) {
813 ShaderClosure *sc = &sd->closure[i];
815 if(sc->type == CLOSURE_BSDF_TRANSPARENT_ID) {
816 sc->sample_weight = 0.0f;
817 sc->weight = make_float3(0.0f, 0.0f, 0.0f);
821 sd->flag &= ~SD_TRANSPARENT;
825 ccl_device float3 shader_bsdf_alpha(KernelGlobals *kg, ShaderData *sd)
827 float3 alpha = make_float3(1.0f, 1.0f, 1.0f) - shader_bsdf_transparency(kg, sd);
829 alpha = max(alpha, make_float3(0.0f, 0.0f, 0.0f));
830 alpha = min(alpha, make_float3(1.0f, 1.0f, 1.0f));
835 ccl_device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd)
837 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
839 for(int i = 0; i < sd->num_closure; i++) {
840 ShaderClosure *sc = &sd->closure[i];
842 if(CLOSURE_IS_BSDF_DIFFUSE(sc->type))
849 ccl_device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd)
851 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
853 for(int i = 0; i < sd->num_closure; i++) {
854 ShaderClosure *sc = &sd->closure[i];
856 if(CLOSURE_IS_BSDF_GLOSSY(sc->type))
863 ccl_device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd)
865 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
867 for(int i = 0; i < sd->num_closure; i++) {
868 ShaderClosure *sc = &sd->closure[i];
870 if(CLOSURE_IS_BSDF_TRANSMISSION(sc->type))
877 ccl_device float3 shader_bsdf_subsurface(KernelGlobals *kg, ShaderData *sd)
879 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
881 for(int i = 0; i < sd->num_closure; i++) {
882 ShaderClosure *sc = &sd->closure[i];
884 if(CLOSURE_IS_BSSRDF(sc->type) || CLOSURE_IS_BSDF_BSSRDF(sc->type))
891 ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd)
893 float3 N = make_float3(0.0f, 0.0f, 0.0f);
895 for(int i = 0; i < sd->num_closure; i++) {
896 ShaderClosure *sc = &sd->closure[i];
897 if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type))
898 N += sc->N*fabsf(average(sc->weight));
901 return (is_zero(N))? sd->N : normalize(N);
904 ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_)
906 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
907 float3 N = make_float3(0.0f, 0.0f, 0.0f);
909 for(int i = 0; i < sd->num_closure; i++) {
910 ShaderClosure *sc = &sd->closure[i];
912 if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
913 const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc;
914 eval += sc->weight*ao_factor;
915 N += bsdf->N*fabsf(average(sc->weight));
919 *N_ = (is_zero(N))? sd->N : normalize(N);
923 #ifdef __SUBSURFACE__
924 ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_blur_)
926 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
927 float3 N = make_float3(0.0f, 0.0f, 0.0f);
928 float texture_blur = 0.0f, weight_sum = 0.0f;
930 for(int i = 0; i < sd->num_closure; i++) {
931 ShaderClosure *sc = &sd->closure[i];
933 if(CLOSURE_IS_BSSRDF(sc->type)) {
934 const Bssrdf *bssrdf = (const Bssrdf*)sc;
935 float avg_weight = fabsf(average(sc->weight));
937 N += bssrdf->N*avg_weight;
939 texture_blur += bssrdf->texture_blur*avg_weight;
940 weight_sum += avg_weight;
945 *N_ = (is_zero(N))? sd->N: normalize(N);
948 *texture_blur_ = safe_divide(texture_blur, weight_sum);
952 #endif /* __SUBSURFACE__ */
956 ccl_device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd)
958 if(sd->flag & SD_EMISSION) {
959 return emissive_simple_eval(sd->Ng, sd->I) * sd->closure_emission_background;
962 return make_float3(0.0f, 0.0f, 0.0f);
968 ccl_device float3 shader_holdout_eval(KernelGlobals *kg, ShaderData *sd)
970 float3 weight = make_float3(0.0f, 0.0f, 0.0f);
972 for(int i = 0; i < sd->num_closure; i++) {
973 ShaderClosure *sc = &sd->closure[i];
975 if(CLOSURE_IS_HOLDOUT(sc->type))
976 weight += sc->weight;
982 /* Surface Evaluation */
984 ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
985 ccl_addr_space PathState *state, int path_flag)
987 /* If path is being terminated, we are tracing a shadow ray or evaluating
988 * emission, then we don't need to store closures. The emission and shadow
989 * shader data also do not have a closure array to save GPU memory. */
991 if(path_flag & (PATH_RAY_TERMINATE|PATH_RAY_SHADOW|PATH_RAY_EMISSION)) {
995 max_closures = kernel_data.integrator.max_closures;
999 sd->num_closure_left = max_closures;
1003 OSLShader::eval_surface(kg, sd, state, path_flag);
1008 svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag);
1010 DiffuseBsdf *bsdf = (DiffuseBsdf*)bsdf_alloc(sd,
1011 sizeof(DiffuseBsdf),
1012 make_float3(0.8f, 0.8f, 0.8f));
1015 sd->flag |= bsdf_diffuse_setup(bsdf);
1020 if(sd->flag & SD_BSDF_NEEDS_LCG) {
1021 sd->lcg_state = lcg_state_init_addrspace(state, 0xb4bc3953);
1025 /* Background Evaluation */
1027 ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
1028 ccl_addr_space PathState *state, int path_flag)
1030 sd->num_closure = 0;
1031 sd->num_closure_left = 0;
1036 OSLShader::eval_background(kg, sd, state, path_flag);
1039 # endif /* __OSL__ */
1041 svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag);
1044 if(sd->flag & SD_EMISSION) {
1045 return sd->closure_emission_background;
1048 return make_float3(0.0f, 0.0f, 0.0f);
1051 return make_float3(0.8f, 0.8f, 0.8f);
1052 #endif /* __SVM__ */
1059 ccl_device_inline void _shader_volume_phase_multi_eval(const ShaderData *sd, const float3 omega_in, float *pdf,
1060 int skip_phase, BsdfEval *result_eval, float sum_pdf, float sum_sample_weight)
1062 for(int i = 0; i < sd->num_closure; i++) {
1066 const ShaderClosure *sc = &sd->closure[i];
1068 if(CLOSURE_IS_PHASE(sc->type)) {
1069 float phase_pdf = 0.0f;
1070 float3 eval = volume_phase_eval(sd, sc, omega_in, &phase_pdf);
1072 if(phase_pdf != 0.0f) {
1073 bsdf_eval_accum(result_eval, sc->type, eval, 1.0f);
1074 sum_pdf += phase_pdf*sc->sample_weight;
1077 sum_sample_weight += sc->sample_weight;
1081 *pdf = (sum_sample_weight > 0.0f)? sum_pdf/sum_sample_weight: 0.0f;
1084 ccl_device void shader_volume_phase_eval(KernelGlobals *kg, const ShaderData *sd,
1085 const float3 omega_in, BsdfEval *eval, float *pdf)
1087 bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
1089 _shader_volume_phase_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
1092 ccl_device int shader_volume_phase_sample(KernelGlobals *kg, const ShaderData *sd,
1093 float randu, float randv, BsdfEval *phase_eval,
1094 float3 *omega_in, differential3 *domega_in, float *pdf)
1098 if(sd->num_closure > 1) {
1099 /* pick a phase closure based on sample weights */
1102 for(sampled = 0; sampled < sd->num_closure; sampled++) {
1103 const ShaderClosure *sc = &sd->closure[sampled];
1105 if(CLOSURE_IS_PHASE(sc->type))
1106 sum += sc->sample_weight;
1109 float r = randu*sum;
1110 float partial_sum = 0.0f;
1112 for(sampled = 0; sampled < sd->num_closure; sampled++) {
1113 const ShaderClosure *sc = &sd->closure[sampled];
1115 if(CLOSURE_IS_PHASE(sc->type)) {
1116 float next_sum = partial_sum + sc->sample_weight;
1119 /* Rescale to reuse for BSDF direction sample. */
1120 randu = (r - partial_sum) / sc->sample_weight;
1124 partial_sum = next_sum;
1128 if(sampled == sd->num_closure) {
1134 /* todo: this isn't quite correct, we don't weight anisotropy properly
1135 * depending on color channels, even if this is perhaps not a common case */
1136 const ShaderClosure *sc = &sd->closure[sampled];
1141 label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
1144 bsdf_eval_init(phase_eval, sc->type, eval, kernel_data.film.use_light_pass);
1150 ccl_device int shader_phase_sample_closure(KernelGlobals *kg, const ShaderData *sd,
1151 const ShaderClosure *sc, float randu, float randv, BsdfEval *phase_eval,
1152 float3 *omega_in, differential3 *domega_in, float *pdf)
1158 label = volume_phase_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
1161 bsdf_eval_init(phase_eval, sc->type, eval, kernel_data.film.use_light_pass);
1166 /* Volume Evaluation */
1168 ccl_device_inline void shader_eval_volume(KernelGlobals *kg,
1170 ccl_addr_space PathState *state,
1171 ccl_addr_space VolumeStack *stack,
1174 /* If path is being terminated, we are tracing a shadow ray or evaluating
1175 * emission, then we don't need to store closures. The emission and shadow
1176 * shader data also do not have a closure array to save GPU memory. */
1178 if(path_flag & (PATH_RAY_TERMINATE|PATH_RAY_SHADOW|PATH_RAY_EMISSION)) {
1182 max_closures = kernel_data.integrator.max_closures;
1185 /* reset closures once at the start, we will be accumulating the closures
1186 * for all volumes in the stack into a single array of closures */
1187 sd->num_closure = 0;
1188 sd->num_closure_left = max_closures;
1190 sd->object_flag = 0;
1192 for(int i = 0; stack[i].shader != SHADER_NONE; i++) {
1193 /* setup shaderdata from stack. it's mostly setup already in
1194 * shader_setup_from_volume, this switching should be quick */
1195 sd->object = stack[i].object;
1196 sd->lamp = LAMP_NONE;
1197 sd->shader = stack[i].shader;
1199 sd->flag &= ~SD_SHADER_FLAGS;
1200 sd->flag |= kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).flags;
1201 sd->object_flag &= ~SD_OBJECT_FLAGS;
1203 if(sd->object != OBJECT_NONE) {
1204 sd->object_flag |= kernel_tex_fetch(__object_flag, sd->object);
1206 #ifdef __OBJECT_MOTION__
1207 /* todo: this is inefficient for motion blur, we should be
1208 * caching matrices instead of recomputing them each step */
1209 shader_setup_object_transforms(kg, sd, sd->time);
1213 /* evaluate shader */
1217 OSLShader::eval_volume(kg, sd, state, path_flag);
1222 svm_eval_nodes(kg, sd, state, SHADER_TYPE_VOLUME, path_flag);
1226 /* merge closures to avoid exceeding number of closures limit */
1228 shader_merge_closures(sd);
1232 #endif /* __VOLUME__ */
1234 /* Displacement Evaluation */
1236 ccl_device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, ccl_addr_space PathState *state)
1238 sd->num_closure = 0;
1239 sd->num_closure_left = 0;
1241 /* this will modify sd->P */
1245 OSLShader::eval_displacement(kg, sd, state);
1249 svm_eval_nodes(kg, sd, state, SHADER_TYPE_DISPLACEMENT, 0);
1254 /* Transparent Shadows */
1256 #ifdef __TRANSPARENT_SHADOWS__
1257 ccl_device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect)
1259 int prim = kernel_tex_fetch(__prim_index, isect->prim);
1263 if(kernel_tex_fetch(__prim_type, isect->prim) & PRIMITIVE_ALL_TRIANGLE) {
1265 shader = kernel_tex_fetch(__tri_shader, prim);
1269 float4 str = kernel_tex_fetch(__curves, prim);
1270 shader = __float_as_int(str.z);
1273 int flag = kernel_tex_fetch(__shaders, (shader & SHADER_MASK)).flags;
1275 return (flag & SD_HAS_TRANSPARENT_SHADOW) != 0;
1277 #endif /* __TRANSPARENT_SHADOWS__ */
1279 ccl_device float shader_cryptomatte_id(KernelGlobals *kg, int shader)
1281 return kernel_tex_fetch(__shaders, (shader & SHADER_MASK)).cryptomatte_id;