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
21 ccl_device void svm_node_glass_setup(ShaderData *sd, ShaderClosure *sc, int type, float eta, float roughness, bool refract)
23 if(type == CLOSURE_BSDF_SHARP_GLASS_ID) {
27 sd->flag |= bsdf_refraction_setup(sc);
30 sd->flag |= bsdf_reflection_setup(sc);
32 else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID) {
33 sc->data0 = roughness;
37 sd->flag |= bsdf_microfacet_beckmann_refraction_setup(sc);
39 sd->flag |= bsdf_microfacet_beckmann_setup(sc);
42 sc->data0 = roughness;
46 sd->flag |= bsdf_microfacet_ggx_refraction_setup(sc);
48 sd->flag |= bsdf_microfacet_ggx_setup(sc);
52 ccl_device_inline ShaderClosure *svm_node_closure_get_non_bsdf(ShaderData *sd, ClosureType type, float mix_weight)
54 #ifdef __MULTI_CLOSURE__
55 ShaderClosure *sc = &sd->closure[sd->num_closure];
57 if(sd->num_closure < MAX_CLOSURE) {
58 sc->weight *= mix_weight;
73 ccl_device_inline ShaderClosure *svm_node_closure_get_bsdf(ShaderData *sd, float mix_weight)
75 #ifdef __MULTI_CLOSURE__
76 ShaderClosure *sc = &sd->closure[sd->num_closure];
77 float3 weight = sc->weight * mix_weight;
78 float sample_weight = fabsf(average(weight));
80 if(sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure < MAX_CLOSURE) {
82 sc->sample_weight = sample_weight;
96 ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, float randb, int path_flag, int *offset)
98 uint type, param1_offset, param2_offset;
100 #ifdef __MULTI_CLOSURE__
101 uint mix_weight_offset;
102 decode_node_uchar4(node.y, &type, ¶m1_offset, ¶m2_offset, &mix_weight_offset);
103 float mix_weight = (stack_valid(mix_weight_offset)? stack_load_float(stack, mix_weight_offset): 1.0f);
105 /* note we read this extra node before weight check, so offset is added */
106 uint4 data_node = read_node(kg, offset);
108 if(mix_weight == 0.0f)
111 float3 N = stack_valid(data_node.x)? stack_load_float3(stack, data_node.x): sd->N;
113 decode_node_uchar4(node.y, &type, ¶m1_offset, ¶m2_offset, NULL);
114 float mix_weight = 1.0f;
116 uint4 data_node = read_node(kg, offset);
117 float3 N = stack_valid(data_node.x)? stack_load_float3(stack, data_node.x): sd->N;
120 float param1 = (stack_valid(param1_offset))? stack_load_float(stack, param1_offset): __uint_as_float(node.z);
121 float param2 = (stack_valid(param2_offset))? stack_load_float(stack, param2_offset): __uint_as_float(node.w);
124 case CLOSURE_BSDF_DIFFUSE_ID: {
125 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
130 float roughness = param1;
132 if(roughness == 0.0f) {
135 sd->flag |= bsdf_diffuse_setup(sc);
138 sc->data0 = roughness;
140 sd->flag |= bsdf_oren_nayar_setup(sc);
145 case CLOSURE_BSDF_TRANSLUCENT_ID: {
146 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
152 sd->flag |= bsdf_translucent_setup(sc);
156 case CLOSURE_BSDF_TRANSPARENT_ID: {
157 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
163 sd->flag |= bsdf_transparent_setup(sc);
167 case CLOSURE_BSDF_REFLECTION_ID:
168 case CLOSURE_BSDF_MICROFACET_GGX_ID:
169 case CLOSURE_BSDF_MICROFACET_BECKMANN_ID: {
170 #ifdef __CAUSTICS_TRICKS__
171 if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
174 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
182 if(type == CLOSURE_BSDF_REFLECTION_ID)
183 sd->flag |= bsdf_reflection_setup(sc);
184 else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_ID)
185 sd->flag |= bsdf_microfacet_beckmann_setup(sc);
187 sd->flag |= bsdf_microfacet_ggx_setup(sc);
192 case CLOSURE_BSDF_REFRACTION_ID:
193 case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
194 case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID: {
195 #ifdef __CAUSTICS_TRICKS__
196 if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
199 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
205 float eta = fmaxf(param2, 1.0f + 1e-5f);
206 sc->data1 = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
209 if(type == CLOSURE_BSDF_REFRACTION_ID)
210 sd->flag |= bsdf_refraction_setup(sc);
211 else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID)
212 sd->flag |= bsdf_microfacet_beckmann_refraction_setup(sc);
214 sd->flag |= bsdf_microfacet_ggx_refraction_setup(sc);
219 case CLOSURE_BSDF_SHARP_GLASS_ID:
220 case CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID:
221 case CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID: {
222 #ifdef __CAUSTICS_TRICKS__
223 if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
226 /* index of refraction */
227 float eta = fmaxf(param2, 1.0f + 1e-5f);
228 eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
231 float cosNO = dot(N, sd->I);
232 float fresnel = fresnel_dielectric_cos(cosNO, eta);
233 float roughness = param1;
235 #ifdef __MULTI_CLOSURE__
237 ShaderClosure *sc = &sd->closure[sd->num_closure];
238 float3 weight = sc->weight;
239 float sample_weight = sc->sample_weight;
241 sc = svm_node_closure_get_bsdf(sd, mix_weight*fresnel);
245 svm_node_glass_setup(sd, sc, type, eta, roughness, false);
249 sc = &sd->closure[sd->num_closure];
251 sc->sample_weight = sample_weight;
253 sc = svm_node_closure_get_bsdf(sd, mix_weight*(1.0f - fresnel));
257 svm_node_glass_setup(sd, sc, type, eta, roughness, true);
260 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
264 bool refract = (randb > fresnel);
265 svm_node_glass_setup(sd, sc, type, eta, roughness, refract);
271 case CLOSURE_BSDF_WARD_ID: {
272 #ifdef __CAUSTICS_TRICKS__
273 if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
276 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
281 #ifdef __ANISOTROPIC__
282 sc->T = stack_load_float3(stack, data_node.y);
285 float rotation = stack_load_float(stack, data_node.z);
288 sc->T = rotate_around_axis(sc->T, sc->N, rotation * M_2PI_F);
290 /* compute roughness */
291 float roughness = param1;
292 float anisotropy = clamp(param2, -0.99f, 0.99f);
294 if(anisotropy < 0.0f) {
295 sc->data0 = roughness/(1.0f + anisotropy);
296 sc->data1 = roughness*(1.0f + anisotropy);
299 sc->data0 = roughness*(1.0f - anisotropy);
300 sc->data1 = roughness/(1.0f - anisotropy);
303 sd->flag |= bsdf_ward_setup(sc);
305 sd->flag |= bsdf_diffuse_setup(sc);
310 case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: {
311 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
317 sc->data0 = clamp(param1, 0.0f, 1.0f);
319 sd->flag |= bsdf_ashikhmin_velvet_setup(sc);
323 case CLOSURE_BSDF_DIFFUSE_TOON_ID:
324 case CLOSURE_BSDF_GLOSSY_TOON_ID: {
325 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
328 /* Normal, Size and Smooth */
333 if (type == CLOSURE_BSDF_DIFFUSE_TOON_ID)
334 sd->flag |= bsdf_diffuse_toon_setup(sc);
336 sd->flag |= bsdf_glossy_toon_setup(sc);
341 case CLOSURE_BSDF_HAIR_REFLECTION_ID:
342 case CLOSURE_BSDF_HAIR_TRANSMISSION_ID: {
344 if(sd->flag & SD_BACKFACING && sd->segment != ~0) {
345 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
347 sc->weight = make_float3(1.0f,1.0f,1.0f);
349 sd->flag |= bsdf_transparent_setup(sc);
353 ShaderClosure *sc = &sd->closure[sd->num_closure];
354 sc = svm_node_closure_get_bsdf(sd, mix_weight);
360 sc->offset = -stack_load_float(stack, data_node.z);
361 if(sd->segment == ~0) {
362 sc->T = normalize(sd->dPdv);
367 if(type == CLOSURE_BSDF_HAIR_REFLECTION_ID) {
368 sd->flag |= bsdf_hair_reflection_setup(sc);
371 sd->flag |= bsdf_hair_transmission_setup(sc);
380 #ifdef __SUBSURFACE__
381 case CLOSURE_BSSRDF_CUBIC_ID:
382 case CLOSURE_BSSRDF_GAUSSIAN_ID: {
383 ShaderClosure *sc = &sd->closure[sd->num_closure];
384 float3 weight = sc->weight * mix_weight;
385 float sample_weight = fabsf(average(weight));
387 /* disable in case of diffuse ancestor, can't see it well then and
388 * adds considerably noise due to probabilities of continuing path
389 * getting lower and lower */
390 if(path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
393 if(sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure+2 < MAX_CLOSURE) {
395 float3 radius = stack_load_float3(stack, data_node.z)*param1;
397 float sharpness = stack_load_float(stack, data_node.w);
398 /* texture color blur */
399 float texture_blur = param2;
401 /* create one closure per color channel */
402 if(fabsf(weight.x) > 0.0f) {
403 sc->weight = make_float3(weight.x, 0.0f, 0.0f);
404 sc->sample_weight = sample_weight;
405 sc->data0 = radius.x;
406 sc->data1 = texture_blur;
412 sd->flag |= bssrdf_setup(sc, (ClosureType)type);
418 if(fabsf(weight.y) > 0.0f) {
419 sc->weight = make_float3(0.0f, weight.y, 0.0f);
420 sc->sample_weight = sample_weight;
421 sc->data0 = radius.y;
422 sc->data1 = texture_blur;
428 sd->flag |= bssrdf_setup(sc, (ClosureType)type);
434 if(fabsf(weight.z) > 0.0f) {
435 sc->weight = make_float3(0.0f, 0.0f, weight.z);
436 sc->sample_weight = sample_weight;
437 sc->data0 = radius.z;
438 sc->data1 = texture_blur;
444 sd->flag |= bssrdf_setup(sc, (ClosureType)type);
459 ccl_device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int path_flag)
461 uint type, param1_offset, param2_offset;
463 #ifdef __MULTI_CLOSURE__
464 uint mix_weight_offset;
465 decode_node_uchar4(node.y, &type, ¶m1_offset, ¶m2_offset, &mix_weight_offset);
466 float mix_weight = (stack_valid(mix_weight_offset)? stack_load_float(stack, mix_weight_offset): 1.0f);
468 if(mix_weight == 0.0f)
471 decode_node_uchar4(node.y, &type, ¶m1_offset, ¶m2_offset, NULL);
472 float mix_weight = 1.0f;
475 float param1 = (stack_valid(param1_offset))? stack_load_float(stack, param1_offset): __uint_as_float(node.z);
476 float param2 = (stack_valid(param2_offset))? stack_load_float(stack, param2_offset): __uint_as_float(node.w);
477 float density = param1;
480 case CLOSURE_VOLUME_ABSORPTION_ID: {
481 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight * density);
484 sd->flag |= volume_absorption_setup(sc);
488 case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID: {
489 ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight * density);
494 sd->flag |= volume_henyey_greenstein_setup(sc);
503 ccl_device void svm_node_closure_emission(ShaderData *sd, float *stack, uint4 node)
505 #ifdef __MULTI_CLOSURE__
506 uint mix_weight_offset = node.y;
508 if(stack_valid(mix_weight_offset)) {
509 float mix_weight = stack_load_float(stack, mix_weight_offset);
511 if(mix_weight == 0.0f)
514 svm_node_closure_get_non_bsdf(sd, CLOSURE_EMISSION_ID, mix_weight);
517 svm_node_closure_get_non_bsdf(sd, CLOSURE_EMISSION_ID, 1.0f);
519 ShaderClosure *sc = &sd->closure;
520 sc->type = CLOSURE_EMISSION_ID;
523 sd->flag |= SD_EMISSION;
526 ccl_device void svm_node_closure_background(ShaderData *sd, float *stack, uint4 node)
528 #ifdef __MULTI_CLOSURE__
529 uint mix_weight_offset = node.y;
531 if(stack_valid(mix_weight_offset)) {
532 float mix_weight = stack_load_float(stack, mix_weight_offset);
534 if(mix_weight == 0.0f)
537 svm_node_closure_get_non_bsdf(sd, CLOSURE_BACKGROUND_ID, mix_weight);
540 svm_node_closure_get_non_bsdf(sd, CLOSURE_BACKGROUND_ID, 1.0f);
542 ShaderClosure *sc = &sd->closure;
543 sc->type = CLOSURE_BACKGROUND_ID;
547 ccl_device void svm_node_closure_holdout(ShaderData *sd, float *stack, uint4 node)
549 #ifdef __MULTI_CLOSURE__
550 uint mix_weight_offset = node.y;
552 if(stack_valid(mix_weight_offset)) {
553 float mix_weight = stack_load_float(stack, mix_weight_offset);
555 if(mix_weight == 0.0f)
558 svm_node_closure_get_non_bsdf(sd, CLOSURE_HOLDOUT_ID, mix_weight);
561 svm_node_closure_get_non_bsdf(sd, CLOSURE_HOLDOUT_ID, 1.0f);
563 ShaderClosure *sc = &sd->closure;
564 sc->type = CLOSURE_HOLDOUT_ID;
567 sd->flag |= SD_HOLDOUT;
570 ccl_device void svm_node_closure_ambient_occlusion(ShaderData *sd, float *stack, uint4 node)
572 #ifdef __MULTI_CLOSURE__
573 uint mix_weight_offset = node.y;
575 if(stack_valid(mix_weight_offset)) {
576 float mix_weight = stack_load_float(stack, mix_weight_offset);
578 if(mix_weight == 0.0f)
581 svm_node_closure_get_non_bsdf(sd, CLOSURE_AMBIENT_OCCLUSION_ID, mix_weight);
584 svm_node_closure_get_non_bsdf(sd, CLOSURE_AMBIENT_OCCLUSION_ID, 1.0f);
586 ShaderClosure *sc = &sd->closure;
587 sc->type = CLOSURE_AMBIENT_OCCLUSION_ID;
595 ccl_device_inline void svm_node_closure_store_weight(ShaderData *sd, float3 weight)
597 #ifdef __MULTI_CLOSURE__
598 if(sd->num_closure < MAX_CLOSURE)
599 sd->closure[sd->num_closure].weight = weight;
601 sd->closure.weight = weight;
605 ccl_device void svm_node_closure_set_weight(ShaderData *sd, uint r, uint g, uint b)
607 float3 weight = make_float3(__uint_as_float(r), __uint_as_float(g), __uint_as_float(b));
608 svm_node_closure_store_weight(sd, weight);
611 ccl_device void svm_node_emission_set_weight_total(KernelGlobals *kg, ShaderData *sd, uint r, uint g, uint b)
613 float3 weight = make_float3(__uint_as_float(r), __uint_as_float(g), __uint_as_float(b));
616 weight /= object_surface_area(kg, sd->object);
618 svm_node_closure_store_weight(sd, weight);
621 ccl_device void svm_node_closure_weight(ShaderData *sd, float *stack, uint weight_offset)
623 float3 weight = stack_load_float3(stack, weight_offset);
625 svm_node_closure_store_weight(sd, weight);
628 ccl_device void svm_node_emission_weight(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
630 uint color_offset = node.y;
631 uint strength_offset = node.z;
632 uint total_power = node.w;
634 float strength = stack_load_float(stack, strength_offset);
635 float3 weight = stack_load_float3(stack, color_offset)*strength;
637 if(total_power && sd->object != ~0)
638 weight /= object_surface_area(kg, sd->object);
640 svm_node_closure_store_weight(sd, weight);
643 ccl_device void svm_node_mix_closure(ShaderData *sd, float *stack,
644 uint4 node, int *offset, float *randb)
646 #ifdef __MULTI_CLOSURE__
647 /* fetch weight from blend input, previous mix closures,
648 * and write to stack to be used by closure nodes later */
649 uint weight_offset, in_weight_offset, weight1_offset, weight2_offset;
650 decode_node_uchar4(node.y, &weight_offset, &in_weight_offset, &weight1_offset, &weight2_offset);
652 float weight = stack_load_float(stack, weight_offset);
653 weight = clamp(weight, 0.0f, 1.0f);
655 float in_weight = (stack_valid(in_weight_offset))? stack_load_float(stack, in_weight_offset): 1.0f;
657 if(stack_valid(weight1_offset))
658 stack_store_float(stack, weight1_offset, in_weight*(1.0f - weight));
659 if(stack_valid(weight2_offset))
660 stack_store_float(stack, weight2_offset, in_weight*weight);
662 /* pick a closure and make the random number uniform over 0..1 again.
663 * closure 1 starts on the next node, for closure 2 the start is at an
664 * offset from the current node, so we jump */
665 uint weight_offset = node.y;
666 uint node_jump = node.z;
667 float weight = stack_load_float(stack, weight_offset);
668 weight = clamp(weight, 0.0f, 1.0f);
670 if(*randb < weight) {
671 *offset += node_jump;
672 *randb = *randb/weight;
675 *randb = (*randb - weight)/(1.0f - weight);
679 ccl_device void svm_node_add_closure(ShaderData *sd, float *stack, uint unused,
680 uint node_jump, int *offset, float *randb, float *closure_weight)
682 #ifdef __MULTI_CLOSURE__
683 /* nothing to do, handled in compiler */
685 /* pick one of the two closures with probability 0.5. sampling quality
686 * is not going to be great, for that we'd need to evaluate the weights
687 * of the two closures being added */
690 if(*randb < weight) {
691 *offset += node_jump;
692 *randb = *randb/weight;
695 *randb = (*randb - weight)/(1.0f - weight);
697 *closure_weight *= 2.0f;
703 ccl_device void svm_node_set_normal(KernelGlobals *kg, ShaderData *sd, float *stack, uint in_direction, uint out_normal)
705 float3 normal = stack_load_float3(stack, in_direction);
707 stack_store_float3(stack, out_normal, normal);