31
#include "osl_shader.h"
36
#include "svm/emissive.h"
37
#include "svm/volume.h"
38
#include "svm/svm_bsdf.h"
29
#include "closure/bsdf_util.h"
30
#include "closure/bsdf.h"
31
#include "closure/emissive.h"
32
#include "closure/volume.h"
39
34
#include "svm/svm.h"
43
36
CCL_NAMESPACE_BEGIN
45
38
/* ShaderData setup from incoming ray */
47
__device_inline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
40
#ifdef __OBJECT_MOTION__
41
__device_noinline void shader_setup_object_transforms(KernelGlobals *kg, ShaderData *sd, float time)
43
/* note that this is a separate non-inlined function to work around crash
44
* on CUDA sm 2.0, otherwise kernel execution crashes (compiler bug?) */
45
if(sd->flag & SD_OBJECT_MOTION) {
46
sd->ob_tfm = object_fetch_transform_motion(kg, sd->object, time);
47
sd->ob_itfm= transform_quick_inverse(sd->ob_tfm);
50
sd->ob_tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
51
sd->ob_itfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
56
__device_noinline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
48
57
const Intersection *isect, const Ray *ray)
50
/* fetch triangle data */
51
int prim = kernel_tex_fetch(__prim_index, isect->prim);
52
float4 Ns = kernel_tex_fetch(__tri_normal, prim);
53
float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
54
int shader = __float_as_int(Ns.w);
57
sd->P = bvh_triangle_refine(kg, isect, ray);
60
sd->object = (isect->object == ~0)? kernel_tex_fetch(__prim_object, isect->prim): isect->object;
63
sd->flag = kernel_tex_fetch(__object_flag, sd->object);
65
/* matrices and time */
66
#ifdef __OBJECT_MOTION__
67
shader_setup_object_transforms(kg, sd, ray->time);
71
sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
72
sd->ray_length = isect->t;
75
if(kernel_tex_fetch(__prim_segment, isect->prim) != ~0) {
76
/* Strand Shader setting*/
77
float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
79
sd->shader = __float_as_int(curvedata.z);
80
sd->segment = isect->segment;
82
float tcorr = isect->t;
83
if(kernel_data.curve_kernel_data.curveflags & CURVE_KN_POSTINTERSECTCORRECTION) {
84
tcorr = (isect->u < 0)? tcorr + sqrtf(isect->v) : tcorr - sqrtf(isect->v);
85
sd->ray_length = tcorr;
88
sd->P = bvh_curve_refine(kg, sd, isect, ray, tcorr);
92
/* fetch triangle data */
93
float4 Ns = kernel_tex_fetch(__tri_normal, sd->prim);
94
float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
95
sd->shader = __float_as_int(Ns.w);
107
sd->P = bvh_triangle_refine(kg, sd, isect, ray);
112
if(sd->shader & SHADER_SMOOTH_NORMAL)
113
sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
117
triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
65
sd->object = isect->object;
74
if(sd->shader & SHADER_SMOOTH_NORMAL)
75
sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
77
sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
81
triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
85
if(sd->object != ~0) {
126
sd->flag |= kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
128
#ifdef __INSTANCING__
129
if(isect->object != ~0) {
86
130
/* instance transform */
87
object_normal_transform(kg, sd->object, &sd->N);
88
object_normal_transform(kg, sd->object, &sd->Ng);
131
object_normal_transform(kg, sd, &sd->N);
132
object_normal_transform(kg, sd, &sd->Ng);
90
object_dir_transform(kg, sd->object, &sd->dPdu);
91
object_dir_transform(kg, sd->object, &sd->dPdv);
134
object_dir_transform(kg, sd, &sd->dPdu);
135
object_dir_transform(kg, sd, &sd->dPdv);
95
/* non-instanced object index */
96
sd->object = kernel_tex_fetch(__prim_object, isect->prim);
203
sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
204
if(sd->object != -1) {
205
sd->flag |= kernel_tex_fetch(__object_flag, sd->object);
207
#ifdef __OBJECT_MOTION__
208
shader_setup_object_transforms(kg, sd, time);
158
216
/* smooth normal */
218
if(sd->shader & SHADER_SMOOTH_NORMAL && sd->segment == ~0) {
219
sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
159
221
if(sd->shader & SHADER_SMOOTH_NORMAL) {
160
222
sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
162
225
#ifdef __INSTANCING__
164
object_normal_transform(kg, sd->object, &sd->N);
227
object_normal_transform(kg, sd, &sd->N);
168
sd->flag = kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2);
234
if(sd->prim == ~0 || sd->segment != ~0) {
235
sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
236
sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
172
239
if(sd->prim == ~0) {
173
240
sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
174
241
sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
177
245
triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
179
247
#ifdef __INSTANCING__
181
object_dir_transform(kg, sd->object, &sd->dPdu);
182
object_dir_transform(kg, sd->object, &sd->dPdv);
249
object_dir_transform(kg, sd, &sd->dPdu);
250
object_dir_transform(kg, sd, &sd->dPdv);
311
384
#ifdef __MULTI_CLOSURE__
312
385
bsdf_eval_init(eval, NBUILTIN_CLOSURES, make_float3(0.0f, 0.0f, 0.0f), kernel_data.film.use_light_pass);
314
return _shader_bsdf_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
387
return _shader_bsdf_multi_eval(kg, sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
316
389
const ShaderClosure *sc = &sd->closure;
319
*eval = svm_bsdf_eval(sd, sc, omega_in, pdf)*sc->weight;
392
*eval = bsdf_eval(kg, sd, sc, omega_in, pdf)*sc->weight;
367
label = OSLShader::bsdf_sample(sd, sc, randu, randv, eval, *omega_in, *domega_in, *pdf);
369
label = svm_bsdf_sample(sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
439
label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
371
441
if(*pdf != 0.0f) {
372
442
bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
374
444
if(sd->num_closure > 1) {
375
445
float sweight = sc->sample_weight;
376
_shader_bsdf_multi_eval(sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight);
446
_shader_bsdf_multi_eval(kg, sd, *omega_in, pdf, sampled, bsdf_eval, *pdf*sweight, sweight);
382
452
/* sample the single closure that we picked */
384
int label = svm_bsdf_sample(sd, &sd->closure, randu, randv, bsdf_eval, omega_in, domega_in, pdf);
454
int label = bsdf_sample(kg, sd, &sd->closure, randu, randv, bsdf_eval, omega_in, domega_in, pdf);
385
455
*bsdf_eval *= sd->closure.weight;
460
__device int shader_bsdf_sample_closure(KernelGlobals *kg, const ShaderData *sd,
461
const ShaderClosure *sc, float randu, float randv, BsdfEval *bsdf_eval,
462
float3 *omega_in, differential3 *domega_in, float *pdf)
468
label = bsdf_sample(kg, sd, sc, randu, randv, &eval, omega_in, domega_in, pdf);
471
bsdf_eval_init(bsdf_eval, sc->type, eval*sc->weight, kernel_data.film.use_light_pass);
390
476
__device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughness)
393
478
#ifdef __MULTI_CLOSURE__
394
479
for(int i = 0; i< sd->num_closure; i++) {
395
480
ShaderClosure *sc = &sd->closure[i];
397
482
if(CLOSURE_IS_BSDF(sc->type))
398
svm_bsdf_blur(sc, roughness);
483
bsdf_blur(kg, sc, roughness);
401
svm_bsdf_blur(&sd->closure, roughness);
486
bsdf_blur(kg, &sd->closure, roughness);
574
__device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N)
576
#ifdef __MULTI_CLOSURE__
577
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
579
*N = make_float3(0.0f, 0.0f, 0.0f);
581
for(int i = 0; i< sd->num_closure; i++) {
582
ShaderClosure *sc = &sd->closure[i];
584
if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
585
eval += sc->weight*ao_factor;
586
*N += sc->N*average(sc->weight);
588
if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type)) {
590
*N += sd->N*average(sc->weight);
603
if(CLOSURE_IS_BSDF_DIFFUSE(sd->closure.type))
604
return sd->closure.weight*ao_factor;
605
else if(CLOSURE_IS_AMBIENT_OCCLUSION(sd->closure.type))
606
return sd->closure.weight;
608
return make_float3(0.0f, 0.0f, 0.0f);
614
__device float3 emissive_eval(KernelGlobals *kg, ShaderData *sd, ShaderClosure *sc)
617
if(kg->osl && sc->prim)
618
return OSLShader::emissive_eval(sd, sc);
621
return emissive_simple_eval(sd->Ng, sd->I);
492
624
__device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd)
539
666
/* Surface Evaluation */
541
668
__device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
542
float randb, int path_flag)
669
float randb, int path_flag, ShaderContext ctx)
545
OSLShader::eval_surface(kg, sd, randb, path_flag);
673
OSLShader::eval_surface(kg, sd, randb, path_flag, ctx);
549
svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
678
svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
551
bsdf_diffuse_setup(sd, &sd->closure);
552
sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
680
bsdf_diffuse_setup(&sd->closure);
681
sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
558
686
/* Background Evaluation */
560
__device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag)
688
__device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag, ShaderContext ctx)
563
return OSLShader::eval_background(kg, sd, path_flag);
692
return OSLShader::eval_background(kg, sd, path_flag, ctx);
567
svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag);
698
svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag);
569
700
#ifdef __MULTI_CLOSURE__
570
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
572
for(int i = 0; i< sd->num_closure; i++) {
573
const ShaderClosure *sc = &sd->closure[i];
575
if(CLOSURE_IS_BACKGROUND(sc->type))
701
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
703
for(int i = 0; i< sd->num_closure; i++) {
704
const ShaderClosure *sc = &sd->closure[i];
706
if(CLOSURE_IS_BACKGROUND(sc->type))
712
if(sd->closure.type == CLOSURE_BACKGROUND_ID)
713
return sd->closure.weight;
715
return make_float3(0.0f, 0.0f, 0.0f);
719
return make_float3(0.8f, 0.8f, 0.8f);
581
if(sd->closure.type == CLOSURE_BACKGROUND_ID)
582
return sd->closure.weight;
584
return make_float3(0.0f, 0.0f, 0.0f);
588
return make_float3(0.8f, 0.8f, 0.8f);
602
732
for(int i = 0; i< sd->num_closure; i++) {
603
733
const ShaderClosure *sc = &sd->closure[i];
605
if(CLOSURE_IS_VOLUME(sc->type)) {
607
eval += OSLShader::volume_eval_phase(sd, omega_in, omega_out);
609
eval += volume_eval_phase(sd, sc, omega_in, omega_out);
735
if(CLOSURE_IS_VOLUME(sc->type))
736
eval += volume_eval_phase(kg, sc, omega_in, omega_out);
616
return volume_eval_phase(sd, &sd->closure, omega_in, omega_out);
741
return volume_eval_phase(kg, &sd->closure, omega_in, omega_out);
620
745
/* Volume Evaluation */
622
747
__device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd,
623
float randb, int path_flag)
748
float randb, int path_flag, ShaderContext ctx)
627
OSLShader::eval_volume(kg, sd, randb, path_flag);
629
svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
753
OSLShader::eval_volume(kg, sd, randb, path_flag, ctx);
756
svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
634
760
/* Displacement Evaluation */
636
__device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd)
762
__device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, ShaderContext ctx)
638
764
/* this will modify sd->P */
641
OSLShader::eval_displacement(kg, sd);
643
svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0.0f, 0);
768
OSLShader::eval_displacement(kg, sd, ctx);
771
svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0.0f, 0);
651
778
__device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect)
653
780
int prim = kernel_tex_fetch(__prim_index, isect->prim);
654
float4 Ns = kernel_tex_fetch(__tri_normal, prim);
655
int shader = __float_as_int(Ns.w);
784
if(kernel_tex_fetch(__prim_segment, isect->prim) == ~0) {
786
float4 Ns = kernel_tex_fetch(__tri_normal, prim);
787
shader = __float_as_int(Ns.w);
791
float4 str = kernel_tex_fetch(__curves, prim);
792
shader = __float_as_int(str.z);
656
795
int flag = kernel_tex_fetch(__shader_flag, (shader & SHADER_MASK)*2);
658
797
return (flag & SD_HAS_SURFACE_TRANSPARENT) != 0;
662
__device int shader_pass_id(KernelGlobals *kg, ShaderData *sd)
803
#ifdef __NON_PROGRESSIVE__
804
__device void shader_merge_closures(KernelGlobals *kg, ShaderData *sd)
664
return kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*2 + 1);
806
/* merge identical closures, better when we sample a single closure at a time */
807
for(int i = 0; i < sd->num_closure; i++) {
808
ShaderClosure *sci = &sd->closure[i];
810
for(int j = i + 1; j < sd->num_closure; j++) {
811
ShaderClosure *scj = &sd->closure[j];
814
if(!sci->prim && sci->type == scj->type && sci->data0 == scj->data0 && sci->data1 == scj->data1) {
816
if(sci->type == scj->type && sci->data0 == scj->data0 && sci->data1 == scj->data1) {
818
sci->weight += scj->weight;
819
sci->sample_weight += scj->sample_weight;
821
int size = sd->num_closure - (j+1);
823
memmove(scj, scj+1, size*sizeof(ShaderClosure));
667
832
/* Free ShaderData */
669
834
__device void shader_release(KernelGlobals *kg, ShaderData *sd)
672
OSLShader::release(kg, sd);
836
/* nothing to do currently */
676
839
CCL_NAMESPACE_END