[Bf-blender-cvs] [d6aaf8606d] temp-cycles-denoising: Merge branch 'cycles_shadow_catcher' into temp-cycles-denoising

Lukas Stockner noreply at git.blender.org
Mon Feb 13 02:05:57 CET 2017


Commit: d6aaf8606d18b2b707e96346fbf11f26ee3e681b
Author: Lukas Stockner
Date:   Sun Feb 12 03:59:55 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rBd6aaf8606d18b2b707e96346fbf11f26ee3e681b

Merge branch 'cycles_shadow_catcher' into temp-cycles-denoising

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



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

diff --cc intern/cycles/kernel/bvh/bvh.h
index f8f56fe750,38f01e5b60..7204b9b2e2
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@@ -237,12 -229,13 +237,17 @@@ ccl_device_intersect void scene_interse
  #endif
  
  #ifdef __SHADOW_RECORD_ALL__
- ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg, const Ray *ray, Intersection *isect, uint max_hits, uint *num_hits)
+ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
+                                                      const Ray *ray,
+                                                      Intersection *isect,
+                                                      int skip_object,
+                                                      uint max_hits,
+                                                      uint *num_hits)
  {
 +#ifdef WITH_CYCLES_DEBUG_FPE
 +	scoped_fpe fpe(FPE_DISABLED);
 +#endif
 +
  #  ifdef __OBJECT_MOTION__
  	if(kernel_data.bvh.have_motion) {
  #    ifdef __HAIR__
diff --cc intern/cycles/kernel/kernel_accumulate.h
index 256662d79f,83fab01dc0..0f19b7f8ab
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@@ -198,6 -216,11 +216,12 @@@ ccl_device_inline void path_radiance_in
  	{
  		L->emission = make_float3(0.0f, 0.0f, 0.0f);
  	}
+ 
+ #ifdef __SHADOW_TRICKS__
+ 	L->path_total = make_float3(0.0f, 0.0f, 0.0f);
+ 	L->path_total_shaded = make_float3(0.0f, 0.0f, 0.0f);
++	L->shadow_color = make_float3(0.0f, 0.0f, 0.0f);
+ #endif
  }
  
  ccl_device_inline void path_radiance_bsdf_bounce(PathRadiance *L, ccl_addr_space float3 *throughput,
diff --cc intern/cycles/kernel/kernel_passes.h
index 4c4a324bf3,7aec47e495..7afc124544
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@@ -351,49 -199,5 +351,63 @@@ ccl_device_inline void kernel_write_lig
  #endif
  }
  
 +ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *buffer,
- 	int sample, PathRadiance *L, float alpha)
++	int sample, PathRadiance *L, float alpha, bool is_shadow_catcher)
 +{
 +	int split_passes = (kernel_data.film.denoising_flags & DENOISING_USE_SPLIT_PASSES);
 +
 +	if(L) {
- 		float3 L_sum = path_radiance_clamp_and_sum(kg, L);
++		float3 L_sum;
++#ifdef __SHADOW_TRICKS__
++		if(is_shadow_catcher) {
++			float shadow = path_radiance_sum_shadow(L);
++			L_sum = L->shadow_color * shadow;
++			if(kernel_data.background.transparent) {
++				alpha = 1.0f - shadow;
++			}
++		}
++		else
++#endif  /* __SHADOW_TRICKS__ */
++		{
++			L_sum = path_radiance_clamp_and_sum(kg, L);
++		}
++
 +		kernel_write_pass_float4(buffer, sample, make_float4(L_sum.x, L_sum.y, L_sum.z, alpha));
 +
 +		kernel_write_light_passes(kg, buffer, L, sample);
 +
 +		if(kernel_data.film.pass_denoising_data) {
 +			if(kernel_data.film.pass_denoising_clean) {
 +				float3 noisy, clean;
 +				path_radiance_split_denoising(kg, L, &noisy, &clean);
 +				kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 20, sample, noisy);
 +				if(split_passes && !(sample & 1)) {
 +					kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 26, sample, noisy);
 +				}
 +				kernel_write_pass_float3_nopad(buffer + kernel_data.film.pass_denoising_clean, sample, clean);
 +			}
 +			else {
 +				kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 20, sample, L_sum);
 +				if(split_passes && !(sample & 1)) {
 +					kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 26, sample, L_sum);
 +				}
 +			}
 +		}
 +	}
 +	else {
 +		kernel_write_pass_float4(buffer, sample, make_float4(0.0f, 0.0f, 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));
 +			}
 +		}
 +		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));
 +		}
 +	}
 +}
 +
  CCL_NAMESPACE_END
  
diff --cc intern/cycles/kernel/kernel_path.h
index 8f2c8cfb5e,cd76b87817..eddd0f5017
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@@ -584,10 -595,10 +595,11 @@@ ccl_device_inline float kernel_path_int
                                                 RNG *rng,
                                                 int sample,
                                                 Ray ray,
 -                                               ccl_global float *buffer)
 +                                               ccl_global float *buffer,
-                                                PathRadiance *L)
++                                               PathRadiance *L,
++                                               bool *is_shadow_catcher)
  {
  	/* initialize */
 -	PathRadiance L;
  	float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
  	float L_transparent = 0.0f;
  
@@@ -776,10 -791,7 +788,10 @@@
  #ifdef __BACKGROUND__
  			/* sample background shader */
  			float3 L_background = indirect_background(kg, &emission_sd, &state, &ray);
- 			path_radiance_accum_background(L, throughput, L_background, state.bounce);
 -			path_radiance_accum_background(&L, &state, throughput, L_background, state.bounce);
++			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;
@@@ -793,8 -805,21 +805,23 @@@
  		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) {
+ 				state.flag |= (PATH_RAY_SHADOW_CATCHER | PATH_RAY_SHADOW_CATCHER_ONLY);
+ 				state.catcher_object = sd.object;
+ 				if(!kernel_data.background.transparent) {
 -					shadow_color = indirect_background(kg, &emission_sd, &state, &ray);
++					L->shadow_color = indirect_background(kg, &emission_sd, &state, &ray);
+ 				}
+ 			}
+ 		}
+ 		else {
+ 			state.flag &= ~PATH_RAY_SHADOW_CATCHER_ONLY;
+ 		}
+ #endif  /* __SHADOW_TRICKS__ */
+ 
  		/* holdout */
  #ifdef __HOLDOUT__
  		if(((sd.flag & SD_HOLDOUT) ||
@@@ -885,10 -910,10 +912,10 @@@
  #endif  /* __SUBSURFACE__ */
  
  		/* direct lighting */
--		kernel_path_surface_connect_light(kg, rng, &sd, &emission_sd, throughput, &state, &L);
++		kernel_path_surface_connect_light(kg, rng, &sd, &emission_sd, throughput, &state, L);
  
  		/* compute direct lighting and next bounce */
 -		if(!kernel_path_surface_bounce(kg, rng, &sd, &throughput, &state, &L, &ray))
 +		if(!kernel_path_surface_bounce(kg, rng, &sd, &throughput, &state, L, &ray))
  			break;
  	}
  
@@@ -912,6 -937,23 +939,10 @@@
  	}
  #endif  /* __SUBSURFACE__ */
  
 -	float3 L_sum;
+ #ifdef __SHADOW_TRICKS__
 -	if(state.flag & PATH_RAY_SHADOW_CATCHER) {
 -		float shadow = path_radiance_sum_shadow(&L);
 -		L_sum = shadow_color * shadow;
 -		if(kernel_data.background.transparent) {
 -			L_transparent = shadow;
 -		}
 -	}
 -	else
++	*is_shadow_catcher = (state.flag & PATH_RAY_SHADOW_CATCHER);
+ #endif  /* __SHADOW_TRICKS__ */
 -	{
 -		L_sum = path_radiance_clamp_and_sum(kg, &L);
 -	}
 -
 -	kernel_write_light_passes(kg, buffer, &L, sample);
+ 
  #ifdef __KERNEL_DEBUG__
  	kernel_write_debug_passes(kg, buffer, &state, &debug_data, sample);
  #endif  /* __KERNEL_DEBUG__ */
@@@ -937,15 -979,15 +968,16 @@@ ccl_device void kernel_path_trace(Kerne
  	kernel_path_trace_setup(kg, rng_state, sample, x, y, &rng, &ray);
  
  	/* integrate */
 -	float4 L;
 -
 -	if(ray.t != 0.0f)
 -		L = kernel_path_integrate(kg, &rng, sample, ray, buffer);
 -	else
 -		L = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 +	PathRadiance L;
++	bool is_shadow_catcher;
  
 -	/* accumulate result in output buffer */
 -	kernel_write_pass_float4(buffer, sample, L);
 +	if(ray.t != 0.0f) {
- 		float alpha = kernel_path_integrate(kg, &rng, sample, ray, buffer, &L);
- 		kernel_write_result(kg, buffer, sample, &L, alpha);
++		float alpha = kernel_path_integrate(kg, &rng, sample, ray, buffer, &L, &is_shadow_catcher);
++		kernel_write_result(kg, buffer, sample, &L, alpha, is_shadow_catcher);
 +	}
 +	else {
- 		kernel_write_result(kg, buffer, sample, NULL, 0.0f);
++		kernel_write_result(kg, buffer, sample, NULL, 0.0f, false);
 +	}
  
  	path_rng_end(kg, rng_state, rng);
  }
diff --cc intern/cycles/kernel/kernel_path_branched.h
index d8ef12546c,c87daff017..e6e1f998e0
--- a/intern/cycles/kernel/kernel_path_branched.h
+++ b/intern/cycles/kernel/kernel_path_branched.h
@@@ -237,9 -242,10 +242,9 @@@ ccl_device void kernel_branched_path_su
  }
  #endif  /* __SUBSURFACE__ */
  
- ccl_device float kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, int sample, Ray ray, ccl_global float *buffer, PathRadiance *L)
 -ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, int sample, Ray ray, ccl_global float *buffer)
++ccl_device float kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, int sample, Ray ray, ccl_global float *buffer, PathRadiance *L, bool *is_shadow_catcher)
  {
  	/* initialize */
 -	PathRadiance L;
  	float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
  	float L_transparent = 0.0f;
  
@@@ -460,10 -470,7 +465,10 @@@
  #ifdef __BACKGROUND__
  			/* sample background shader */
  			float3 L_background = indirect_background(kg, &emission_sd, &state, &ray);
- 			path_radiance_accum_background(L, throughput, L_background, state.bounce);
 -			path_radiance_accum_background(&L, &state, throughput, L_background, state.bounce);
++			path_radiance_accum_background(L, &state, throughput, L_b

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list