[Bf-blender-cvs] [0251626dad] temp-cycles-denoising: Cycles Denoising: Store feature pass into in PathRadiance

Lukas Stockner noreply at git.blender.org
Mon Feb 13 02:06:01 CET 2017


Commit: 0251626dad9f9c4d0f58821b7c8b4aeda55bf0e6
Author: Lukas Stockner
Date:   Mon Feb 13 01:39:27 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rB0251626dad9f9c4d0f58821b7c8b4aeda55bf0e6

Cycles Denoising: Store feature pass into in PathRadiance

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

M	intern/cycles/kernel/kernel_accumulate.h
M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/kernel/kernel_path.h
M	intern/cycles/kernel/kernel_path_branched.h
M	intern/cycles/kernel/kernel_path_state.h
M	intern/cycles/kernel/kernel_path_surface.h
M	intern/cycles/kernel/kernel_types.h

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

diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index 880e568248..13f16d4657 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -222,6 +222,12 @@ ccl_device_inline void path_radiance_init(PathRadiance *L, int use_light_pass)
 	L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f);
 	L->shadow_color = make_float3(0.0f, 0.0f, 0.0f);
 #endif
+
+#ifdef __DENOISING_FEATURES__
+	L->denoising_normal = make_float3(0.0f, 0.0f, 0.0f);
+	L->denoising_albedo = make_float3(0.0f, 0.0f, 0.0f);
+	L->denoising_depth = 0.0f;
+#endif  /* __DENOISING_FEATURES__ */
 }
 
 ccl_device_inline void path_radiance_bsdf_bounce(PathRadiance *L, ccl_addr_space float3 *throughput,
@@ -419,6 +425,10 @@ ccl_device_inline void path_radiance_accum_background(PathRadiance *L,
 		}
 	}
 #endif
+
+#ifdef __DENOISING_FEATURES__
+	L->denoising_albedo += state->denoising_feature_weight * value;
+#endif  /* __DENOISING_FEATURES__ */
 }
 
 ccl_device_inline void path_radiance_sum_indirect(PathRadiance *L)
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index d6bfdeb6ff..53bdcea7f0 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -144,72 +144,63 @@ ccl_device_inline void kernel_write_denoising_shadow(KernelGlobals *kg, ccl_glob
 	}
 }
 
-ccl_device_inline bool kernel_write_denoising_passes(KernelGlobals *kg, ccl_global float *buffer,
-	ccl_addr_space PathState *state, ShaderData *sd, int sample, float3 world_albedo)
+ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg,
+                                                        ShaderData *sd,
+                                                        PathState *state,
+                                                        PathRadiance *L)
 {
-	if(kernel_data.film.pass_denoising_data == 0)
-		return false;
-	buffer += kernel_data.film.pass_denoising_data;
-
-	if(state->flag & PATH_RAY_DENOISING_PASS_DONE)
-		return false;
+#ifdef __DENOISING_FEATURES__
+	if(state->denoising_feature_weight == 0.0f) {
+		return;
+	}
 
-	/* Can also be called if the ray misses the scene, sd is NULL in that case. */
-	if(sd) {
-		state->path_length += ccl_fetch(sd, ray_length);
+	L->denoising_depth += state->denoising_feature_weight * ccl_fetch(sd, ray_length);
 
-		float3 normal = make_float3(0.0f, 0.0f, 0.0f);
-		float3 albedo = make_float3(0.0f, 0.0f, 0.0f);
-		float sum_weight = 0.0f, sum_nonspecular_weight = 0.0f;
+	float3 normal = make_float3(0.0f, 0.0f, 0.0f);
+	float3 albedo = make_float3(0.0f, 0.0f, 0.0f);
+	float sum_weight = 0.0f, sum_nonspecular_weight = 0.0f;
 
-		for(int i = 0; i < ccl_fetch(sd, num_closure); i++) {
-			ShaderClosure *sc = ccl_fetch_array(sd, closure, i);
+	for(int i = 0; i < ccl_fetch(sd, num_closure); i++) {
+		ShaderClosure *sc = ccl_fetch_array(sd, closure, i);
 
-			if(!CLOSURE_IS_BSDF_OR_BSSRDF(sc->type))
-				continue;
+		if(!CLOSURE_IS_BSDF_OR_BSSRDF(sc->type))
+			continue;
 
-			/* Classify closures into diffuse-like and specular-like closures.
-			 * This is pretty arbitrary, but some distinction has to be made. */
-			bool is_specular = (sc->type == CLOSURE_BSDF_TRANSPARENT_ID);
-			if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
-				MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc;
-				if(bsdf->alpha_x*bsdf->alpha_y <= 0.075f*0.075f) {
-					is_specular = true;
-				}
-			}
-
-			/* All closures contribute to the normal feature, but only diffuse-like ones to the albedo. */
-			normal += sc->N * sc->sample_weight;
-			sum_weight += sc->sample_weight;
-			if(!is_specular) {
-				albedo += sc->weight;
-				sum_nonspecular_weight += sc->sample_weight;
+		/* Classify closures into diffuse-like and specular-like closures.
+		 * This is pretty arbitrary, but some distinction has to be made. */
+		bool is_specular = (sc->type == CLOSURE_BSDF_TRANSPARENT_ID);
+		if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) {
+			MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc;
+			if(bsdf->alpha_x*bsdf->alpha_y <= 0.075f*0.075f) {
+				is_specular = true;
 			}
 		}
 
-		if(sum_weight == 0.0f) {
-			kernel_write_pass_float3_var(buffer, sample, make_float3(0.0f, 0.0f, 0.0f));
-			kernel_write_pass_float3_var(buffer + 6, sample, make_float3(0.0f, 0.0f, 0.0f));
-			kernel_write_pass_float_var(buffer + 12, sample, 0.0f);
-		}
-		else {
-			/* Wait for next bounce if 75% or more sample weight belongs to specular-like closures. */
-			if(sum_nonspecular_weight*4.0f <= sum_weight) {
-				return false;
-			}
-			kernel_write_pass_float3_var(buffer, sample, ensure_finite3(normal/sum_weight));
-			kernel_write_pass_float3_var(buffer + 6, sample, ensure_finite3(albedo));
-			kernel_write_pass_float_var(buffer + 12, sample, ensure_finite(state->path_length));
+		/* All closures contribute to the normal feature, but only diffuse-like ones to the albedo. */
+		normal += sc->N * sc->sample_weight;
+		sum_weight += sc->sample_weight;
+		if(!is_specular) {
+			albedo += sc->weight;
+			sum_nonspecular_weight += sc->sample_weight;
 		}
 	}
-	else {
-		kernel_write_pass_float3_var(buffer, sample, make_float3(0.0f, 0.0f, 0.0f));
-		kernel_write_pass_float3_var(buffer + 6, sample, world_albedo);
-		kernel_write_pass_float_var(buffer + 12, sample, 0.0f);
-	}
 
-	state->flag |= PATH_RAY_DENOISING_PASS_DONE;
-	return true;
+	/* Wait for next bounce if 75% or more sample weight belongs to specular-like closures. */
+	if((sum_weight == 0.0f) || (sum_nonspecular_weight*4.0f > sum_weight)) {
+		L->denoising_normal += state->denoising_feature_weight * ensure_finite3(normal/sum_weight);
+		L->denoising_albedo += state->denoising_feature_weight * ensure_finite3(albedo);
+
+		state->denoising_feature_weight = 0.0f;
+		if(!(state->flag & PATH_RAY_SHADOW_CATCHER)) {
+			state->flag &= ~PATH_RAY_STORE_SHADOW_INFO;
+		}
+	}
+#else
+	(void) kg;
+	(void) sd;
+	(void) state;
+	(void) L;
+#endif  /* __DENOISING_FEATURES__ */
 }
 
 ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global float *buffer, PathRadiance *L,
@@ -376,6 +367,7 @@ ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *
 
 		kernel_write_light_passes(kg, buffer, L, sample);
 
+#ifdef __DENOISING_FEATURES__
 		kernel_write_denoising_shadow(kg, buffer, sample, average(L->path_total), average(L->path_total_shaded));
 
 		if(kernel_data.film.pass_denoising_data) {
@@ -394,20 +386,33 @@ ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *
 					kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 26, sample, L_sum);
 				}
 			}
+
+			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data, sample, L->denoising_normal);
+			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 6, sample, L->denoising_albedo);
+			kernel_write_pass_float_var(buffer + kernel_data.film.pass_denoising_data + 12, sample, L->denoising_depth);
 		}
+#endif  /* __DENOISING_FEATURES__ */
 	}
 	else {
 		kernel_write_pass_float4(buffer, sample, make_float4(0.0f, 0.0f, 0.0f, 0.0f));
 
+#ifdef __DENOISING_FEATURES__
+		kernel_write_denoising_shadow(kg, buffer, sample, 0.0f, 0.0f);
+
 		if(kernel_data.film.pass_denoising_data) {
 			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 20, sample, make_float3(0.0f, 0.0f, 0.0f));
 			if(split_passes && !(sample & 1)) {
 				kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 26, sample, make_float3(0.0f, 0.0f, 0.0f));
 			}
+
+			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data, sample, make_float3(0.0f, 0.0f, 0.0f));
+			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 6, sample, make_float3(0.0f, 0.0f, 0.0f));
+			kernel_write_pass_float_var(buffer + kernel_data.film.pass_denoising_data + 12, sample, 0.0f);
 		}
 		if(kernel_data.film.pass_denoising_clean) {
 			kernel_write_pass_float3_nopad(buffer + kernel_data.film.pass_denoising_clean, sample, make_float3(0.0f, 0.0f, 0.0f));
 		}
+#endif  /* __DENOISING_FEATURES__ */
 	}
 }
 
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index bafe5cdfcd..8cd36694b9 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -419,6 +419,8 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg,
 		}
 #endif  /* defined(__EMISSION__) && defined(__BRANCHED_PATH__) */
 
+		kernel_update_denoising_features(kg, sd, state, L);
+
 		if(!kernel_path_surface_bounce(kg, rng, sd, &throughput, state, L, ray))
 			break;
 	}
@@ -789,9 +791,6 @@ ccl_device_inline float kernel_path_integrate(KernelGlobals *kg,
 			/* sample background shader */
 			float3 L_background = indirect_background(kg, &emission_sd, &state, &ray);
 			path_radiance_accum_background(L, &state, throughput, L_background, state.bounce);
-			kernel_write_denoising_passes(kg, buffer, &state, NULL, sample, L_background);
-#else
-			kernel_write_denoising_passes(kg, buffer, &state, NULL, sample, make_float3(0.0f, 0.0f, 0.0f));
 #endif  /* __BACKGROUND__ */
 
 			break;
@@ -805,8 +804,6 @@ ccl_device_inline float kernel_path_integrate(KernelGlobals *kg,
 		float rbsdf = path_state_rng_1D_for_decision(kg, rng, &state, PRNG_BSDF);
 		shader_eval_surface(kg, &sd, rng, &state, rbsdf, state.flag, SHADER_CONTEXT_MAIN);
 
-		bool write_denoising_shadow = kernel_write_denoising_passes(kg, buffer, &state, &sd, sample, make_float3(0.0f, 0.0f, 0.0f));
-
 #ifdef __SHADOW_TRICKS__
 		if((sd.object_flag & SD_OBJECT_SHADOW_CATCHER)) {
 			if (state.flag & PATH_RAY_CAMERA) {
@@ -914,9 +911,7 @@ ccl_device_inline float kernel_path_integrate(KernelGlobals *kg,
 		/* direct lighting */
 		kernel_path_surface_connect_light(kg, rng, &sd, &emission_sd, throughput, &state, L);
 
-		if(write_denoising_shadow && !(state.flag & PATH_RAY_SHADOW_CATCHER)) {
-			state.flag &= ~PATH_RAY_STORE_SHADOW_INFO;
-		}
+		kernel_update_denoising_features(kg, &sd, &state, L);
 
 		/* compute direct lighting and next bounce */
 		if(!kernel_path_surface_bounce(kg, rng, &sd, &throughput, &state, L, &ray))
diff --git a/intern/cycles/kernel/kernel_p

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list