[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52690] trunk/blender/intern/cycles: Fix #33364: cycles tile rendering artifacts.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Nov 30 19:55:04 CET 2012


Revision: 52690
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52690
Author:   blendix
Date:     2012-11-30 18:55:04 +0000 (Fri, 30 Nov 2012)
Log Message:
-----------
Fix #33364: cycles tile rendering artifacts.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/svm/svm_closure.h
    trunk/blender/intern/cycles/render/nodes.cpp

Modified: trunk/blender/intern/cycles/kernel/svm/svm_closure.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_closure.h	2012-11-30 18:54:56 UTC (rev 52689)
+++ trunk/blender/intern/cycles/kernel/svm/svm_closure.h	2012-11-30 18:55:04 UTC (rev 52690)
@@ -50,29 +50,34 @@
 	}
 }
 
-__device_inline ShaderClosure *svm_node_closure_get(ShaderData *sd)
+__device_inline ShaderClosure *svm_node_closure_get_non_bsdf(ShaderData *sd, ClosureType type, float mix_weight)
 {
 #ifdef __MULTI_CLOSURE__
 	ShaderClosure *sc = &sd->closure[sd->num_closure];
 
-	if(sd->num_closure < MAX_CLOSURE)
+	if(sd->num_closure < MAX_CLOSURE) {
+		sc->weight *= mix_weight;
+		sc->type = type;
 		sd->num_closure++;
+		return sc;
+	}
 
-	return sc;
+	return NULL;
 #else
 	return &sd->closure;
 #endif
 }
 
-__device_inline ShaderClosure *svm_node_closure_get_weight(ShaderData *sd, float mix_weight)
+__device_inline ShaderClosure *svm_node_closure_get_bsdf(ShaderData *sd, float mix_weight)
 {
 #ifdef __MULTI_CLOSURE__
 	ShaderClosure *sc = &sd->closure[sd->num_closure];
+	float3 weight = sc->weight * mix_weight;
+	float sample_weight = fabsf(average(sc->weight));
 
-	sc->weight *= mix_weight;
-	sc->sample_weight = fabsf(average(sc->weight));
-
-	if(sc->sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) {
+	if(sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) {
+		sc->weight = weight;
+		sc->sample_weight = sample_weight;
 		sd->num_closure++;
 		return sc;
 	}
@@ -112,7 +117,7 @@
 
 	switch(type) {
 		case CLOSURE_BSDF_DIFFUSE_ID: {
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -130,7 +135,7 @@
 			break;
 		}
 		case CLOSURE_BSDF_TRANSLUCENT_ID: {
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -139,7 +144,7 @@
 			break;
 		}
 		case CLOSURE_BSDF_TRANSPARENT_ID: {
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -154,7 +159,7 @@
 			if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
 				break;
 #endif
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -178,7 +183,7 @@
 			if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
 				break;
 #endif
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -220,7 +225,7 @@
 			float3 weight = sc->weight;
 			float sample_weight = sc->sample_weight;
 
-			sc = svm_node_closure_get_weight(sd, mix_weight*fresnel);
+			sc = svm_node_closure_get_bsdf(sd, mix_weight*fresnel);
 
 			if(sc) {
 				sc->N = N;
@@ -232,14 +237,14 @@
 			sc->weight = weight;
 			sc->sample_weight = sample_weight;
 
-			sc = svm_node_closure_get_weight(sd, mix_weight*(1.0f - fresnel));
+			sc = svm_node_closure_get_bsdf(sd, mix_weight*(1.0f - fresnel));
 
 			if(sc) {
 				sc->N = N;
 				svm_node_glass_setup(sd, sc, type, eta, roughness, true);
 			}
 #else
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -255,7 +260,7 @@
 			if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
 				break;
 #endif
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -290,7 +295,7 @@
 			break;
 		}
 		case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: {
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				sc->N = N;
@@ -327,7 +332,7 @@
 
 	switch(type) {
 		case CLOSURE_VOLUME_TRANSPARENT_ID: {
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				float density = param1;
@@ -336,7 +341,7 @@
 			break;
 		}
 		case CLOSURE_VOLUME_ISOTROPIC_ID: {
-			ShaderClosure *sc = svm_node_closure_get_weight(sd, mix_weight);
+			ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
 
 			if(sc) {
 				float density = param1;
@@ -360,15 +365,10 @@
 		if(mix_weight == 0.0f)
 			return;
 
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->weight *= mix_weight;
-		sc->type = CLOSURE_EMISSION_ID;
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_EMISSION_ID, mix_weight);
 	}
-	else {
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->type = CLOSURE_EMISSION_ID;
-	}
-
+	else
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_EMISSION_ID, 1.0f);
 #else
 	ShaderClosure *sc = &sd->closure;
 	sc->type = CLOSURE_EMISSION_ID;
@@ -388,15 +388,10 @@
 		if(mix_weight == 0.0f)
 			return;
 
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->weight *= mix_weight;
-		sc->type = CLOSURE_BACKGROUND_ID;
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_BACKGROUND_ID, mix_weight);
 	}
-	else {
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->type = CLOSURE_BACKGROUND_ID;
-	}
-
+	else
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_BACKGROUND_ID, 1.0f);
 #else
 	ShaderClosure *sc = &sd->closure;
 	sc->type = CLOSURE_BACKGROUND_ID;
@@ -414,15 +409,10 @@
 		if(mix_weight == 0.0f)
 			return;
 
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->weight = make_float3(mix_weight, mix_weight, mix_weight);
-		sc->type = CLOSURE_HOLDOUT_ID;
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_HOLDOUT_ID, mix_weight);
 	}
-	else {
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->weight = make_float3(1.0f, 1.0f, 1.0f);
-		sc->type = CLOSURE_HOLDOUT_ID;
-	}
+	else
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_HOLDOUT_ID, 1.0f);
 #else
 	ShaderClosure *sc = &sd->closure;
 	sc->type = CLOSURE_HOLDOUT_ID;
@@ -442,15 +432,10 @@
 		if(mix_weight == 0.0f)
 			return;
 
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->weight *= mix_weight;
-		sc->type = CLOSURE_AMBIENT_OCCLUSION_ID;
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_AMBIENT_OCCLUSION_ID, mix_weight);
 	}
-	else {
-		ShaderClosure *sc = svm_node_closure_get(sd);
-		sc->type = CLOSURE_AMBIENT_OCCLUSION_ID;
-	}
-
+	else
+		svm_node_closure_get_non_bsdf(sd, CLOSURE_AMBIENT_OCCLUSION_ID, 1.0f);
 #else
 	ShaderClosure *sc = &sd->closure;
 	sc->type = CLOSURE_AMBIENT_OCCLUSION_ID;
@@ -464,7 +449,8 @@
 __device_inline void svm_node_closure_store_weight(ShaderData *sd, float3 weight)
 {
 #ifdef __MULTI_CLOSURE__
-	sd->closure[sd->num_closure].weight = weight;
+	if(sd->num_closure < MAX_CLOSURE)
+		sd->closure[sd->num_closure].weight = weight;
 #else
 	sd->closure.weight = weight;
 #endif

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2012-11-30 18:54:56 UTC (rev 52689)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2012-11-30 18:55:04 UTC (rev 52690)
@@ -1624,6 +1624,9 @@
 
 void HoldoutNode::compile(SVMCompiler& compiler)
 {
+	float3 value = make_float3(1.0f, 1.0f, 1.0f);
+
+	compiler.add_node(NODE_CLOSURE_SET_WEIGHT, value);
 	compiler.add_node(NODE_CLOSURE_HOLDOUT, compiler.closure_mix_weight_offset());
 }
 




More information about the Bf-blender-cvs mailing list