[Bf-blender-cvs] [482ec5d1f20] cycles_disney_brdf: Fixed a bug that caused an additional white diffuse closure call when using path tracing.

Schoen noreply at git.blender.org
Mon Mar 13 15:48:25 CET 2017


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




More information about the Bf-blender-cvs mailing list