[Bf-blender-cvs] [5bf2b6f] experimental-build: Cycles: Experimental proof-of-concept LWR denoising v2

Lukas Stockner noreply at git.blender.org
Wed Mar 30 17:41:29 CEST 2016


Commit: 5bf2b6facead2ed98e2076dd47337e61d6280a7c
Author: Lukas Stockner
Date:   Thu Aug 20 19:20:44 2015 +0200
Branches: experimental-build
https://developer.blender.org/rB5bf2b6facead2ed98e2076dd47337e61d6280a7c

Cycles: Experimental proof-of-concept LWR denoising v2

This commit adds a proof-of-concept implementation of the LWR image denoising algorithm to Cycles.
To use it, just activate the new checkbox in the Sampling settings.
Some features (such as viewport rendering) might be broken, so this is definitely not suitable
for doing actual work with it yet.

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/device/device_task.h
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h
M	intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
M	intern/cycles/kernel/closure/bsdf_diffuse.h
M	intern/cycles/kernel/closure/bsdf_hair.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/closure/bsdf_oren_nayar.h
M	intern/cycles/kernel/closure/bsdf_reflection.h
M	intern/cycles/kernel/closure/bsdf_refraction.h
M	intern/cycles/kernel/closure/bsdf_toon.h
M	intern/cycles/kernel/closure/bsdf_transparent.h
M	intern/cycles/kernel/kernel_accumulate.h
A	intern/cycles/kernel/kernel_filter.h
M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/kernel/kernel_path.h
M	intern/cycles/kernel/kernel_path_branched.h
M	intern/cycles/kernel/kernel_path_state.h
M	intern/cycles/kernel/kernel_path_surface.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/kernels/cpu/kernel_cpu.h
M	intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
M	intern/cycles/kernel/kernels/cuda/kernel.cu
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	intern/cycles/render/tile.cpp
M	intern/cycles/render/tile.h
M	intern/cycles/util/CMakeLists.txt
M	intern/cycles/util/util_atomic.h
M	intern/cycles/util/util_math.h

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 01aa619..0dd5a16 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -255,6 +255,63 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
                 default='USE',
                 )
 
+        cls.use_filtering = BoolProperty(
+                name="Use LWR filtering",
+                description="Apply a post-processing filter to the image that removes noise at the cost of accuracy",
+                default=False,
+                )
+        cls.filter_half_window = IntProperty(
+                name="Half Window",
+                description="Radius of the LWR filter window (larger values produce smoother results, but take longer to filter and potentially lose more detail)",
+                min=2, max=64,
+                default=5,
+                )
+        cls.filter_bandwidth_factor = FloatProperty(
+                name="Bandwidth factor",
+                description="Controls the strength of the filtering - 0 is the automatically selected strength (and should be fine for most scenes, except for hair/fur)",
+                min=-2, max=2,
+                default=0,
+                )
+
+        cls.filter_diffuse_direct = BoolProperty(
+                name="Diffuse Direct",
+                description="Filter the diffuse direct pass separately",
+                default=False,
+                )
+        cls.filter_diffuse_indirect = BoolProperty(
+                name="Diffuse Indirect",
+                description="Filter the diffuse indirect pass separately",
+                default=False,
+                )
+        cls.filter_glossy_direct = BoolProperty(
+                name="Glossy Direct",
+                description="Filter the glossy direct pass separately",
+                default=False,
+                )
+        cls.filter_glossy_indirect = BoolProperty(
+                name="Glossy Indirect",
+                description="Filter the glossy indirect pass separately",
+                default=False,
+                )
+        cls.filter_transmission_direct = BoolProperty(
+                name="Transmission Direct",
+                description="Filter the transmission direct pass separately",
+                default=False,
+                )
+        cls.filter_transmission_indirect = BoolProperty(
+                name="Transmissison Indirect",
+                description="Filter the transmission indirect pass separately",
+                default=False,
+                )
+
+        cls.prepass_samples = IntProperty(
+                name="Prepass Samples",
+                description="Number of samples to render before the remaining samples are rendered"
+                            "in order to give a faster preview of the result",
+                min=0, max=16384,
+                default=0,
+                )
+
         cls.sample_all_lights_direct = BoolProperty(
                 name="Sample All Direct Lights",
                 description="Sample all lights (for direct samples), rather than randomly picking one",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index b9e51df..a2fc55c 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -200,6 +200,22 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
         if not (use_opencl(context) and cscene.feature_set != 'EXPERIMENTAL'):
             layout.row().prop(cscene, "sampling_pattern", text="Pattern")
 
+        row = layout.row()
+        sub = row.column()
+        sub.prop(cscene, "use_filtering")
+        if cscene.use_filtering:
+            sub.prop(cscene, "filter_half_window")
+            sub.prop(cscene, "filter_bandwidth_factor", slider=True)
+            col = sub.column(align=True)
+            row = col.row(align=True)
+            row.prop(cscene, "filter_diffuse_direct", toggle=True)
+            row.prop(cscene, "filter_glossy_direct", toggle=True)
+            row.prop(cscene, "filter_transmission_direct", toggle=True)
+            row = col.row(align=True)
+            row.prop(cscene, "filter_diffuse_indirect", toggle=True)
+            row.prop(cscene, "filter_glossy_indirect", toggle=True)
+            row.prop(cscene, "filter_transmission_indirect", toggle=True)
+
         for rl in scene.render.layers:
             if rl.samples > 0:
                 layout.separator()
@@ -363,6 +379,7 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
         sub.prop(rd, "tile_y", text="Y")
 
         sub.prop(cscene, "use_progressive_refine")
+        sub.prop(cscene, "prepass_samples")
 
         subsub = sub.column(align=True)
         subsub.enabled = not rd.use_border
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 92b5b72..39e9c0c 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -379,16 +379,12 @@ static void end_render_result(BL::RenderEngine& b_engine,
 	b_engine.end_result(b_rr, (int)cancel, (int)do_merge_results);
 }
 
-void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_update_only)
+void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool highlight, bool do_update_only)
 {
-	BufferParams& params = rtile.buffers->params;
-	int x = params.full_x - session->tile_manager.params.full_x;
-	int y = params.full_y - session->tile_manager.params.full_y;
-	int w = params.width;
-	int h = params.height;
-
 	/* get render result */
-	BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), b_rview_name.c_str());
+	int x = rtile.x - session->tile_manager.params.full_x;
+	int y = rtile.y - session->tile_manager.params.full_y;
+	BL::RenderResult b_rr = begin_render_result(b_engine, x, y, rtile.w, rtile.h, b_rlay_name.c_str(), b_rview_name.c_str());
 
 	/* can happen if the intersected rectangle gives 0 width or height */
 	if(b_rr.ptr.data == NULL) {
@@ -415,37 +411,37 @@ void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_upda
 			update_render_result(b_rr, b_rlay, rtile);
 		}
 
-		end_render_result(b_engine, b_rr, true, true);
+		end_render_result(b_engine, b_rr, highlight, true);
 	}
 	else {
 		/* write result */
 		write_render_result(b_rr, b_rlay, rtile);
-		end_render_result(b_engine, b_rr, false, true);
+		end_render_result(b_engine, b_rr, highlight, true);
 	}
 }
 
 void BlenderSession::write_render_tile(RenderTile& rtile)
 {
-	do_write_update_render_tile(rtile, false);
+	do_write_update_render_tile(rtile, false, false);
 }
 
-void BlenderSession::update_render_tile(RenderTile& rtile)
+void BlenderSession::update_render_tile(RenderTile& rtile, bool highlight)
 {
 	/* use final write for preview renders, otherwise render result wouldn't be
 	 * be updated in blender side
 	 * would need to be investigated a bit further, but for now shall be fine
 	 */
 	if(!b_engine.is_preview())
-		do_write_update_render_tile(rtile, true);
+		do_write_update_render_tile(rtile, highlight, true);
 	else
-		do_write_update_render_tile(rtile, false);
+		do_write_update_render_tile(rtile, false, false);
 }
 
 void BlenderSession::render()
 {
 	/* set callback to write out render results */
 	session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
-	session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1);
+	session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1, _2);
 
 	/* get buffer parameters */
 	SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
@@ -455,7 +451,7 @@ void BlenderSession::render()
 	BL::RenderSettings r = b_scene.render();
 	BL::RenderSettings::layers_iterator b_layer_iter;
 	BL::RenderResult::views_iterator b_view_iter;
-	
+
 	for(r.layers.begin(b_layer_iter); b_layer_iter != r.layers.end(); ++b_layer_iter) {
 		b_rlay_name = b_layer_iter->name();
 
@@ -493,8 +489,9 @@ void BlenderSession::render()
 		}
 
 		buffer_params.passes = passes;
+		buffer_params.lwr_passes = session_params.filter_params;
 		scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold();
-		scene->film->tag_passes_update(scene, passes);
+		scene->film->tag_passes_update(scene, passes, session_params.filter_params);
 		scene->film->tag_update(scene);
 		scene->integrator->tag_update(scene);
 
@@ -718,10 +715,9 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 	if(!buffers->copy_from_device())
 		return;
 
-	BufferParams& params = buffers->params;
 	float exposure = scene->film->exposure;
 
-	vector<float> pixels(params.width*params.height*4);
+	vector<float> pixels(rtile.w*rtile.h*4);
 
 	/* Adjust absolute sample number to the range. */
 	int sample = rtile.sample;
@@ -742,7 +738,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 			int components = b_pass.channels();
 
 			/* copy pixels */
-			if(!buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]))
+			if(!buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0], rtile.x, rtile.y, rtile.w, rtile.h))
 				memset(&pixels[0], 0, pixels.size()*sizeof(float));
 
 			b_pass.rect(&pixels[0]);
@@ -751,7 +747,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 	else {
 		/* copy combined pass */
 		BL::RenderPass b_combined_pass(b_rlay.passes.find_by_type(BL::RenderPass::type_COMBINED, b_rview_name.c_str()));
-		if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+		if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0], rtile.x, rtile.y, rtile.w, rtile.h))
 			b_combined_pass.rect(&pixels[0]);
 	}
 
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 66a6945..80da467 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -79,7 +79,7 @@ public:
 	void update_render_result(BL::RenderResult& b_rr,
 	              

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list