[Bf-blender-cvs] [f3300db] soc-2016-cycles_denoising: Cycles: Implement RenderResult -> RenderBuffers import

Lukas Stockner noreply at git.blender.org
Wed Jul 6 04:28:53 CEST 2016


Commit: f3300db92112129f3ebd3104a598a6b3b0146a5e
Author: Lukas Stockner
Date:   Wed Jul 6 04:13:16 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBf3300db92112129f3ebd3104a598a6b3b0146a5e

Cycles: Implement RenderResult -> RenderBuffers import

This commit adds a function that takes an existing RenderResult and copies the passes
to newly created RenderBuffers. That will later be used to copy the rendered image
back for post-processing denoising.

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

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/blender/blender_sync.h
M	intern/cycles/render/buffers.cpp

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

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4ec1dde..63f5626 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -238,86 +238,6 @@ void BlenderSession::free_session()
 	delete session;
 }
 
-static PassType get_pass_type(BL::RenderPass& b_pass)
-{
-	switch(b_pass.type()) {
-		case BL::RenderPass::type_COMBINED:
-			return PASS_COMBINED;
-
-		case BL::RenderPass::type_Z:
-			return PASS_DEPTH;
-		case BL::RenderPass::type_MIST:
-			return PASS_MIST;
-		case BL::RenderPass::type_NORMAL:
-			return PASS_NORMAL;
-		case BL::RenderPass::type_OBJECT_INDEX:
-			return PASS_OBJECT_ID;
-		case BL::RenderPass::type_UV:
-			return PASS_UV;
-		case BL::RenderPass::type_VECTOR:
-			return PASS_MOTION;
-		case BL::RenderPass::type_MATERIAL_INDEX:
-			return PASS_MATERIAL_ID;
-
-		case BL::RenderPass::type_DIFFUSE_DIRECT:
-			return PASS_DIFFUSE_DIRECT;
-		case BL::RenderPass::type_GLOSSY_DIRECT:
-			return PASS_GLOSSY_DIRECT;
-		case BL::RenderPass::type_TRANSMISSION_DIRECT:
-			return PASS_TRANSMISSION_DIRECT;
-		case BL::RenderPass::type_SUBSURFACE_DIRECT:
-			return PASS_SUBSURFACE_DIRECT;
-
-		case BL::RenderPass::type_DIFFUSE_INDIRECT:
-			return PASS_DIFFUSE_INDIRECT;
-		case BL::RenderPass::type_GLOSSY_INDIRECT:
-			return PASS_GLOSSY_INDIRECT;
-		case BL::RenderPass::type_TRANSMISSION_INDIRECT:
-			return PASS_TRANSMISSION_INDIRECT;
-		case BL::RenderPass::type_SUBSURFACE_INDIRECT:
-			return PASS_SUBSURFACE_INDIRECT;
-
-		case BL::RenderPass::type_DIFFUSE_COLOR:
-			return PASS_DIFFUSE_COLOR;
-		case BL::RenderPass::type_GLOSSY_COLOR:
-			return PASS_GLOSSY_COLOR;
-		case BL::RenderPass::type_TRANSMISSION_COLOR:
-			return PASS_TRANSMISSION_COLOR;
-		case BL::RenderPass::type_SUBSURFACE_COLOR:
-			return PASS_SUBSURFACE_COLOR;
-
-		case BL::RenderPass::type_EMIT:
-			return PASS_EMISSION;
-		case BL::RenderPass::type_ENVIRONMENT:
-			return PASS_BACKGROUND;
-		case BL::RenderPass::type_AO:
-			return PASS_AO;
-		case BL::RenderPass::type_SHADOW:
-			return PASS_SHADOW;
-
-		case BL::RenderPass::type_DIFFUSE:
-		case BL::RenderPass::type_COLOR:
-		case BL::RenderPass::type_REFRACTION:
-		case BL::RenderPass::type_SPECULAR:
-		case BL::RenderPass::type_REFLECTION:
-			return PASS_NONE;
-#ifdef WITH_CYCLES_DEBUG
-		case BL::RenderPass::type_DEBUG:
-		{
-			if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSAL_STEPS)
-				return PASS_BVH_TRAVERSAL_STEPS;
-			if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSED_INSTANCES)
-				return PASS_BVH_TRAVERSED_INSTANCES;
-			if(b_pass.debug_type() == BL::RenderPass::debug_type_RAY_BOUNCES)
-				return PASS_RAY_BOUNCES;
-			break;
-		}
-#endif
-	}
-	
-	return PASS_NONE;
-}
-
 static ShaderEvalType get_shader_type(const string& pass_type)
 {
 	const char *shader_type = pass_type.c_str();
@@ -492,7 +412,7 @@ void BlenderSession::render()
 
 			for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != b_rlay.passes.end(); ++b_pass_iter) {
 				BL::RenderPass b_pass(*b_pass_iter);
-				PassType pass_type = get_pass_type(b_pass);
+				PassType pass_type = BlenderSync::get_pass_type(b_pass);
 
 				if(pass_type == PASS_MOTION && scene->integrator->motion_blur)
 					continue;
@@ -759,7 +679,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 		return;
 
 	BufferParams& params = buffers->params;
-	float exposure = scene->film->exposure;
+	float exposure = scene? scene->film->exposure : 1.0f;
 
 	int4 rect = make_int4(rtile.x + params.overscan, rtile.y + params.overscan,
 	                      rtile.x+rtile.w - params.overscan, rtile.y+rtile.h - params.overscan);
@@ -790,7 +710,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 			}
 			else {
 				/* find matching pass type */
-				PassType pass_type = get_pass_type(b_pass);
+				PassType pass_type = BlenderSync::get_pass_type(b_pass);
 
 				if(!buffers->get_pass_rect(pass_type, exposure, sample, components, rect, &pixels[0]))
 					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 33084f1..f1bbc3d 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -675,5 +675,147 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
 	return params;
 }
 
+PassType BlenderSync::get_pass_type(BL::RenderPass& b_pass)
+{
+	switch(b_pass.type()) {
+		case BL::RenderPass::type_COMBINED:
+			return PASS_COMBINED;
+
+		case BL::RenderPass::type_Z:
+			return PASS_DEPTH;
+		case BL::RenderPass::type_MIST:
+			return PASS_MIST;
+		case BL::RenderPass::type_NORMAL:
+			return PASS_NORMAL;
+		case BL::RenderPass::type_OBJECT_INDEX:
+			return PASS_OBJECT_ID;
+		case BL::RenderPass::type_UV:
+			return PASS_UV;
+		case BL::RenderPass::type_VECTOR:
+			return PASS_MOTION;
+		case BL::RenderPass::type_MATERIAL_INDEX:
+			return PASS_MATERIAL_ID;
+
+		case BL::RenderPass::type_DIFFUSE_DIRECT:
+			return PASS_DIFFUSE_DIRECT;
+		case BL::RenderPass::type_GLOSSY_DIRECT:
+			return PASS_GLOSSY_DIRECT;
+		case BL::RenderPass::type_TRANSMISSION_DIRECT:
+			return PASS_TRANSMISSION_DIRECT;
+		case BL::RenderPass::type_SUBSURFACE_DIRECT:
+			return PASS_SUBSURFACE_DIRECT;
+
+		case BL::RenderPass::type_DIFFUSE_INDIRECT:
+			return PASS_DIFFUSE_INDIRECT;
+		case BL::RenderPass::type_GLOSSY_INDIRECT:
+			return PASS_GLOSSY_INDIRECT;
+		case BL::RenderPass::type_TRANSMISSION_INDIRECT:
+			return PASS_TRANSMISSION_INDIRECT;
+		case BL::RenderPass::type_SUBSURFACE_INDIRECT:
+			return PASS_SUBSURFACE_INDIRECT;
+
+		case BL::RenderPass::type_DIFFUSE_COLOR:
+			return PASS_DIFFUSE_COLOR;
+		case BL::RenderPass::type_GLOSSY_COLOR:
+			return PASS_GLOSSY_COLOR;
+		case BL::RenderPass::type_TRANSMISSION_COLOR:
+			return PASS_TRANSMISSION_COLOR;
+		case BL::RenderPass::type_SUBSURFACE_COLOR:
+			return PASS_SUBSURFACE_COLOR;
+
+		case BL::RenderPass::type_EMIT:
+			return PASS_EMISSION;
+		case BL::RenderPass::type_ENVIRONMENT:
+			return PASS_BACKGROUND;
+		case BL::RenderPass::type_AO:
+			return PASS_AO;
+		case BL::RenderPass::type_SHADOW:
+			return PASS_SHADOW;
+
+		case BL::RenderPass::type_DIFFUSE:
+		case BL::RenderPass::type_COLOR:
+		case BL::RenderPass::type_REFRACTION:
+		case BL::RenderPass::type_SPECULAR:
+		case BL::RenderPass::type_REFLECTION:
+			return PASS_NONE;
+#ifdef WITH_CYCLES_DEBUG
+		case BL::RenderPass::type_DEBUG:
+		{
+			if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSAL_STEPS)
+				return PASS_BVH_TRAVERSAL_STEPS;
+			if(b_pass.debug_type() == BL::RenderPass::debug_type_BVH_TRAVERSED_INSTANCES)
+				return PASS_BVH_TRAVERSED_INSTANCES;
+			if(b_pass.debug_type() == BL::RenderPass::debug_type_RAY_BOUNCES)
+				return PASS_RAY_BOUNCES;
+			break;
+		}
+#endif
+	}
+
+	return PASS_NONE;
+}
+
+RenderBuffers* BlenderSync::get_render_buffer(Device *device,
+                                              BL::RenderLayer& b_rl,
+                                              BL::RenderResult& b_rr,
+                                              int samples)
+{
+	BufferParams params;
+	params.width  = params.full_width  = params.final_width  = b_rr.resolution_x();
+	params.height = params.full_height = params.final_height = b_rr.resolution_y();
+
+	params.full_x = params.full_y = 0;
+
+	BL::RenderLayer::passes_iterator b_pass;
+
+	int denoising_passes = 0;
+	for(b_rl.passes.begin(b_pass); b_pass != b_rl.passes.end(); ++b_pass) {
+		PassType type = get_pass_type(*b_pass);
+		if(type != PASS_NONE)
+			Pass::add(type, params.passes);
+
+		int extended_type = b_pass->extended_type();
+		if(extended_type) {
+			denoising_passes |= extended_type;
+			if(extended_type == EX_TYPE_DENOISE_CLEAN)
+				params.selective_denoising = true;
+		}
+	}
+	params.denoising_passes = ((~denoising_passes & EX_TYPE_DENOISE_REQUIRED) == 0);
+
+	RenderBuffers *buffer = new RenderBuffers(device);
+	buffer->reset(device, params);
+
+	int4 rect = make_int4(0, 0, params.width, params.height);
+
+	/* Some passes are divided by another pass when exporting to a RenderPass.
+	 * Therefore, these passes need to be multiplied when importing, so some passes must be imported before others. */
+	PassType import_first_array[] = {PASS_DIFFUSE_COLOR, PASS_GLOSSY_COLOR, PASS_TRANSMISSION_COLOR, PASS_SUBSURFACE_COLOR, PASS_MOTION_WEIGHT};
+	std::set<PassType> import_first(import_first_array, import_first_array + 5);
+	for(b_rl.passes.begin(b_pass); b_pass != b_rl.passes.end(); ++b_pass) {
+		if(b_pass->extended_type()) continue;
+
+		PassType type = get_pass_type(*b_pass);
+		if(!import_first.count(type)) continue;
+
+		BL::DynamicArray<float> b_rect = b_pass->rect();
+		buffer->get_pass_rect(type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
+	}
+
+	for(b_rl.passes.begin(b_pass); b_pass != b_rl.passes.end(); ++b_pass) {
+		int extended_type = b_pass->extended_type();
+		PassType type = get_pass_type(*b_pass);
+		if(import_first.count(type)) continue;
+
+		BL::DynamicArray<float> b_rect = b_pass->rect();
+		if(extended_type)
+			buffer->get_denoising_rect(extended_type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
+		else
+			buffer->get_pass_rect(type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
+	}
+
+	return buffer;
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index d690adb..74685a6 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -24,6 +24,7 @@
 
 #include "blender_util.h"
 
+#include "film.h"
 #include "scene.h"
 #include "session.h"
 
@@ -92,6 +93,12 @@ public:
 	                                      Camera *cam,
 	                                      int width, int height);
 
+	static RenderBuffers* get_render_buffer(Device *device,
+	                                        BL::RenderLayer& b_rl,
+	                                        BL::RenderResult& b_rr,
+                                                int samples);
+	static PassType get_pass_type(BL::RenderPass& b_pass);
+
 private:
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list