2 * Copyright 2011, Blender Foundation.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * ShaderData, used in four steps:
22 * Setup from incoming ray, sampled position and background.
23 * Execute for surface, volume or displacement.
24 * Evaluate one or more closures.
29 #include "closure/bsdf_util.h"
30 #include "closure/bsdf.h"
31 #include "closure/emissive.h"
32 #include "closure/volume.h"
38 /* ShaderData setup from incoming ray */
40 #ifdef __OBJECT_MOTION__
41 #if defined(__KERNEL_CUDA_VERSION__) && __KERNEL_CUDA_VERSION__ <= 42
46 void shader_setup_object_transforms(KernelGlobals *kg, ShaderData *sd, float time)
48 /* note that this is a separate non-inlined function to work around crash
49 * on CUDA sm 2.0, otherwise kernel execution crashes (compiler bug?) */
50 if(sd->flag & SD_OBJECT_MOTION) {
51 sd->ob_tfm = object_fetch_transform_motion(kg, sd->object, time);
52 sd->ob_itfm= transform_quick_inverse(sd->ob_tfm);
55 sd->ob_tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
56 sd->ob_itfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
61 #if defined(__KERNEL_CUDA_VERSION__) && __KERNEL_CUDA_VERSION__ <= 42
66 void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
67 const Intersection *isect, const Ray *ray, int bounce)
70 sd->object = (isect->object == ~0)? kernel_tex_fetch(__prim_object, isect->prim): isect->object;
73 sd->flag = kernel_tex_fetch(__object_flag, sd->object);
75 /* matrices and time */
76 #ifdef __OBJECT_MOTION__
77 shader_setup_object_transforms(kg, sd, ray->time);
81 sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
82 sd->ray_length = isect->t;
83 sd->ray_depth = bounce;
86 if(kernel_tex_fetch(__prim_segment, isect->prim) != ~0) {
87 /* Strand Shader setting*/
88 float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
90 sd->shader = __float_as_int(curvedata.z);
91 sd->segment = isect->segment;
93 float tcorr = isect->t;
94 if(kernel_data.curve.curveflags & CURVE_KN_POSTINTERSECTCORRECTION) {
95 tcorr = (isect->u < 0)? tcorr + sqrtf(isect->v) : tcorr - sqrtf(isect->v);
96 sd->ray_length = tcorr;
99 sd->P = bvh_curve_refine(kg, sd, isect, ray, tcorr);
103 /* fetch triangle data */
104 float4 Ns = kernel_tex_fetch(__tri_normal, sd->prim);
105 float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
106 sd->shader = __float_as_int(Ns.w);
110 /*elements for minimum hair width using transparency bsdf*/
111 /*sd->curve_transparency = 0.0f;*/
112 /*sd->curve_radius = 0.0f;*/
121 sd->P = bvh_triangle_refine(kg, sd, isect, ray);
126 if(sd->shader & SHADER_SMOOTH_NORMAL)
127 sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
131 triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
140 sd->flag |= kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
142 #ifdef __INSTANCING__
143 if(isect->object != ~0) {
144 /* instance transform */
145 object_normal_transform(kg, sd, &sd->N);
146 object_normal_transform(kg, sd, &sd->Ng);
148 object_dir_transform(kg, sd, &sd->dPdu);
149 object_dir_transform(kg, sd, &sd->dPdv);
154 /* backfacing test */
155 bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
158 sd->flag |= SD_BACKFACING;
162 sd->dPdu = -sd->dPdu;
163 sd->dPdv = -sd->dPdv;
167 #ifdef __RAY_DIFFERENTIALS__
169 differential_transfer(&sd->dP, ray->dP, ray->D, ray->dD, sd->Ng, isect->t);
170 differential_incoming(&sd->dI, ray->dD);
171 differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
175 /* ShaderData setup from BSSRDF scatter */
177 #ifdef __SUBSURFACE__
178 __device_inline void shader_setup_from_subsurface(KernelGlobals *kg, ShaderData *sd,
179 const Intersection *isect, const Ray *ray)
181 bool backfacing = sd->flag & SD_BACKFACING;
183 /* object, matrices, time, ray_length stay the same */
184 sd->flag = kernel_tex_fetch(__object_flag, sd->object);
185 sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
187 /* fetch triangle data */
188 float4 Ns = kernel_tex_fetch(__tri_normal, sd->prim);
189 float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
190 sd->shader = __float_as_int(Ns.w);
202 sd->P = bvh_triangle_refine_subsurface(kg, sd, isect, ray);
207 if(sd->shader & SHADER_SMOOTH_NORMAL)
208 sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
212 triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
215 sd->flag |= kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
217 #ifdef __INSTANCING__
218 if(isect->object != ~0) {
219 /* instance transform */
220 object_normal_transform(kg, sd, &sd->N);
221 object_normal_transform(kg, sd, &sd->Ng);
223 object_dir_transform(kg, sd, &sd->dPdu);
224 object_dir_transform(kg, sd, &sd->dPdv);
229 /* backfacing test */
231 sd->flag |= SD_BACKFACING;
235 sd->dPdu = -sd->dPdu;
236 sd->dPdv = -sd->dPdv;
240 /* should not get used in principle as the shading will only use a diffuse
241 * BSDF, but the shader might still access it */
244 #ifdef __RAY_DIFFERENTIALS__
246 differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
247 /* don't modify dP and dI */
252 /* ShaderData setup from position sampled on mesh */
254 #if defined(__KERNEL_CUDA_VERSION__) && __KERNEL_CUDA_VERSION__ <= 42
259 void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
260 const float3 P, const float3 Ng, const float3 I,
261 int shader, int object, int prim, float u, float v, float t, float time, int bounce, int segment)
270 sd->segment = segment;
274 #ifdef __INSTANCING__
277 /* currently no access to bvh prim index for strand sd->prim - this will cause errors with needs fixing*/
284 sd->ray_depth = bounce;
286 /* detect instancing, for non-instanced the object index is -object-1 */
287 #ifdef __INSTANCING__
288 bool instanced = false;
295 sd->object = ~sd->object;
296 #ifdef __INSTANCING__
300 sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
301 if(sd->object != -1) {
302 sd->flag |= kernel_tex_fetch(__object_flag, sd->object);
304 #ifdef __OBJECT_MOTION__
305 shader_setup_object_transforms(kg, sd, time);
315 if(sd->shader & SHADER_SMOOTH_NORMAL && sd->segment == ~0) {
316 sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
318 if(sd->shader & SHADER_SMOOTH_NORMAL) {
319 sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
322 #ifdef __INSTANCING__
324 object_normal_transform(kg, sd, &sd->N);
331 if(sd->prim == ~0 || sd->segment != ~0) {
332 sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
333 sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
337 sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
338 sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
342 triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
344 #ifdef __INSTANCING__
346 object_dir_transform(kg, sd, &sd->dPdu);
347 object_dir_transform(kg, sd, &sd->dPdv);
353 /* backfacing test */
355 bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
358 sd->flag |= SD_BACKFACING;
362 sd->dPdu = -sd->dPdu;
363 sd->dPdv = -sd->dPdv;
368 #ifdef __RAY_DIFFERENTIALS__
369 /* no ray differentials here yet */
370 sd->dP = differential3_zero();
371 sd->dI = differential3_zero();
372 sd->du = differential_zero();
373 sd->dv = differential_zero();
377 /* ShaderData setup for displacement */
379 __device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
380 int object, int prim, float u, float v)
382 float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f);
385 P = triangle_point_MT(kg, prim, u, v);
386 Ng = triangle_normal_MT(kg, prim, &shader);
388 /* force smooth shading for displacement */
389 shader |= SHADER_SMOOTH_NORMAL;
391 /* watch out: no instance transform currently */
393 shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, 0.0f, TIME_INVALID, 0, ~0);
396 /* ShaderData setup from ray into background */
398 __device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray, int bounce)
405 sd->shader = kernel_data.background.shader;
406 sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
407 #ifdef __OBJECT_MOTION__
408 sd->time = ray->time;
410 sd->ray_length = 0.0f;
411 sd->ray_depth = bounce;
413 #ifdef __INSTANCING__
427 sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
428 sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
431 #ifdef __RAY_DIFFERENTIALS__
434 differential_incoming(&sd->dI, sd->dP);
435 sd->du = differential_zero();
436 sd->dv = differential_zero();
439 /* for NDC coordinates */
441 sd->ray_dP = ray->dP;
446 #ifdef __MULTI_CLOSURE__
448 __device_inline void _shader_bsdf_multi_eval(KernelGlobals *kg, const ShaderData *sd, const float3 omega_in, float *pdf,
449 int skip_bsdf, BsdfEval *result_eval, float sum_pdf, float sum_sample_weight)
451 /* this is the veach one-sample model with balance heuristic, some pdf
452 * factors drop out when using balance heuristic weighting */
453 for(int i = 0; i< sd->num_closure; i++) {
457 const ShaderClosure *sc = &sd->closure[i];
459 if(CLOSURE_IS_BSDF(sc->type)) {
460 float bsdf_pdf = 0.0f;
461 float3 eval = bsdf_eval(kg, sd, sc, omega_in, &bsdf_pdf);
463 if(bsdf_pdf != 0.0f) {
464 bsdf_eval_accum(result_eval, sc->type, eval*sc->weight);
465 sum_pdf += bsdf_pdf*sc->sample_weight;
468 sum_sample_weight += sc->sample_weight;
472 *pdf = (sum_sample_weight > 0.0f)? sum_pdf/sum_sample_weight: 0.0f;
477 __device void shader_bsdf_eval(KernelGlobals *kg, const ShaderData *sd,
478 const float3 omega_in, BsdfEval *eval, float *pdf)
480 #ifdef __MULTI_CLOSURE__
481 bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
483 _shader_bsdf_multi_eval(kg, sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
485 const ShaderClosure *sc = &sd->closure;
488 *eval = bsdf_eval(kg, sd, sc, omega_in, pdf)*sc->weight;
492 __device int shader_bsdf_sample(KernelGlobals *kg, const ShaderData *sd,
493 float randu, float randv, BsdfEval *bsdf_eval,
494 float3 *omega_in, differential3 *domega_in, float *pdf)
496 #ifdef __MULTI_CLOSURE__
499 if(sd->num_closure > 1) {
500 /* pick a BSDF closure based on sample weights */
503 for(sampled = 0; sampled < sd->num_closure; sampled++) {
504 const ShaderClosure *sc = &sd->closure[sampled];
506 if(CLOSURE_IS_BSDF(sc->type))
507 sum += sc->sample_weight;
510 float r = sd->randb_closure*sum;
513 for(sampled = 0; sampled < sd->num_closure; sampled++) {
514 const ShaderClosure *sc = &sd->closure[sampled];
516 if(CLOSURE_IS_BSDF(sc->type)) {
517 sum += sc->sample_weight;
524 if(sampled == sd->num_closure) {
530 const ShaderClosure *sc = &sd->closure[sampled];
535 label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
538 bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
540 if(sd->num_closure > 1) {
541 float sweight = sc->sample_weight;
542 _shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight);
548 /* sample the single closure that we picked */
550 int label = bsdf_sample(kg, sd, &sd->closure, randu, randv, bsdf_eval, omega_in, domega_in, pdf);
551 *bsdf_eval *= sd->closure.weight;
556 __device int shader_bsdf_sample_closure(KernelGlobals *kg, const ShaderData *sd,
557 const ShaderClosure *sc, float randu, float randv, BsdfEval *bsdf_eval,
558 float3 *omega_in, differential3 *domega_in, float *pdf)
564 label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
567 bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
572 __device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughness)
574 #ifdef __MULTI_CLOSURE__
575 for(int i = 0; i< sd->num_closure; i++) {
576 ShaderClosure *sc = &sd->closure[i];
578 if(CLOSURE_IS_BSDF(sc->type))
579 bsdf_blur(kg, sc, roughness);
582 bsdf_blur(kg, &sd->closure, roughness);
586 __device float3 shader_bsdf_transparency(KernelGlobals *kg, ShaderData *sd)
588 #ifdef __MULTI_CLOSURE__
589 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
591 for(int i = 0; i< sd->num_closure; i++) {
592 ShaderClosure *sc = &sd->closure[i];
594 if(sc->type == CLOSURE_BSDF_TRANSPARENT_ID) // todo: make this work for osl
600 if(sd->closure.type == CLOSURE_BSDF_TRANSPARENT_ID)
601 return sd->closure.weight;
603 return make_float3(0.0f, 0.0f, 0.0f);
607 __device float3 shader_bsdf_diffuse(KernelGlobals *kg, ShaderData *sd)
609 #ifdef __MULTI_CLOSURE__
610 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
612 for(int i = 0; i< sd->num_closure; i++) {
613 ShaderClosure *sc = &sd->closure[i];
615 if(CLOSURE_IS_BSDF_DIFFUSE(sc->type))
621 if(CLOSURE_IS_BSDF_DIFFUSE(sd->closure.type))
622 return sd->closure.weight;
624 return make_float3(0.0f, 0.0f, 0.0f);
628 __device float3 shader_bsdf_glossy(KernelGlobals *kg, ShaderData *sd)
630 #ifdef __MULTI_CLOSURE__
631 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
633 for(int i = 0; i< sd->num_closure; i++) {
634 ShaderClosure *sc = &sd->closure[i];
636 if(CLOSURE_IS_BSDF_GLOSSY(sc->type))
642 if(CLOSURE_IS_BSDF_GLOSSY(sd->closure.type))
643 return sd->closure.weight;
645 return make_float3(0.0f, 0.0f, 0.0f);
649 __device float3 shader_bsdf_transmission(KernelGlobals *kg, ShaderData *sd)
651 #ifdef __MULTI_CLOSURE__
652 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
654 for(int i = 0; i< sd->num_closure; i++) {
655 ShaderClosure *sc = &sd->closure[i];
657 if(CLOSURE_IS_BSDF_TRANSMISSION(sc->type))
663 if(CLOSURE_IS_BSDF_TRANSMISSION(sd->closure.type))
664 return sd->closure.weight;
666 return make_float3(0.0f, 0.0f, 0.0f);
670 __device float3 shader_bsdf_subsurface(KernelGlobals *kg, ShaderData *sd)
672 #ifdef __MULTI_CLOSURE__
673 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
675 for(int i = 0; i< sd->num_closure; i++) {
676 ShaderClosure *sc = &sd->closure[i];
678 if(CLOSURE_IS_BSSRDF(sc->type))
684 if(CLOSURE_IS_BSSRDF(sd->closure.type))
685 return sd->closure.weight;
687 return make_float3(0.0f, 0.0f, 0.0f);
691 __device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_)
693 #ifdef __MULTI_CLOSURE__
694 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
695 float3 N = make_float3(0.0f, 0.0f, 0.0f);
697 for(int i = 0; i< sd->num_closure; i++) {
698 ShaderClosure *sc = &sd->closure[i];
700 if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
701 eval += sc->weight*ao_factor;
702 N += sc->N*average(sc->weight);
704 else if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type)) {
706 N += sd->N*average(sc->weight);
720 if(CLOSURE_IS_BSDF_DIFFUSE(sd->closure.type))
721 return sd->closure.weight*ao_factor;
722 else if(CLOSURE_IS_AMBIENT_OCCLUSION(sd->closure.type))
723 return sd->closure.weight;
725 return make_float3(0.0f, 0.0f, 0.0f);
729 __device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_blur_)
731 #ifdef __MULTI_CLOSURE__
732 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
733 float3 N = make_float3(0.0f, 0.0f, 0.0f);
734 float texture_blur = 0.0f, weight_sum = 0.0f;
736 for(int i = 0; i< sd->num_closure; i++) {
737 ShaderClosure *sc = &sd->closure[i];
739 if(CLOSURE_IS_BSSRDF(sc->type)) {
740 float avg_weight = fabsf(average(sc->weight));
742 N += sc->N*avg_weight;
744 texture_blur += sc->data1*avg_weight;
745 weight_sum += avg_weight;
750 *N_ = (is_zero(N))? sd->N: normalize(N);
753 *texture_blur_ = texture_blur/weight_sum;
757 if(CLOSURE_IS_BSSRDF(sd->closure.type)) {
758 if(N_) *N_ = sd->closure.N;
759 if(texture_blur_) *texture_blur_ = sd->closure.data1;
761 return sd->closure.weight;
765 if(texture_blur_) *texture_blur_ = 0.0f;
767 return make_float3(0.0f, 0.0f, 0.0f);
774 __device float3 emissive_eval(KernelGlobals *kg, ShaderData *sd, ShaderClosure *sc)
777 if(kg->osl && sc->prim)
778 return OSLShader::emissive_eval(sd, sc);
781 return emissive_simple_eval(sd->Ng, sd->I);
784 __device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd)
787 #ifdef __MULTI_CLOSURE__
788 eval = make_float3(0.0f, 0.0f, 0.0f);
790 for(int i = 0; i < sd->num_closure; i++) {
791 ShaderClosure *sc = &sd->closure[i];
793 if(CLOSURE_IS_EMISSION(sc->type))
794 eval += emissive_eval(kg, sd, sc)*sc->weight;
797 eval = emissive_eval(kg, sd, &sd->closure)*sd->closure.weight;
805 __device float3 shader_holdout_eval(KernelGlobals *kg, ShaderData *sd)
807 #ifdef __MULTI_CLOSURE__
808 float3 weight = make_float3(0.0f, 0.0f, 0.0f);
810 for(int i = 0; i < sd->num_closure; i++) {
811 ShaderClosure *sc = &sd->closure[i];
813 if(CLOSURE_IS_HOLDOUT(sc->type))
814 weight += sc->weight;
819 if(sd->closure.type == CLOSURE_HOLDOUT_ID)
820 return make_float3(1.0f, 1.0f, 1.0f);
822 return make_float3(0.0f, 0.0f, 0.0f);
826 /* Surface Evaluation */
828 __device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
829 float randb, int path_flag, ShaderContext ctx)
833 OSLShader::eval_surface(kg, sd, randb, path_flag, ctx);
838 svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
840 sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
841 sd->closure.N = sd->N;
842 sd->flag |= bsdf_diffuse_setup(&sd->closure);
847 /* Background Evaluation */
849 __device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx)
853 return OSLShader::eval_background(kg, sd, path_flag, ctx);
859 svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag);
861 #ifdef __MULTI_CLOSURE__
862 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
864 for(int i = 0; i< sd->num_closure; i++) {
865 const ShaderClosure *sc = &sd->closure[i];
867 if(CLOSURE_IS_BACKGROUND(sc->type))
873 if(sd->closure.type == CLOSURE_BACKGROUND_ID)
874 return sd->closure.weight;
876 return make_float3(0.0f, 0.0f, 0.0f);
880 return make_float3(0.8f, 0.8f, 0.8f);
887 __device float3 shader_volume_eval_phase(KernelGlobals *kg, ShaderData *sd,
888 float3 omega_in, float3 omega_out)
890 #ifdef __MULTI_CLOSURE__
891 float3 eval = make_float3(0.0f, 0.0f, 0.0f);
893 for(int i = 0; i< sd->num_closure; i++) {
894 const ShaderClosure *sc = &sd->closure[i];
896 if(CLOSURE_IS_VOLUME(sc->type))
897 eval += volume_eval_phase(kg, sc, omega_in, omega_out);
902 return volume_eval_phase(kg, &sd->closure, omega_in, omega_out);
906 /* Volume Evaluation */
908 __device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd,
909 float randb, int path_flag, ShaderContext ctx)
914 OSLShader::eval_volume(kg, sd, randb, path_flag, ctx);
917 svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
921 /* Displacement Evaluation */
923 __device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, ShaderContext ctx)
925 /* this will modify sd->P */
929 OSLShader::eval_displacement(kg, sd, ctx);
932 svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0.0f, 0);
936 /* Transparent Shadows */
938 #ifdef __TRANSPARENT_SHADOWS__
939 __device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect)
941 int prim = kernel_tex_fetch(__prim_index, isect->prim);
945 if(kernel_tex_fetch(__prim_segment, isect->prim) == ~0) {
947 float4 Ns = kernel_tex_fetch(__tri_normal, prim);
948 shader = __float_as_int(Ns.w);
952 float4 str = kernel_tex_fetch(__curves, prim);
953 shader = __float_as_int(str.z);
956 int flag = kernel_tex_fetch(__shader_flag, (shader & SHADER_MASK)*2);
958 return (flag & SD_HAS_TRANSPARENT_SHADOW) != 0;
964 #ifdef __NON_PROGRESSIVE__
965 __device void shader_merge_closures(KernelGlobals *kg, ShaderData *sd)
967 /* merge identical closures, better when we sample a single closure at a time */
968 for(int i = 0; i < sd->num_closure; i++) {
969 ShaderClosure *sci = &sd->closure[i];
971 for(int j = i + 1; j < sd->num_closure; j++) {
972 ShaderClosure *scj = &sd->closure[j];
975 if(!sci->prim && !scj->prim && sci->type == scj->type && sci->data0 == scj->data0 && sci->data1 == scj->data1) {
977 if(sci->type == scj->type && sci->data0 == scj->data0 && sci->data1 == scj->data1) {
979 sci->weight += scj->weight;
980 sci->sample_weight += scj->sample_weight;
982 int size = sd->num_closure - (j+1);
984 for(int k = 0; k < size; k++) {