Commit: 98b7447c9c9046cac036cf455a4c904fcfa7e367
Author: Lukas Stockner
Date:   Sun Jul 24 01:59:08 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB98b7447c9c9046cac036cf455a4c904fcfa7e367

Cycles: Add two shadow feature passes

These two passes will both hold the same feature, but one will be filled with 
data from even samples
and the other with data from odd samples. That allows to estimate buffer 
variance and prefilter it better later on.

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

M       intern/cycles/blender/blender_session.cpp
M       intern/cycles/blender/blender_util.h
M       intern/cycles/kernel/kernel_filter.h
M       intern/cycles/kernel/kernel_passes.h
M       intern/cycles/render/buffers.cpp
M       intern/cycles/render/buffers.h
M       intern/cycles/render/film.cpp
M       source/blender/makesdna/DNA_scene_types.h
M       source/blender/render/intern/source/render_result.c

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

diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index 8aa1975..b520fb6 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -476,6 +476,8 @@ void BlenderSession::render()
                        add_pass(b_engine, SCE_PASS_DENOISE_ALBEDO_VAR, 3, 
b_rlay_name.c_str(), NULL);
                        add_pass(b_engine, SCE_PASS_DENOISE_DEPTH, 1, 
b_rlay_name.c_str(), NULL);
                        add_pass(b_engine, SCE_PASS_DENOISE_DEPTH_VAR, 1, 
b_rlay_name.c_str(), NULL);
+                       add_pass(b_engine, SCE_PASS_DENOISE_SHADOW_A, 3, 
b_rlay_name.c_str(), NULL);
+                       add_pass(b_engine, SCE_PASS_DENOISE_SHADOW_B, 3, 
b_rlay_name.c_str(), NULL);
                        add_pass(b_engine, SCE_PASS_DENOISE_NOISY, 3, 
b_rlay_name.c_str(), NULL);
                        add_pass(b_engine, SCE_PASS_DENOISE_NOISY_VAR, 3, 
b_rlay_name.c_str(), NULL);
                        if(buffer_params.selective_denoising) {
diff --git a/intern/cycles/blender/blender_util.h 
b/intern/cycles/blender/blender_util.h
index fde9a9c..518a5a0 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -39,15 +39,17 @@ CCL_NAMESPACE_BEGIN
 
 /* TODO Wrap through RNA */
 typedef enum BlenderDenoisePasses {
-        SCE_PASS_DENOISE_NORMAL           = 32,
-        SCE_PASS_DENOISE_NORMAL_VAR       = 33,
-        SCE_PASS_DENOISE_ALBEDO           = 34,
-        SCE_PASS_DENOISE_ALBEDO_VAR       = 35,
-        SCE_PASS_DENOISE_DEPTH            = 36,
-        SCE_PASS_DENOISE_DEPTH_VAR        = 37,
-        SCE_PASS_DENOISE_NOISY            = 38, /* The original noisy image 
(only the components that are denoised). */
-        SCE_PASS_DENOISE_NOISY_VAR        = 39,
-        SCE_PASS_DENOISE_CLEAN            = 40, /* If present, these image 
components are added to the denoised image. */
+       SCE_PASS_DENOISE_NORMAL           = 32,
+       SCE_PASS_DENOISE_NORMAL_VAR       = 33,
+       SCE_PASS_DENOISE_ALBEDO           = 34,
+       SCE_PASS_DENOISE_ALBEDO_VAR       = 35,
+       SCE_PASS_DENOISE_DEPTH            = 36,
+       SCE_PASS_DENOISE_DEPTH_VAR        = 37,
+       SCE_PASS_DENOISE_SHADOW_A         = 38,
+       SCE_PASS_DENOISE_SHADOW_B         = 39,
+       SCE_PASS_DENOISE_NOISY            = 40, /* The original noisy image 
(only the components that are denoised). */
+       SCE_PASS_DENOISE_NOISY_VAR        = 41,
+       SCE_PASS_DENOISE_CLEAN            = 42, /* If present, these image 
components are added to the denoised image. */
 } BlenderDenoisePasses;
 
 void python_thread_state_save(void **python_thread_state);
diff --git a/intern/cycles/kernel/kernel_filter.h 
b/intern/cycles/kernel/kernel_filter.h
index 90ea94b..895c68a 100644
--- a/intern/cycles/kernel/kernel_filter.h
+++ b/intern/cycles/kernel/kernel_filter.h
@@ -77,13 +77,13 @@ ccl_device_inline void filter_get_feature_variance(int x, 
int y, float *buffer,
 ccl_device_inline float3 filter_get_pixel_color(float *buffer, float sample)
 {
        float sample_scale = 1.0f/sample;
-       return make_float3(buffer[14], buffer[15], buffer[16]) * sample_scale;
+       return make_float3(buffer[20], buffer[21], buffer[22]) * sample_scale;
 }
 
 ccl_device_inline float filter_get_pixel_variance(float *buffer, float sample)
 {
        float sample_scale_var = 1.0f/(sample * (sample - 1.0f));
-       return average(make_float3(buffer[17], buffer[18], buffer[19])) * 
sample_scale_var;
+       return average(make_float3(buffer[23], buffer[24], buffer[25])) * 
sample_scale_var;
 }
 
 ccl_device_inline float filter_fill_design_row(float *features, int rank, 
float *design_row, float *feature_transform, float *bandwidth_factor)
@@ -133,8 +133,8 @@ ccl_device void kernel_filter_estimate_params(KernelGlobals 
*kg, int sample, flo
 
        /* === Get center pixel color and variance. === */
        float *center_buffer = buffers[4] + (offset[4] + y*stride[4] + 
x)*kernel_data.film.pass_stride + kernel_data.film.pass_denoising;
-       float3 center_color    = make_float3(center_buffer[14], 
center_buffer[15], center_buffer[16]) / sample;
-       float sqrt_center_variance = 
sqrtf(average(make_float3(center_buffer[17], center_buffer[18], 
center_buffer[19])) / (sample * (sample - 1.0f)));
+       float3 center_color  = filter_get_pixel_color(center_buffer, sample);
+       float sqrt_center_variance = 
sqrtf(filter_get_pixel_variance(center_buffer, sample));
 
 
 
@@ -389,8 +389,8 @@ ccl_device void kernel_filter_final_pass(KernelGlobals *kg, 
int sample, float **
 
        /* === Get center pixel. === */
        float *center_buffer = buffers[4] + (offset[4] + y*stride[4] + 
x)*kernel_data.film.pass_stride + kernel_data.film.pass_denoising;
-       float3 center_color    = make_float3(center_buffer[14], 
center_buffer[15], center_buffer[16]) / sample;
-       float sqrt_center_variance = 
sqrtf(average(make_float3(center_buffer[17], center_buffer[18], 
center_buffer[19])) / (sample * (sample - 1.0f)));
+       float3 center_color  = filter_get_pixel_color(center_buffer, sample);
+       float sqrt_center_variance = 
sqrtf(filter_get_pixel_variance(center_buffer, sample));
        float feature_means[DENOISE_FEATURES];
        filter_get_features(x, y, center_buffer, sample, feature_means, NULL);
 
diff --git a/intern/cycles/kernel/kernel_passes.h 
b/intern/cycles/kernel/kernel_passes.h
index 18db922..7e7cf29 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -319,11 +319,11 @@ ccl_device_inline void kernel_write_result(KernelGlobals 
*kg, ccl_global float *
                        if(kernel_data.film.pass_no_denoising) {
                                float3 noisy, clean;
                                path_radiance_split_denoising(kg, L, &noisy, 
&clean);
-                               kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising + 14, sample, noisy);
+                               kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising + 20, sample, noisy);
                                kernel_write_pass_float3_nopad(buffer + 
kernel_data.film.pass_no_denoising, sample, clean);
                        }
                        else {
-                               kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising + 14, sample, L_sum);
+                               kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising + 20, sample, L_sum);
                        }
                }
        }
@@ -331,7 +331,7 @@ ccl_device_inline void kernel_write_result(KernelGlobals 
*kg, ccl_global float *
                kernel_write_pass_float4(buffer, sample, make_float4(0.0f, 
0.0f, 0.0f, 0.0f));
 
                if(kernel_data.film.pass_denoising) {
-                       kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising + 14, sample, make_float3(0.0f, 0.0f, 0.0f));
+                       kernel_write_pass_float3_var(buffer + 
kernel_data.film.pass_denoising + 20, sample, make_float3(0.0f, 0.0f, 0.0f));
                }
                if(kernel_data.film.pass_no_denoising) {
                        kernel_write_pass_float3_nopad(buffer + 
kernel_data.film.pass_no_denoising, sample, make_float3(0.0f, 0.0f, 0.0f));
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 179cee2..f1e552d 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -79,9 +79,9 @@ int BufferParams::get_passes_size()
                size += passes[i].components;
 
        if(denoising_passes) {
-               /* Feature passes: 7 Channels (3 Color, 3 Normal, 1 Depth) + 7 
Variance
+               /* Feature passes: 11 Channels (3 Color, 3 Normal, 1 Depth, 4 
Shadow) + 9 Variance
                 * Color passes: 3 Noisy (RGB) + 3 Variance [+ 3 Skip (RGB)] */
-               size += selective_denoising? 23: 20;
+               size += selective_denoising? 29: 26;
        }
 
        return align_up(size, 4);
@@ -231,9 +231,11 @@ bool RenderBuffers::get_denoising_rect(int type, float 
exposure, int sample, int
                case EX_TYPE_DENOISE_ALBEDO_VAR: type_offset =  9; scale = 
1.0f/sample; break;
                case EX_TYPE_DENOISE_DEPTH:      type_offset = 12; scale = 
1.0f/sample; break;
                case EX_TYPE_DENOISE_DEPTH_VAR:  type_offset = 13; scale = 
1.0f/sample; break;
-               case EX_TYPE_DENOISE_NOISY:      type_offset = 14; scale = 
exposure/sample; break;
-               case EX_TYPE_DENOISE_NOISY_VAR:  type_offset = 17; scale = 
exposure*exposure/sample; break;
-               case EX_TYPE_DENOISE_CLEAN:      type_offset = 20; scale = 
exposure/sample; break;
+               case EX_TYPE_DENOISE_SHADOW_A:   type_offset = 14; scale = 
1.0f/sample; break;
+               case EX_TYPE_DENOISE_SHADOW_B:   type_offset = 17; scale = 
1.0f/sample; break;
+               case EX_TYPE_DENOISE_NOISY:      type_offset = 20; scale = 
exposure/sample; break;
+               case EX_TYPE_DENOISE_NOISY_VAR:  type_offset = 23; scale = 
exposure*exposure/sample; break;
+               case EX_TYPE_DENOISE_CLEAN:      type_offset = 26; scale = 
exposure/sample; break;
        }
 
        if(read_pixels) {
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index d7e7047..4a9287f 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -38,9 +38,11 @@ typedef enum DenoiseExtendedTypes {
        EX_TYPE_DENOISE_ALBEDO_VAR        = (1 << 3),
        EX_TYPE_DENOISE_DEPTH             = (1 << 4),
        EX_TYPE_DENOISE_DEPTH_VAR         = (1 << 5),
-       EX_TYPE_DENOISE_NOISY             = (1 << 6),
-       EX_TYPE_DENOISE_NOISY_VAR         = (1 << 7),
-       EX_TYPE_DENOISE_CLEAN             = (1 << 8),
+       EX_TYPE_DENOISE_SHADOW_A          = (1 << 6),
+       EX_TYPE_DENOISE_SHADOW_B          = (1 << 7),
+       EX_TYPE_DENOISE_NOISY             = (1 << 8),
+       EX_TYPE_DENOISE_NOISY_VAR         = (1 << 9),
+       EX_TYPE_DENOISE_CLEAN             = (1 << 10),
 
        EX_TYPE_DENOISE_REQUIRED = (EX_TYPE_DENOISE_NORMAL
                                  | EX_TYPE_DENOISE_NORMAL_VAR
@@ -48,6 +50,8 @@ typedef enum DenoiseExtendedTypes {
                                  | EX_TYPE_DENOISE_ALBEDO_VAR
                                  | EX_TYPE_DENOISE_DEPTH
                                  | EX_TYPE_DENOISE_DEPTH_VAR
+                                 | EX_TYPE_DENOISE_SHADOW_A
+                                 | EX_TYPE_DENOISE_SHADOW_B
                                  | EX_TYPE_DENOISE_NOISY
                                  | EX_TYPE_DENOISE_NOISY_VAR),
        EX_TYPE_DENOISE_ALL = EX_TYPE_DENOISE_REQUIRED | EX_TYPE_DENOISE_CLEAN,
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 56f26e5..d29c426 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -444,7 +444,7 @@ void Film::device_update(Device *device, DeviceScene 
*dscene, Scene *scene)
 
        if(denoising_passes) {
                kfilm->pass_denoising = kfilm->pass_stride;
-               kfilm->pass_stride += 20;
+               kfilm->pass_stride += 26;
                kfilm->denoise_flag = denoise_flags;
                if(selective_denoising) {
                        kfilm->pass_no_denoising = kfilm->pass_stride

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to