[Bf-blender-cvs] [2e922c98703] temp-cycles-denoising: Cycles Denoising: Add option to store feature passes in the render result
Lukas Stockner
noreply at git.blender.org
Thu May 4 14:20:51 CEST 2017
Commit: 2e922c98703318cb9648e1fa3dacbbab3d1b5489
Author: Lukas Stockner
Date: Thu May 4 02:20:22 2017 +0200
Branches: temp-cycles-denoising
https://developer.blender.org/rB2e922c98703318cb9648e1fa3dacbbab3d1b5489
Cycles Denoising: Add option to store feature passes in the render result
Useful for debugging and possibly in the future in combination with a standalone animation denoising mode
===================================================================
M intern/cycles/blender/addon/engine.py
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_sync.cpp
M intern/cycles/blender/blender_sync.h
M intern/cycles/kernel/filter/filter_prefilter.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/buffers.cpp
M intern/cycles/render/buffers.h
===================================================================
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index affeef994d4..b2694a285b1 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -238,3 +238,15 @@ def register_passes(engine, scene, srl):
if crl.pass_debug_bvh_traversed_instances: engine.register_pass(scene, srl, "Debug BVH Traversed Instances", 1, "X", 'VALUE')
if crl.pass_debug_bvh_intersections: engine.register_pass(scene, srl, "Debug BVH Intersections", 1, "X", 'VALUE')
if crl.pass_debug_ray_bounces: engine.register_pass(scene, srl, "Debug Ray Bounces", 1, "X", 'VALUE')
+
+ if crl.use_denoising and crl.denoising_store_passes:
+ engine.register_pass(scene, srl, "Denoising Normal", 3, "XYZ", 'VECTOR');
+ engine.register_pass(scene, srl, "Denoising Normal Variance", 3, "XYZ", 'VECTOR');
+ engine.register_pass(scene, srl, "Denoising Albedo", 3, "RGB", 'COLOR');
+ engine.register_pass(scene, srl, "Denoising Albedo Variance", 3, "RGB", 'COLOR');
+ engine.register_pass(scene, srl, "Denoising Depth", 1, "Z", 'VALUE');
+ engine.register_pass(scene, srl, "Denoising Depth Variance", 1, "Z", 'VALUE');
+ engine.register_pass(scene, srl, "Denoising Shadow A", 3, "XYV", 'VECTOR');
+ engine.register_pass(scene, srl, "Denoising Shadow B", 3, "XYV", 'VECTOR');
+ engine.register_pass(scene, srl, "Denoising Image", 3, "RGB", 'COLOR');
+ engine.register_pass(scene, srl, "Denoising Image Variance", 3, "RGB", 'COLOR');
\ No newline at end of file
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 6f912fe3fb0..2ac1a1aacdf 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1263,6 +1263,11 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
description="When removing that don't carry information, use a relative threshold instead of an absolute one (can help to reduce artifacts, but might cause detail loss around edges)",
default=False,
)
+ cls.denoising_store_passes = BoolProperty(
+ name="Store denoising passes",
+ description="Store the denoising feature passes and the noisy image",
+ default=False,
+ )
@classmethod
def unregister(cls):
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 6e2a0b9c208..339a1030d5e 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -530,6 +530,12 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
col.prop(rl, "use_pass_emit", text="Emission")
col.prop(rl, "use_pass_environment")
+ if context.scene.cycles.feature_set == 'EXPERIMENTAL':
+ col.separator()
+ sub = col.column()
+ sub.active = crl.use_denoising
+ sub.prop(crl, "denoising_store_passes", text="Denoising")
+
if _cycles.with_cycles_debug:
col = layout.column()
col.prop(crl, "pass_debug_bvh_traversed_nodes")
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index aebbc9e3fff..8196a64a69e 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -689,6 +689,12 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
/* copy pixels */
read = buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]);
}
+ else {
+ int denoising_offset = BlenderSync::get_denoising_pass(b_pass);
+ if(denoising_offset >= 0) {
+ read = buffers->get_denoising_pass_rect(denoising_offset, exposure, sample, components, &pixels[0]);
+ }
+ }
if(!read) {
memset(&pixels[0], 0, pixels.size()*sizeof(float));
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 17d2378b7ab..6dc0fd3df2a 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -525,8 +525,32 @@ PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
return PASS_NONE;
}
+int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
+{
+ string name = b_pass.name();
+ if(name.substr(0, 10) != "Denoising ") {
+ return -1;
+ }
+ name = name.substr(10);
+
+#define MAP_PASS(passname, offset) if(name == passname) return offset;
+ MAP_PASS("Normal", DENOISING_PASS_NORMAL);
+ MAP_PASS("Normal Variance", DENOISING_PASS_NORMAL_VAR);
+ MAP_PASS("Albedo", DENOISING_PASS_ALBEDO);
+ MAP_PASS("Albedo Variance", DENOISING_PASS_ALBEDO_VAR);
+ MAP_PASS("Depth", DENOISING_PASS_DEPTH);
+ MAP_PASS("Depth Variance", DENOISING_PASS_DEPTH_VAR);
+ MAP_PASS("Shadow A", DENOISING_PASS_SHADOW_A);
+ MAP_PASS("Shadow B", DENOISING_PASS_SHADOW_B);
+ MAP_PASS("Image", DENOISING_PASS_COLOR);
+ MAP_PASS("Image Variance", DENOISING_PASS_COLOR_VAR);
+#undef MAP_PASS
+
+ return -1;
+}
+
array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
- BL::SceneRenderLayer& b_srlay)
+ BL::SceneRenderLayer& b_srlay)
{
array<Pass> passes;
Pass::add(PASS_COMBINED, passes);
@@ -544,8 +568,20 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
Pass::add(pass_type, passes);
}
-#ifdef __KERNEL_DEBUG__
PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
+ if(get_boolean(crp, "denoising_store_passes")) {
+ b_engine.add_pass("Denoising Normal", 3, "XYZ", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Albedo", 3, "RGB", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Depth", 1, "Z", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Image", 3, "RGB", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_srlay.name().c_str());
+ }
+#ifdef __KERNEL_DEBUG__
if(get_boolean(crp, "pass_debug_bvh_traversed_nodes")) {
b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", b_srlay.name().c_str());
Pass::add(PASS_BVH_TRAVERSED_NODES, passes);
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index aee39a5652a..0950285d976 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -96,6 +96,7 @@ public:
int width, int height);
static PassType get_pass_type(BL::RenderPass& b_pass);
+ static int get_denoising_pass(BL::RenderPass& b_pass);
private:
/* sync */
diff --git a/intern/cycles/kernel/filter/filter_prefilter.h b/intern/cycles/kernel/filter/filter_prefilter.h
index 470448a0b88..b35f4c421fb 100644
--- a/intern/cycles/kernel/filter/filter_prefilter.h
+++ b/intern/cycles/kernel/filter/filter_prefilter.h
@@ -42,27 +42,27 @@ ccl_device void kernel_filter_divide_shadow(int sample,
int ytile = (y < tiles->y[1])? 0: ((y < tiles->y[2])? 1: 2);
int tile = ytile*3+xtile;
- ccl_global float ccl_restrict_ptr buffer = (ccl_global float*) tiles->buffers[tile];
int offset = tiles->offsets[tile];
int stride = tiles->strides[tile];
- ccl_global float ccl_restrict_ptr center_buffer = buffer + (y*stride + x + offset)*buffer_pass_stride + buffer_denoising_offset;
+ ccl_global float ccl_restrict_ptr center_buffer = (ccl_global float*) tiles->buffers[tile];
+ center_buffer += (y*stride + x + offset)*buffer_pass_stride;
+ center_buffer += buffer_denoising_offset + 14;
int buffer_w = align_up(rect.z - rect.x, 4);
int idx = (y-rect.y)*buffer_w + (x - rect.x);
- unfilteredA[idx] = center_buffer[15] / max(center_buffer[14], 1e-7f);
- unfilteredB[idx] = center_buffer[18] / max(center_buffer[17], 1e-7f);
+ unfilteredA[idx] = center_buffer[1] / max(center_buffer[0], 1e-7f);
+ unfilteredB[idx] = center_buffer[4] / max(center_buffer[3], 1e-7f);
- float varA, varB;
+ float varA = center_buffer[2];
+ float varB = center_buffer[5];
int odd_sample = (sample+1)/2;
int even_sample = sample/2;
if(use_split_variance) {
- varA = max(0.0f, (center_buffer[16] - unfilteredA[idx]*unfilteredA[idx]*odd_sample) / (odd_sample - 1));
- varB = max(0.0f, (center_buffer[19] - unfilteredB[idx]*unfilteredB[idx]*even_sample) / (even_sample - 1));
- }
- else {
- varA = center_buffer[16] / (odd_sample - 1);
- varB = center_buffer[19] / (even_sample - 1);
+ varA = max(0.0f, varA - unfilteredA[idx]*unfilteredA[idx]*odd_sample);
+ varB = max(0.0f, varB - unfilteredB[idx]*unfilteredB[idx]*even_sample);
}
+ varA /= (odd_sample - 1);
+ varB /= (even_sample - 1);
sampleVariance[idx] = 0.5f*(varA + varB) / sample;
sampleVarianceV[idx] = 0.5f * (varA - varB) * (varA - varB) / (sample*sample);
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index bf860e1ae6c..dd1fa1b82f7 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -399,11 +399,15 @@ typedef enum PassType {
typedef enum DenoisingPassOffsets {
DENOISING_PASS_NORMAL = 0,
+ DENOISING_PASS_NORMAL_VAR = 3,
DENOISING_PASS_ALBEDO = 6,
+ DENOISING_PASS_ALBEDO_VAR = 9,
DENOISING_PASS_DEPTH = 12,
+ DENOISING_PASS_DEPTH_VAR = 13,
DENOISING_PASS_SHADOW_A = 14,
DENOISING_PASS_SHADOW_B = 17,
DENOISING_PASS_COLOR = 20,
+ DENOISING_PASS_COLOR_VAR = 23,
DENOISING_PASS_SIZE_BASE = 26,
DENOISING_PASS_SIZE_CLEAN = 3,
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index e6
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list