[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