[Bf-blender-cvs] [96ec1641c99] temp-cycles-denoising: Cycles Denoising: Remove cross- and gradient-denoising option, replace PCA threshold with a checkbox

Lukas Stockner noreply at git.blender.org
Wed Mar 29 07:56:21 CEST 2017


Commit: 96ec1641c991c14d228fba4b853cc66bef50fe4c
Author: Lukas Stockner
Date:   Wed Mar 29 07:52:47 2017 +0200
Branches: temp-cycles-denoising
https://developer.blender.org/rB96ec1641c991c14d228fba4b853cc66bef50fe4c

Cycles Denoising: Remove cross- and gradient-denoising option, replace PCA threshold with a checkbox

Cross denoising is significantly slower, needs more memory and didn't really produce better results in my tests.
Gradient denoising sometimes helped, but tends to produce artifacts and was broken for a few weeks already anyways.

The extremely confusing "Filter strength" (negative values used to map to an absolute threshold of 10^(2*-strength), positive ones to a relative threshold of 10^(2*strength), 0 to relative 1e-3) was replaced by a checkbox that selects between an absolute threshold of 1 and a relative threshold of 1e-3.
Eventually, I'd like to completely remove the option, but it's not clear yet which one is the better approach.

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

M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/device/device_denoising.cpp
M	intern/cycles/device/device_denoising.h
M	intern/cycles/device/device_task.h
M	intern/cycles/device/opencl/opencl_base.cpp
M	intern/cycles/filter/filter_prefilter.h
M	intern/cycles/filter/filter_reconstruction.h
M	intern/cycles/filter/filter_transform.h
M	intern/cycles/filter/filter_transform_gpu.h
M	intern/cycles/filter/filter_transform_sse.h
M	intern/cycles/filter/kernels/cpu/filter_cpu.h
M	intern/cycles/filter/kernels/cpu/filter_cpu_impl.h
M	intern/cycles/filter/kernels/cuda/filter.cu
M	intern/cycles/filter/kernels/opencl/filter.cl
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/buffers.h
M	intern/cycles/render/film.cpp
M	intern/cycles/render/film.h
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	source/tools

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

diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index fcad7615ff7..f5e91d9565b 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -597,9 +597,7 @@ class CyclesRender_PT_denoising(CyclesButtonsPanel, Panel):
         sub = col.column(align=True)
         sub.prop(rl, "denoising_radius")
         sub.prop(rl, "denoising_strength", slider=True)
-        sub.prop(rl, "denoising_weighting_adjust", slider=True)
-        sub.prop(rl, "denoising_gradients")
-        sub.prop(rl, "denoising_cross")
+        sub.prop(rl, "denoising_relative_pca")
 
         sub = col.column(align=True)
         row = sub.row(align=True)
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index a0732f58bef..1535193270d 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -517,14 +517,10 @@ void BlenderSession::render()
 		if(!b_layer_iter->denoising_subsurface_direct()) scene->film->denoising_flags |= DENOISING_CLEAN_SUBSURFACE_DIR;
 		if(!b_layer_iter->denoising_subsurface_indirect()) scene->film->denoising_flags |= DENOISING_CLEAN_SUBSURFACE_IND;
 		scene->film->denoising_clean_pass = (scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES);
-		scene->film->denoising_split_pass = b_layer_iter->denoising_cross();
 		buffer_params.denoising_clean_pass = scene->film->denoising_clean_pass;
-		buffer_params.denoising_split_pass = scene->film->denoising_split_pass;
 		session->params.denoising_radius = b_layer_iter->denoising_radius();
-		session->params.denoising_pca_threshold = (b_layer_iter->denoising_strength() == 0.0f)? 1e-3f : copysignf(powf(10.0f, -fabsf(b_layer_iter->denoising_strength())*2.0f), b_layer_iter->denoising_strength());
-		session->params.denoising_weight_adjust = powf(2.0f, b_layer_iter->denoising_weighting_adjust() - 1.0f);
-		session->params.denoising_use_gradients = b_layer_iter->denoising_gradients();
-		session->params.denoising_use_cross = b_layer_iter->denoising_cross();
+		session->params.denoising_k2 = powf(2.0f, b_layer_iter->denoising_strength() - 1.0f);
+		session->params.denoising_relative_pca = b_layer_iter->denoising_relative_pca();
 
 		scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold();
 		scene->film->tag_passes_update(scene, passes);
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 9dbe9527fc1..8e41d618809 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -174,10 +174,10 @@ public:
 	KernelFunctions<void(*)(KernelGlobals *, uchar4 *, float *, float, int, int, int, int)>       convert_to_byte_kernel;
 	KernelFunctions<void(*)(KernelGlobals *, uint4 *, float4 *, float*, int, int, int, int, int)> shader_kernel;
 
-	KernelFunctions<void(*)(int, TilesInfo*, int, int, float*, float*, float*, float*, float*, int*, int, int, bool, bool)> filter_divide_shadow_kernel;
-	KernelFunctions<void(*)(int, TilesInfo*, int, int, int, int, float*, float*, int*, int, int, bool, bool)>               filter_get_feature_kernel;
-	KernelFunctions<void(*)(int, int, float*, float*, float*, float*, int*, int)>                                           filter_combine_halves_kernel;
-	KernelFunctions<void(*)(int, int, int, float*, int, int, int, int)>                                                     filter_divide_combined_kernel;
+	KernelFunctions<void(*)(int, TilesInfo*, int, int, float*, float*, float*, float*, float*, int*, int, int, bool)> filter_divide_shadow_kernel;
+	KernelFunctions<void(*)(int, TilesInfo*, int, int, int, int, float*, float*, int*, int, int, bool)>               filter_get_feature_kernel;
+	KernelFunctions<void(*)(int, int, float*, float*, float*, float*, int*, int)>                                     filter_combine_halves_kernel;
+	KernelFunctions<void(*)(int, int, int, float*, int, int, int, int)>                                               filter_divide_combined_kernel;
 
 	KernelFunctions<void(*)(int, int, float*, float*, float*, int*, int, int, float, float)> filter_nlm_calc_difference_kernel;
 	KernelFunctions<void(*)(float*, float*, int*, int, int)>                                 filter_nlm_blur_kernel;
@@ -185,7 +185,7 @@ public:
 	KernelFunctions<void(*)(int, int, float*, float*, float*, float*, int*, int, int)>       filter_nlm_update_output_kernel;
 	KernelFunctions<void(*)(float*, float*, int*, int)>                                      filter_nlm_normalize_kernel;
 
-	KernelFunctions<void(*)(int, float*, int, int, int, float*, int*, int*, int, int, float)>                                         filter_construct_transform_kernel;
+	KernelFunctions<void(*)(int, float*, int, int, int, float*, int*, int*, int, int, bool)>                                          filter_construct_transform_kernel;
 	KernelFunctions<void(*)(int, int, float*, float*, float*, float*, float*, int*, float*, float3*, int*, int*, int, int, int, int)> filter_nlm_construct_gramian_kernel;
 	KernelFunctions<void(*)(int, int, int, int, int, float*, int*, float*, float3*, int*, int)>                                       filter_finalize_kernel;
 
@@ -456,7 +456,7 @@ public:
 				                                    &task->rect.x,
 				                                    task->buffer.pass_stride,
 				                                    task->radius,
-				                                    task->pca_threshold);
+				                                    task->relative_pca);
 			}
 		}
 		return true;
@@ -565,7 +565,6 @@ public:
 				                              &task->rect.x,
 				                              task->render_buffer.pass_stride,
 				                              task->render_buffer.denoising_data_offset,
-				                              task->use_gradients,
 				                              task->use_split_variance);
 			}
 		}
@@ -590,7 +589,6 @@ public:
 				                            &task->rect.x,
 				                            task->render_buffer.pass_stride,
 				                            task->render_buffer.denoising_data_offset,
-				                            task->use_cross_denoising,
 				                            task->use_split_variance);
 			}
 		}
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index a19d02f7039..5bfaacb2d29 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1022,7 +1022,7 @@ public:
 		                &task->filter_area,
 		                &task->rect,
 		                &task->radius,
-		                &task->pca_threshold,
+		                &task->relative_pca,
 		                &task->buffer.pass_stride};
 		CUDA_LAUNCH_KERNEL(cuFilterConstructTransform, args);
 		cuda_assert(cuCtxSynchronize());
@@ -1198,7 +1198,6 @@ public:
 		                &task->rect,
 		                &task->render_buffer.pass_stride,
 		                &task->render_buffer.denoising_data_offset,
-		                &task->use_gradients,
 		                &task->use_split_variance};
 		CUDA_LAUNCH_KERNEL(cuFilterDivideShadow, args);
 		cuda_assert(cuCtxSynchronize());
@@ -1234,7 +1233,6 @@ public:
 		                &task->rect,
 		                &task->render_buffer.pass_stride,
 		                &task->render_buffer.denoising_data_offset,
-		                &task->use_cross_denoising,
 		                &task->use_split_variance};
 		CUDA_LAUNCH_KERNEL(cuFilterGetFeature, args);
 		cuda_assert(cuCtxSynchronize());
diff --git a/intern/cycles/device/device_denoising.cpp b/intern/cycles/device/device_denoising.cpp
index 72a56435eca..c6df83ab372 100644
--- a/intern/cycles/device/device_denoising.cpp
+++ b/intern/cycles/device/device_denoising.cpp
@@ -23,10 +23,8 @@ CCL_NAMESPACE_BEGIN
 void DenoisingTask::init_from_devicetask(const DeviceTask &task)
 {
 	radius = task.denoising_radius;
-	pca_threshold = task.denoising_pca_threshold;
-	nlm_k_2 = task.denoising_weight_adjust;
-	use_cross_denoising = task.denoising_use_cross;
-	use_gradients = task.denoising_use_gradients;
+	nlm_k_2 = task.denoising_k2;
+	relative_pca = task.denoising_relative_pca;
 
 	render_buffer.pass_stride = task.pass_stride;
 	render_buffer.denoising_data_offset  = task.pass_denoising_data;
@@ -68,7 +66,7 @@ void DenoisingTask::tiles_from_rendertiles(RenderTile *rtiles)
 bool DenoisingTask::run_denoising()
 {
 	/* Allocate denoising buffer. */
-	buffer.passes = use_cross_denoising? 20 : 14;
+	buffer.passes = 14;
 	buffer.w = align_up(rect.z - rect.x, 4);
 	buffer.h = rect.w - rect.y;
 	buffer.pass_stride = align_up(buffer.w * buffer.h, device->mem_get_offset_alignment());
@@ -145,11 +143,11 @@ bool DenoisingTask::run_denoising()
 	/* Copy color passes. */
 	{
 		device_ptr color_pass, color_var_pass;
-		int mean_from[]     = {20, 21, 22, 26, 27, 28};
-		int variance_from[] = {23, 24, 25, 29, 30, 31};
-		int mean_to[]       = { 8,  9, 10, 14, 15, 16};
-		int variance_to[]   = {11, 12, 13, 17, 18, 19};
-		int num_color_passes = use_cross_denoising? 6 : 3;
+		int mean_from[]     = {20, 21, 22};
+		int variance_from[] = {23, 24, 25};
+		int mean_to[]       = { 8,  9, 10};
+		int variance_to[]   = {11, 12, 13};
+		int num_color_passes = 3;
 		for(int pass = 0; pass < num_color_passes; pass++) {
 			color_pass     = device->mem_get_offset_ptr(buffer.mem,     mean_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
 			color_var_pass = device->mem_get_offset_ptr(buffer.mem, variance_to[pass]*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
@@ -180,72 +178,19 @@ bool DenoisingTask::run_denoising()
 	device->mem_alloc("Denoising XtWX", storage.XtWX, MEM_READ_WRITE);
 	device->mem_alloc("Denoising XtWY", storage.XtWY, MEM_READ_WRITE);
 
-	if(use_cross_denoising) {
-		device_only_memory<float> output_a;
-		device_only_memory<float> output_b;
-		output_a.resize(buffer.w*buffer.h*3);
-		output_b.resize(buffer.w*buffer.h*3);
-		device->mem_alloc("Denoising Split Output A", output_a, MEM_READ_WRITE);
-		device->mem_alloc("Denoising Split Output B", output_b, MEM_READ_WRITE);
-
-
-		reconstruction_state.filter_rect   = make_int4(filter_area.x-rect.x, filter_area.y-rect.y, stor

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list