[Bf-blender-cvs] [b0a9dc25882] temp_cryptomatte: Added crypto matte output for Cycles

Stefan Werner noreply at git.blender.org
Fri Nov 3 21:09:36 CET 2017


Commit: b0a9dc25882a701b0d50e6db5e3573476ebe5625
Author: Stefan Werner
Date:   Thu Apr 6 13:23:54 2017 +0200
Branches: temp_cryptomatte
https://developer.blender.org/rBb0a9dc25882a701b0d50e6db5e3573476ebe5625

Added crypto matte output for Cycles

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_passes.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_types.h
M	intern/cycles/kernel/svm/svm_aov.h
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/film.cpp
M	intern/cycles/render/film.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/object.cpp
M	intern/cycles/util/CMakeLists.txt
M	intern/cycles/util/util_hash.h
A	intern/cycles/util/util_murmurhash.h

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index ebd4f8e2d9b..25e7fdee6f1 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1207,6 +1207,11 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
                 )
         cls.aovs = bpy.props.CollectionProperty(type=CyclesAOVSettings)
         cls.active_aov = IntProperty(default=0)
+        cls.use_pass_crypto_object = BoolProperty(
+                name="CryptoMatte Object",
+                description="CryptoMatte Object pass",
+                default=False,
+                )
 
     @classmethod
     def unregister(cls):
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 1f3950a1898..382a35201c3 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -572,6 +572,7 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
           col.prop(crl, "pass_debug_bvh_intersections")
           col.prop(crl, "pass_debug_ray_bounces")
 
+
         layout.label("AOVs:")
         crl = rl.cycles
         row = layout.row()
@@ -579,6 +580,9 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
         sub = row.column(align=True)
         sub.operator("scenerenderlayer.aov_add", icon='ZOOMIN', text="")
         sub.operator("scenerenderlayer.aov_delete", icon='ZOOMOUT', text="")
+			
+        row = layout.row()
+        row.prop(crl, "use_pass_crypto_object")
 
 class CyclesRender_PT_views(CyclesButtonsPanel, Panel):
     bl_label = "Views"
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index b133f4dbf8e..242a5cf4c0d 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -564,11 +564,19 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
 			Pass::add(PASS_RAY_BOUNCES, passes);
 		}
 #endif
-
+		/* make Crypto passes appear before user defined AOVs
+		 * that way, their indices are known */
+		if(get_boolean(crp, "use_pass_crypto_object")) {
+			AOV aov = {ustring("Cryptomatte Object ID"), 9999, AOV_CRYPTOMATTE};
+			passes.add(aov);
+			b_engine.add_pass("AOV Cryptomatte Object ID", 4, "RGBA", b_srlay.name().c_str());
+			scene->film->use_cryptomatte = true;
+		}
+		
 		RNA_BEGIN(&crp, b_aov, "aovs") {
 			bool is_color = RNA_enum_get(&b_aov, "type");
 			string name = get_string(b_aov, "name");
-			AOV aov = { ustring(name), 9999, is_color };
+			AOV aov = {ustring(name), 9999, is_color ? AOV_RGB : AOV_FLOAT};
 			passes.add(aov);
 			string passname = string_printf("AOV %s", name.c_str());
 			b_engine.add_pass(passname.c_str(), is_color ? 3 : 1, is_color ? "RGB" : "X", b_srlay.name().c_str());
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index 6ecdfe0173a..aedd38f4d06 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -32,7 +32,8 @@ enum ObjectTransform {
 	OBJECT_INVERSE_TRANSFORM = 4,
 	OBJECT_TRANSFORM_MOTION_POST = 4,
 	OBJECT_PROPERTIES = 8,
-	OBJECT_DUPLI = 9
+	OBJECT_DUPLI = 9,
+	OBJECT_CRYPTOMATTE = 11
 };
 
 enum ObjectVectorTransform {
@@ -329,6 +330,18 @@ ccl_device int shader_pass_id(KernelGlobals *kg, const ShaderData *sd)
 	return kernel_tex_fetch(__shader_flag, (sd->shader & SHADER_MASK)*SHADER_SIZE + 1);
 }
 
+/* Cryptomatte ID */
+
+ccl_device_inline float object_cryptomatte_id(KernelGlobals *kg, int object)
+{
+	if(object == OBJECT_NONE)
+		return 0;
+	
+	int offset = object*OBJECT_SIZE + OBJECT_CRYPTOMATTE;
+	float4 f = kernel_tex_fetch(__objects, offset);
+	return f.x;
+}
+
 /* Particle data from which object was instanced */
 
 ccl_device_inline float particle_index(KernelGlobals *kg, int particle)
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 90e04b7bf5b..cee2b6a9029 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -60,6 +60,38 @@ ccl_device_inline void kernel_write_pass_float4(ccl_global float *buffer, int sa
 #endif  /* __SPLIT_KERNEL__ */
 }
 
+ccl_device_inline void kernel_write_id_slots(ccl_global float *buffer, int num_slots, float id, float weight, bool init)
+{
+	kernel_assert(id != ID_NONE);
+
+	if(init) {
+		for(int slot = 0; slot < num_slots; slot++) {
+			buffer[slot*ID_SLOT_SIZE + 0] = ID_NONE;
+			buffer[slot*ID_SLOT_SIZE + 1] = 0.0f;
+		}
+	} else {
+		init = false;
+	}
+
+	for(int slot = 0; slot < num_slots; slot++) {
+		float *slot_id = (&buffer[slot*ID_SLOT_SIZE + 0]);
+		float *slot_weight = &buffer[slot*ID_SLOT_SIZE + 1];
+
+		/* If the loop reaches an empty slot, the ID isn't in any slot yet - so add it! */
+		if(*slot_weight == 0.0f) {
+			kernel_assert(*slot_id == ID_NONE);
+			*slot_id = id;
+			*slot_weight = weight;
+			break;
+		}
+		/* If there already is a slot for that ID, add the weight. */
+		else if(*slot_id == id) {
+			*slot_weight += weight;
+			break;
+		}
+	}
+}
+
 ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global float *buffer, PathRadiance *L,
 	ShaderData *sd, int sample, ccl_addr_space PathState *state, float3 throughput)
 {
@@ -108,8 +140,8 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
 				kernel_write_pass_float4(buffer + kernel_data.film.pass_motion, sample, speed);
 				kernel_write_pass_float(buffer + kernel_data.film.pass_motion_weight, sample, 1.0f);
 			}
-
-			for(int i = 0; kernel_data.film.pass_aov[i]; i++) {
+			
+			for(int i = 1; kernel_data.film.pass_aov[i]; i++) {
 				if((state->written_aovs & (1 << i)) == 0) {
 					bool is_color = (kernel_data.film.pass_aov[i] & (1 << 31));
 					int pass_offset = (kernel_data.film.pass_aov[i] & ~(1 << 31));
@@ -126,7 +158,19 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
 			state->flag |= PATH_RAY_SINGLE_PASS_DONE;
 		}
 	}
-
+	
+	// TODO: Write cryptomatte AOV
+	if(kernel_data.film.use_cryptomatte) {
+		float matte_weight = state->matte_weight * (1.0f - average(shader_bsdf_transparency(kg, sd)));
+		bool initialize_slots = (sample == 0) && (state->transparent_bounce == 0);
+		float id = object_cryptomatte_id(kg, sd->object);
+		int pass_offset = (kernel_data.film.pass_aov[0] & ~(1 << 31));
+		kernel_assert(kernel_data.film.pass_aov[0] & (1 << 31));
+		kernel_write_id_slots(buffer + pass_offset, 2, id, matte_weight, initialize_slots);
+		state->written_aovs |= (1 << 0);
+	}
+	// end TODO
+	
 	if(flag & (PASS_DIFFUSE_INDIRECT|PASS_DIFFUSE_COLOR|PASS_DIFFUSE_DIRECT))
 		L->color_diffuse += shader_bsdf_diffuse(kg, sd)*throughput;
 	if(flag & (PASS_GLOSSY_INDIRECT|PASS_GLOSSY_COLOR|PASS_GLOSSY_DIRECT))
diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h
index 9dde053fc61..b89bd7b4c58 100644
--- a/intern/cycles/kernel/kernel_path_branched.h
+++ b/intern/cycles/kernel/kernel_path_branched.h
@@ -572,10 +572,13 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in
 				&sd, &indirect_sd, &emission_sd, throughput, 1.0f, &hit_state, &L);
 
 			/* continue in case of transparency */
-			throughput *= shader_bsdf_transparency(kg, &sd);
+			float3 transparency = shader_bsdf_transparency(kg, &sd);
+			throughput *= transparency;
 
 			if(is_zero(throughput))
 				break;
+			
+			state.matte_weight *= average(transparency);
 		}
 
 		/* Update Path State */
diff --git a/intern/cycles/kernel/kernel_path_state.h b/intern/cycles/kernel/kernel_path_state.h
index e5c5334811c..899c7b11cb4 100644
--- a/intern/cycles/kernel/kernel_path_state.h
+++ b/intern/cycles/kernel/kernel_path_state.h
@@ -40,7 +40,7 @@ ccl_device_inline void path_state_init(KernelGlobals *kg,
 #ifdef __LAMP_MIS__
 	state->ray_t = 0.0f;
 #endif
-
+	state->matte_weight = 1.0f;
 	state->written_aovs = 0;
 
 #ifdef __VOLUME__
diff --git a/intern/cycles/kernel/kernel_path_surface.h b/intern/cycles/kernel/kernel_path_surface.h
index bd4ba775b4d..0c7d1b76729 100644
--- a/intern/cycles/kernel/kernel_path_surface.h
+++ b/intern/cycles/kernel/kernel_path_surface.h
@@ -297,14 +297,18 @@ ccl_device bool kernel_path_surface_bounce(KernelGlobals *kg,
 		path_radiance_bsdf_bounce(L, throughput, &bsdf_eval, bsdf_pdf, state->bounce, label);
 
 		/* set labels */
-		if(!(label & LABEL_TRANSPARENT)) {
+		if(label & LABEL_TRANSPARENT) {
+			state->matte_weight *= average(shader_bsdf_transparency(kg, sd));
+		}
+		else {
 			state->ray_pdf = bsdf_pdf;
 #ifdef __LAMP_MIS__
 			state->ray_t = 0.0f;
 #endif
 			state->min_ray_pdf = fminf(bsdf_pdf, state->min_ray_pdf);
 		}
-
+		state->matte_weight = 0.0f;
+		
 		/* update path state */
 		path_state_next(kg, state, label);
 
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index b587f7c434b..7aac3d2cad3 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -43,6 +43,7 @@ CCL_NAMESPACE_BEGIN
 #define SHUTTER_TABLE_SIZE		256
 #define PARTICLE_SIZE 		5
 #define SHADER_SIZE		5
+#define ID_SLOT_SIZE	2
 
 #define BSSRDF_MIN_RADIUS			1e-8f
 #define BSSRDF_MAX_HITS				4
@@ -53,6 +54,7 @@ CCL_NAMESPACE_BEGIN
 #define OBJECT_NONE				(~0)
 #define PRIM_NONE				(~0)
 #define LAMP_NONE				(~0)
+#define ID_NONE					(0.0f)
 
 #define VOLUME_STACK_SIZE		16
 
@@ -971,6 +973,8 @@ typedef struct PathState {
 
 	int written_aovs;
 
+	float matte_weight;
+	
 	/* volume rendering */
 #ifdef __VOLUME__
 	int volume_bounce;
@@ -1134,7 +1138,7 @@ typedef struct KernelFilm {
 	int pass_shadow;
 	float pass_shadow_scale;
 	int filter_table_offset;
-	int pass_pad2;
+	int use_cryptomatte;
 
 	int pass_mist;
 	float mist_start;
diff --git a/intern/cycles/kernel/svm/svm_aov.h b/intern/cycles/kernel/svm/svm_aov.h
index 6e628eb004f..f5b50234a6f 100644
--- a/intern/cycles/kernel/svm/svm_aov.h
+++ b/intern/cycles/kernel/svm/svm_aov.h
@@ -20,7 +20,7 @@ ccl_device void svm_node_aov_write_float3(KernelGlobals *kg,
 	float3 val = stack_load_float3(stack, offset);
 
 	int pass_offset = (kernel_data.film.pass_aov[aov] & ~(1 << 31));
-	assert(kernel_data.film.pass_aov[aov] & (1 << 31));
+	ke

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list