Commit: 482ec5d1f20ceabc9cbda4838d4ae37d1d673458
Author: Schoen
Date:   Mon Mar 13 15:47:12 2017 +0100
Branches: cycles_disney_brdf
https://developer.blender.org/rB482ec5d1f20ceabc9cbda4838d4ae37d1d673458

Fixed a bug that caused an additional white diffuse closure call when using
path tracing.

===================================================================

M       intern/cycles/kernel/kernel_subsurface.h
M       intern/cycles/kernel/svm/svm_closure.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_subsurface.h 
b/intern/cycles/kernel/kernel_subsurface.h
index 77a026b34cd..9f7103c7675 100644
--- a/intern/cycles/kernel/kernel_subsurface.h
+++ b/intern/cycles/kernel/kernel_subsurface.h
@@ -162,7 +162,7 @@ ccl_device void 
subsurface_scatter_setup_diffuse_bsdf(ShaderData *sd, ShaderClos
                                bsdf->type = CLOSURE_BSDF_BSSRDF_PRINCIPLED_ID;
                        }
                }
-               else {
+               else if(CLOSURE_IS_BSSRDF(bssrdf->type)) {
                        DiffuseBsdf *bsdf = (DiffuseBsdf*)bsdf_alloc(sd, 
sizeof(DiffuseBsdf), weight);
 
                        if(bsdf) {
diff --git a/intern/cycles/kernel/svm/svm_closure.h 
b/intern/cycles/kernel/svm/svm_closure.h
index 0cf7bb8e6e3..7b8cbbf1536 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -152,71 +152,73 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, 
ShaderData *sd, float *
                        }
 
                        /* diffuse */
-                       if(subsurface < CLOSURE_WEIGHT_CUTOFF && diffuse_weight 
> CLOSURE_WEIGHT_CUTOFF && fabsf(average(base_color)) > CLOSURE_WEIGHT_CUTOFF) {
-                               float3 diff_weight = weight * base_color * 
diffuse_weight;
+                       if(fabsf(average(base_color)) > CLOSURE_WEIGHT_CUTOFF) {
+                               if(subsurface < CLOSURE_WEIGHT_CUTOFF && 
diffuse_weight > CLOSURE_WEIGHT_CUTOFF) {
+                                       float3 diff_weight = weight * 
base_color * diffuse_weight;
 
-                               PrincipledDiffuseBsdf *bsdf = 
(PrincipledDiffuseBsdf*)bsdf_alloc(sd, sizeof(PrincipledDiffuseBsdf), 
diff_weight);
+                                       PrincipledDiffuseBsdf *bsdf = 
(PrincipledDiffuseBsdf*)bsdf_alloc(sd, sizeof(PrincipledDiffuseBsdf), 
diff_weight);
 
-                               if(bsdf) {
-                                       bsdf->N = N;
-                                       bsdf->roughness = roughness;
+                                       if(bsdf) {
+                                               bsdf->N = N;
+                                               bsdf->roughness = roughness;
 
-                                       /* setup bsdf */
-                                       ccl_fetch(sd, flag) |= 
bsdf_principled_diffuse_setup(bsdf);
+                                               /* setup bsdf */
+                                               ccl_fetch(sd, flag) |= 
bsdf_principled_diffuse_setup(bsdf);
+                                       }
                                }
-                       }
-                       else if(subsurf_sample_weight > CLOSURE_WEIGHT_CUTOFF) {
-                               /* radius * scale */
-                               float3 radius = subsurface_radius * subsurface;
-                               /* sharpness */
-                               float sharpness = 0.0f;
-                               /* texture color blur */
-                               float texture_blur = 0.0f;
+                               else if(subsurface > CLOSURE_WEIGHT_CUTOFF && 
subsurf_sample_weight > CLOSURE_WEIGHT_CUTOFF) {
+                                       /* radius * scale */
+                                       float3 radius = subsurface_radius * 
subsurface;
+                                       /* sharpness */
+                                       float sharpness = 0.0f;
+                                       /* texture color blur */
+                                       float texture_blur = 0.0f;
+
+                                       /* create one closure per color channel 
*/
+                                       Bssrdf *bssrdf = bssrdf_alloc(sd, 
make_float3(subsurf_weight.x, 0.0f, 0.0f));
+                                       if(bssrdf) {
+                                               bssrdf->sample_weight = 
subsurf_sample_weight;
+                                               bssrdf->radius = radius.x;
+                                               bssrdf->texture_blur = 
texture_blur;
+                                               bssrdf->albedo = albedo.x;
+                                               bssrdf->sharpness = sharpness;
+                                               bssrdf->N = N;
+                                               bssrdf->base_color = base_color;
+                                               bssrdf->roughness = roughness;
 
-                               /* create one closure per color channel */
-                               Bssrdf *bssrdf = bssrdf_alloc(sd, 
make_float3(subsurf_weight.x, 0.0f, 0.0f));
-                               if(bssrdf) {
-                                       bssrdf->sample_weight = 
subsurf_sample_weight;
-                                       bssrdf->radius = radius.x;
-                                       bssrdf->texture_blur = texture_blur;
-                                       bssrdf->albedo = albedo.x;
-                                       bssrdf->sharpness = sharpness;
-                                       bssrdf->N = N;
-                                       bssrdf->base_color = base_color;
-                                       bssrdf->roughness = roughness;
-
-                                       /* setup bsdf */
-                                       ccl_fetch(sd, flag) |= 
bssrdf_setup(bssrdf, (ClosureType)CLOSURE_BSSRDF_PRINCIPLED_ID);
-                               }
+                                               /* setup bsdf */
+                                               ccl_fetch(sd, flag) |= 
bssrdf_setup(bssrdf, (ClosureType)CLOSURE_BSSRDF_PRINCIPLED_ID);
+                                       }
 
-                               bssrdf = bssrdf_alloc(sd, make_float3(0.0f, 
subsurf_weight.y, 0.0f));
-                               if(bssrdf) {
-                                       bssrdf->sample_weight = 
subsurf_sample_weight;
-                                       bssrdf->radius = radius.y;
-                                       bssrdf->texture_blur = texture_blur;
-                                       bssrdf->albedo = albedo.y;
-                                       bssrdf->sharpness = sharpness;
-                                       bssrdf->N = N;
-                                       bssrdf->base_color = base_color;
-                                       bssrdf->roughness = roughness;
+                                       bssrdf = bssrdf_alloc(sd, 
make_float3(0.0f, subsurf_weight.y, 0.0f));
+                                       if(bssrdf) {
+                                               bssrdf->sample_weight = 
subsurf_sample_weight;
+                                               bssrdf->radius = radius.y;
+                                               bssrdf->texture_blur = 
texture_blur;
+                                               bssrdf->albedo = albedo.y;
+                                               bssrdf->sharpness = sharpness;
+                                               bssrdf->N = N;
+                                               bssrdf->base_color = base_color;
+                                               bssrdf->roughness = roughness;
 
-                                       /* setup bsdf */
-                                       ccl_fetch(sd, flag) |= 
bssrdf_setup(bssrdf, (ClosureType)CLOSURE_BSSRDF_PRINCIPLED_ID);
-                               }
+                                               /* setup bsdf */
+                                               ccl_fetch(sd, flag) |= 
bssrdf_setup(bssrdf, (ClosureType)CLOSURE_BSSRDF_PRINCIPLED_ID);
+                                       }
 
-                               bssrdf = bssrdf_alloc(sd, make_float3(0.0f, 
0.0f, subsurf_weight.z));
-                               if(bssrdf) {
-                                       bssrdf->sample_weight = 
subsurf_sample_weight;
-                                       bssrdf->radius = radius.z;
-                                       bssrdf->texture_blur = texture_blur;
-                                       bssrdf->albedo = albedo.z;
-                                       bssrdf->sharpness = sharpness;
-                                       bssrdf->N = N;
-                                       bssrdf->base_color = base_color;
-                                       bssrdf->roughness = roughness;
+                                       bssrdf = bssrdf_alloc(sd, 
make_float3(0.0f, 0.0f, subsurf_weight.z));
+                                       if(bssrdf) {
+                                               bssrdf->sample_weight = 
subsurf_sample_weight;
+                                               bssrdf->radius = radius.z;
+                                               bssrdf->texture_blur = 
texture_blur;
+                                               bssrdf->albedo = albedo.z;
+                                               bssrdf->sharpness = sharpness;
+                                               bssrdf->N = N;
+                                               bssrdf->base_color = base_color;
+                                               bssrdf->roughness = roughness;
 
-                                       /* setup bsdf */
-                                       ccl_fetch(sd, flag) |= 
bssrdf_setup(bssrdf, (ClosureType)CLOSURE_BSSRDF_PRINCIPLED_ID);
+                                               /* setup bsdf */
+                                               ccl_fetch(sd, flag) |= 
bssrdf_setup(bssrdf, (ClosureType)CLOSURE_BSSRDF_PRINCIPLED_ID);
+                                       }
                                }
                        }
 #else

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to