[Bf-blender-cvs] [950b42b797] soc-2016-cycles_denoising: Cycles Denoising: Also write NLM-filtered version of the color input when debugging is enabled
Lukas Stockner
noreply at git.blender.org
Wed Feb 1 05:19:00 CET 2017
Commit: 950b42b797dbf1e7adcc7061a703820dde6f0ab0
Author: Lukas Stockner
Date: Sat Jan 14 20:30:28 2017 +0100
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB950b42b797dbf1e7adcc7061a703820dde6f0ab0
Cycles Denoising: Also write NLM-filtered version of the color input when debugging is enabled
===================================================================
M intern/cycles/device/device_cpu.cpp
===================================================================
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 26ec530cf1..2de0eee900 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -289,28 +289,33 @@ public:
}
};
- void non_local_means(int4 rect, float *image, float *weight, float *out, float *variance, float *difference, float *blurDifference, float *weightAccum, int r, int f, float a, float k_2)
+ void non_local_means(int4 rect, float *image, float *weight, float *out, float *variance, float *difference, float *blurDifference, float *weightAccum, int r, int f, float a, float k_2, int channel_ofs_in = 0, int channel_ofs_out = 0)
{
int w = align_up(rect.z-rect.x, 4);
int h = rect.w-rect.y;
- memset(weightAccum, 0, sizeof(float)*w*h);
- memset(out, 0, sizeof(float)*w*h);
+ int channels = channel_ofs_in? 3: 1;
+ memset(weightAccum, 0, sizeof(float)*w*h*channels);
+ memset(out, 0, sizeof(float)*w*h*channels);
for(int i = 0; i < (2*r+1)*(2*r+1); i++) {
int dy = i / (2*r+1) - r;
int dx = i % (2*r+1) - r;
int local_rect[4] = {max(0, -dx), max(0, -dy), rect.z-rect.x - max(0, dx), rect.w-rect.y - max(0, dy)};
- filter_nlm_calc_difference_kernel()(dx, dy, weight, variance, difference, local_rect, w, 0, a, k_2);
+ filter_nlm_calc_difference_kernel()(dx, dy, weight, variance, difference, local_rect, w, channel_ofs_in, a, k_2);
filter_nlm_blur_kernel()(difference, blurDifference, local_rect, w, f);
filter_nlm_calc_weight_kernel()(blurDifference, difference, local_rect, w, f);
filter_nlm_blur_kernel()(difference, blurDifference, local_rect, w, f);
- filter_nlm_update_output_kernel()(dx, dy, blurDifference, image, out, weightAccum, local_rect, w, f);
+ for(int c = 0; c < channels; c++) {
+ filter_nlm_update_output_kernel()(dx, dy, blurDifference, image + channel_ofs_in*c, out + channel_ofs_out*c, weightAccum + w*h*c, local_rect, w, f);
+ }
}
int local_rect[4] = {0, 0, rect.z-rect.x, rect.w-rect.y};
- filter_nlm_normalize_kernel()(out, weightAccum, local_rect, w);
+ for(int c = 0; c < channels; c++) {
+ filter_nlm_normalize_kernel()(out + channel_ofs_out*c, weightAccum + w*h*c, local_rect, w);
+ }
}
float* denoise_fill_buffer(KernelGlobals *kg, int sample, int4 rect, float** buffers, int* tile_x, int* tile_y, int *offsets, int *strides, int frames, int *frame_strides)
@@ -446,6 +451,25 @@ public:
}
}
}
+#ifdef WITH_CYCLES_DEBUG_FILTER
+ {
+ float *temp1 = new float[pass_stride], *temp2 = new float[pass_stride], *temp3 = new float[3*pass_stride], *out = new float[3*pass_stride];
+ non_local_means(rect, PASSPTR(16), PASSPTR(16), out, PASSPTR(17), temp1, temp2, temp3, 8, 4, 1, 0.5f, 2*pass_stride, pass_stride);
+ debug.add_pass("input0Filtered", out);
+ debug.add_pass("input1Filtered", out+pass_stride);
+ debug.add_pass("input2Filtered", out+2*pass_stride);
+ debug.add_pass("input0Unfiltered", PASSPTR(16));
+ debug.add_pass("input1Unfiltered", PASSPTR(18));
+ debug.add_pass("input2Unfiltered", PASSPTR(20));
+ debug.add_pass("input0Variance", PASSPTR(17));
+ debug.add_pass("input1Variance", PASSPTR(19));
+ debug.add_pass("input2Variance", PASSPTR(21));
+ delete[] temp1;
+ delete[] temp2;
+ delete[] temp3;
+ delete[] out;
+#endif
+ }
debug.write(string_printf("debug_tile_%d_%d.exr", rect.x, rect.y));
}
More information about the Bf-blender-cvs
mailing list