[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43693] trunk/blender: Cycles: Render Passes

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jan 25 18:24:02 CET 2012


Revision: 43693
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43693
Author:   blendix
Date:     2012-01-25 17:23:52 +0000 (Wed, 25 Jan 2012)
Log Message:
-----------
Cycles: Render Passes

Currently supported passes:
* Combined, Z, Normal, Object Index, Material Index, Emission, Environment,
  Diffuse/Glossy/Transmission x Direct/Indirect/Color

Not supported yet:
* UV, Vector, Mist

Only enabled for CPU devices at the moment, will do GPU tweaks tommorrow,
also for environment importance sampling.

Documentation:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Passes

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_object.cpp
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/device/device_cpu.cpp
    trunk/blender/intern/cycles/kernel/CMakeLists.txt
    trunk/blender/intern/cycles/kernel/kernel.cl
    trunk/blender/intern/cycles/kernel/kernel.cpp
    trunk/blender/intern/cycles/kernel/kernel.cu
    trunk/blender/intern/cycles/kernel/kernel.h
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_film.h
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_optimized.cpp
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_random.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/buffers.cpp
    trunk/blender/intern/cycles/render/buffers.h
    trunk/blender/intern/cycles/render/film.cpp
    trunk/blender/intern/cycles/render/film.h
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/object.h
    trunk/blender/intern/cycles/render/shader.cpp
    trunk/blender/intern/cycles/render/shader.h
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/rna_render.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/blender/nodes/composite/node_composite_tree.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_image.c
    trunk/blender/source/blender/render/intern/source/render_result.c

Added Paths:
-----------
    trunk/blender/intern/cycles/kernel/kernel_accumulate.h
    trunk/blender/intern/cycles/kernel/kernel_passes.h

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2012-01-25 17:23:52 UTC (rev 43693)
@@ -183,6 +183,38 @@
 
         layout.separator()
 
+        split = layout.split()
+
+        col = split.column()
+        col.label(text="Passes:")
+        col.prop(rl, "use_pass_combined")
+        col.prop(rl, "use_pass_z")
+        col.prop(rl, "use_pass_normal")
+        col.prop(rl, "use_pass_object_index")
+        col.prop(rl, "use_pass_material_index")
+        col.prop(rl, "use_pass_emit")
+        col.prop(rl, "use_pass_environment")
+
+        col = split.column()
+        col.label()
+        col.label(text="Diffuse:")
+        row = col.row(align=True)
+        row.prop(rl, "use_pass_diffuse_direct", text="Direct", toggle=True)
+        row.prop(rl, "use_pass_diffuse_indirect", text="Indirect", toggle=True)
+        row.prop(rl, "use_pass_diffuse_color", text="Color", toggle=True)
+        col.label(text="Glossy:")
+        row = col.row(align=True)
+        row.prop(rl, "use_pass_glossy_direct", text="Direct", toggle=True)
+        row.prop(rl, "use_pass_glossy_indirect", text="Indirect", toggle=True)
+        row.prop(rl, "use_pass_glossy_color", text="Color", toggle=True)
+        col.label(text="Transmission:")
+        row = col.row(align=True)
+        row.prop(rl, "use_pass_transmission_direct", text="Direct", toggle=True)
+        row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
+        row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
+
+        layout.separator()
+
         rl = rd.layers[0]
         layout.prop(rl, "material_override", text="Material")
 

Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp	2012-01-25 17:23:52 UTC (rev 43693)
@@ -214,6 +214,7 @@
 	/* object sync */
 	if(object_updated || (object->mesh && object->mesh->need_update)) {
 		object->name = b_ob.name().c_str();
+		object->pass_id = b_ob.pass_index();
 		object->tfm = tfm;
 
 		/* visibility flags for both parent */

Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp	2012-01-25 17:23:52 UTC (rev 43693)
@@ -116,9 +116,68 @@
 	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_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_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_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_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_EMIT:
+			return PASS_EMISSION;
+		case BL::RenderPass::type_ENVIRONMENT:
+			return PASS_BACKGROUND;
+
+		case BL::RenderPass::type_DIFFUSE:
+		case BL::RenderPass::type_SHADOW:
+		case BL::RenderPass::type_AO:
+		case BL::RenderPass::type_COLOR:
+		case BL::RenderPass::type_REFRACTION:
+		case BL::RenderPass::type_SPECULAR:
+		case BL::RenderPass::type_REFLECTION:
+		case BL::RenderPass::type_VECTOR:
+		case BL::RenderPass::type_MIST:
+			return PASS_NONE;
+	}
+	
+	return PASS_NONE;
+}
+
 void BlenderSession::render()
 {
 	/* get buffer parameters */
+	SessionParams session_params = BlenderSync::get_session_params(b_userpref, b_scene, background);
 	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height);
 	int w = buffer_params.width, h = buffer_params.height;
 
@@ -143,6 +202,25 @@
 		/* set layer */
 		b_rlay = *b_iter;
 
+		/* add passes */
+		if(session_params.device.type == DEVICE_CPU) { /* todo */
+			BL::RenderLayer::passes_iterator b_pass_iter;
+			
+			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);
+
+				if(pass_type != PASS_NONE)
+					Pass::add(pass_type, buffer_params.passes);
+			}
+		}
+
+		scene->film->passes = buffer_params.passes;
+		scene->film->need_update = true;
+
+		/* update session */
+		session->reset(buffer_params, session_params.samples);
+
 		/* update scene */
 		sync->sync_data(b_v3d, active);
 
@@ -165,22 +243,41 @@
 {
 	/* get state */
 	RenderBuffers *buffers = session->buffers;
+
+	/* copy data from device */
+	if(!buffers->copy_from_device())
+		return;
+
+	BufferParams& params = buffers->params;
 	float exposure = scene->film->exposure;
 	double total_time, sample_time;
 	int sample;
+
 	session->progress.get_sample(sample, total_time, sample_time);
 
-	/* get pixels */
-	float4 *pixels = buffers->copy_from_device(exposure, sample);
+	vector<float> pixels(params.width*params.height*4);
 
-	if(!pixels)
-		return;
+	/* copy each pass */
+	BL::RenderLayer::passes_iterator b_iter;
+	
+	for(b_rlay.passes.begin(b_iter); b_iter != b_rlay.passes.end(); ++b_iter) {
+		BL::RenderPass b_pass(*b_iter);
 
-	/* write pixels */
-	rna_RenderLayer_rect_set(&b_rlay.ptr, (float*)pixels);
+		/* find matching pass type */
+		PassType pass_type = get_pass_type(b_pass);
+		int components = b_pass.channels();
+
+		/* copy pixels */
+		if(buffers->get_pass(pass_type, exposure, sample, components, &pixels[0]))
+			rna_RenderPass_rect_set(&b_pass.ptr, &pixels[0]);
+	}
+
+	/* copy combined pass */
+	if(buffers->get_pass(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+		rna_RenderLayer_rect_set(&b_rlay.ptr, &pixels[0]);
+
+	/* tag result as updated */
 	RE_engine_update_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
-
-	delete [] pixels;
 }
 
 void BlenderSession::synchronize()

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-01-25 17:23:52 UTC (rev 43693)
@@ -636,6 +636,7 @@
 			ShaderGraph *graph = new ShaderGraph();
 
 			shader->name = b_mat->name().c_str();
+			shader->pass_id = b_mat->pass_index();
 
 			/* create nodes */
 			if(b_mat->use_nodes() && b_mat->node_tree()) {

Modified: trunk/blender/intern/cycles/device/device_cpu.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cpu.cpp	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/device/device_cpu.cpp	2012-01-25 17:23:52 UTC (rev 43693)
@@ -162,7 +162,7 @@
 		if(system_cpu_support_optimized()) {
 			for(int y = task.y; y < task.y + task.h; y++) {
 				for(int x = task.x; x < task.x + task.w; x++)
-					kernel_cpu_optimized_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state,
+					kernel_cpu_optimized_path_trace(kg, (float*)task.buffer, (unsigned int*)task.rng_state,
 						task.sample, x, y, task.offset, task.stride);
 
 				if(tasks.worker_cancel())
@@ -174,7 +174,7 @@
 		{
 			for(int y = task.y; y < task.y + task.h; y++) {
 				for(int x = task.x; x < task.x + task.w; x++)
-					kernel_cpu_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state,
+					kernel_cpu_path_trace(kg, (float*)task.buffer, (unsigned int*)task.rng_state,
 						task.sample, x, y, task.offset, task.stride);
 
 				if(tasks.worker_cancel())
@@ -194,7 +194,7 @@
 		if(system_cpu_support_optimized()) {
 			for(int y = task.y; y < task.y + task.h; y++)
 				for(int x = task.x; x < task.x + task.w; x++)
-					kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer,
+					kernel_cpu_optimized_tonemap(kg, (uchar4*)task.rgba, (float*)task.buffer,
 						task.sample, task.resolution, x, y, task.offset, task.stride);
 		}
 		else
@@ -202,7 +202,7 @@
 		{
 			for(int y = task.y; y < task.y + task.h; y++)
 				for(int x = task.x; x < task.x + task.w; x++)
-					kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float4*)task.buffer,
+					kernel_cpu_tonemap(kg, (uchar4*)task.rgba, (float*)task.buffer,
 						task.sample, task.resolution, x, y, task.offset, task.stride);
 		}
 	}

Modified: trunk/blender/intern/cycles/kernel/CMakeLists.txt
===================================================================
--- trunk/blender/intern/cycles/kernel/CMakeLists.txt	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/kernel/CMakeLists.txt	2012-01-25 17:23:52 UTC (rev 43693)
@@ -15,6 +15,7 @@
 
 set(SRC_HEADERS
 	kernel.h
+	kernel_accumulate.h
 	kernel_bvh.h
 	kernel_camera.h
 	kernel_compat_cpu.h
@@ -30,6 +31,7 @@
 	kernel_mbvh.h
 	kernel_montecarlo.h
 	kernel_object.h
+	kernel_passes.h
 	kernel_path.h
 	kernel_qbvh.h
 	kernel_random.h

Modified: trunk/blender/intern/cycles/kernel/kernel.cl
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel.cl	2012-01-25 16:14:24 UTC (rev 43692)
+++ trunk/blender/intern/cycles/kernel/kernel.cl	2012-01-25 17:23:52 UTC (rev 43693)
@@ -28,7 +28,7 @@
 
 __kernel void kernel_ocl_path_trace(
 	__constant KernelData *data,
-	__global float4 *buffer,
+	__global float *buffer,
 	__global uint *rng_state,
 
 #define KERNEL_TEX(type, ttype, name) \
@@ -56,7 +56,7 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list