[Bf-blender-cvs] [efde83e1cb2] temp_cryptomatte: Cycles: Added cryptomatte outputs for material IDs

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


Commit: efde83e1cb268ba36eec9572554bf88106661baa
Author: Stefan Werner
Date:   Sun Apr 9 13:37:06 2017 +0200
Branches: temp_cryptomatte
https://developer.blender.org/rBefde83e1cb268ba36eec9572554bf88106661baa

Cycles: Added cryptomatte outputs for material IDs

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

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/kernel_passes.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_types.h
A	intern/cycles/kernel/kernel_types.h.rej
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/film.cpp
M	intern/cycles/render/film.h
M	intern/cycles/render/shader.cpp
M	source/blender/compositor/nodes/COM_CryptomatteNode.cpp

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 25e7fdee6f1..a637fac6ff8 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1212,7 +1212,16 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
                 description="CryptoMatte Object pass",
                 default=False,
                 )
-
+        cls.use_pass_crypto_material = BoolProperty(
+                name="CryptoMatte Material",
+                description="CryptoMatte Material pass",
+                default=False,
+                )
+        cls.pass_crypto_depth = IntProperty(
+                name="CryptoMatte Depth",
+                description="CryptoMatte Depth",
+                default=4, min=2, max=16, step=2,
+                )
     @classmethod
     def unregister(cls):
         del bpy.types.SceneRenderLayer.cycles
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 382a35201c3..2648f0d6508 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -572,17 +572,21 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
           col.prop(crl, "pass_debug_bvh_intersections")
           col.prop(crl, "pass_debug_ray_bounces")
 
+        crl = rl.cycles
+        layout.label("Cryptomatte:")
+        row = layout.row(align=True)
+        row.prop(crl, "use_pass_crypto_object", text="Object", toggle=True)
+        row.prop(crl, "use_pass_crypto_material", text="Material", toggle=True)
+        row = layout.row(align=True)
+        row.prop(crl, "pass_crypto_depth")
 
         layout.label("AOVs:")
-        crl = rl.cycles
         row = layout.row()
         row.template_list("CyclesAOVList", "", crl, "aovs", crl, "active_aov")
         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 242a5cf4c0d..5fcdab8e5fc 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -566,11 +566,30 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
 #endif
 		/* make Crypto passes appear before user defined AOVs
 		 * that way, their indices are known */
+		
+		int crypto_depth = std::min(16, get_int(crp, "pass_crypto_depth")) / 2;
+		scene->film->use_cryptomatte = crypto_depth;
+		
 		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;
+			for(int i = 0; i < crypto_depth; ++i) {
+				string passname = string_printf("uCryptoObject%02d", i);
+				AOV aov = {ustring(passname), 9999, AOV_CRYPTOMATTE};
+				passes.add(aov);
+				passname = "AOV " + passname;
+				b_engine.add_pass(passname.c_str(), 4, "RGBA", b_srlay.name().c_str());
+			}
+			scene->film->use_cryptomatte |= CRYPT_OBJECT;
+		}
+		
+		if(get_boolean(crp, "use_pass_crypto_material")) {
+			for(int i = 0; i < crypto_depth; ++i) {
+				string passname = string_printf("uCryptoMaterial%02d", i);
+				AOV aov = {ustring(passname), 9999, AOV_CRYPTOMATTE};
+				passes.add(aov);
+				passname = "AOV " + passname;
+				b_engine.add_pass(passname.c_str(), 4, "RGBA", b_srlay.name().c_str());
+			}
+			scene->film->use_cryptomatte |= CRYPT_MATERIAL;
 		}
 		
 		RNA_BEGIN(&crp, b_aov, "aovs") {
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index ce8ad4df9e4..9c4121b96c1 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -161,6 +161,7 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
 			state->flag |= PATH_RAY_SINGLE_PASS_DONE;
 		}
 	}
+	int aov_count = 0;
 	
 	// TODO: Write cryptomatte AOV
 	if(kernel_data.film.use_cryptomatte) {
@@ -169,8 +170,19 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
 		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);
+		kernel_write_id_slots(buffer + pass_offset, kernel_data.film.use_cryptomatte & 255, id, matte_weight, initialize_slots);
 		state->written_aovs |= (1 << 0);
+		aov_count++;
+	}
+	if(kernel_data.film.use_cryptomatte & CRYPT_MATERIAL) {
+		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 = shader_cryptomatte_id(kg, sd->shader);
+		int pass_offset = (kernel_data.film.pass_aov[aov_count] & ~(1 << 31));
+		kernel_assert(kernel_data.film.pass_aov[aov_count] & (1 << 31));
+		kernel_write_id_slots(buffer + pass_offset, kernel_data.film.use_cryptomatte & 255, id, matte_weight, initialize_slots);
+		state->written_aovs |= (1 << aov_count);
+		aov_count++;
 	}
 	// end TODO
 	
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index a80c95fe5aa..e94edaea0f8 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -1136,5 +1136,10 @@ ccl_device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect
 }
 #endif
 
+ccl_device float shader_cryptomatte_id(KernelGlobals *kg, int shader)
+{
+	return __int_as_float(kernel_tex_fetch(__shader_flag, (shader & SHADER_MASK) * SHADER_SIZE + 13));
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 7aac3d2cad3..6d9653475fa 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -42,7 +42,7 @@ CCL_NAMESPACE_BEGIN
 #define RAMP_TABLE_SIZE		256
 #define SHUTTER_TABLE_SIZE		256
 #define PARTICLE_SIZE 		5
-#define SHADER_SIZE		5
+#define SHADER_SIZE		6
 #define ID_SLOT_SIZE	2
 
 #define BSSRDF_MIN_RADIUS			1e-8f
@@ -398,6 +398,12 @@ typedef enum PassType {
 
 #define PASS_ALL (~0)
 
+typedef enum CryptomatteType {
+	CRYPT_NONE = 0,
+	CRYPT_OBJECT = (1 << 31),
+	CRYPT_MATERIAL = (1 << 30),
+} CryptomatteType;
+
 typedef enum BakePassFilter {
 	BAKE_FILTER_NONE = 0,
 	BAKE_FILTER_DIRECT = (1 << 0),
@@ -1138,7 +1144,7 @@ typedef struct KernelFilm {
 	int pass_shadow;
 	float pass_shadow_scale;
 	int filter_table_offset;
-	int use_cryptomatte;
+	unsigned int use_cryptomatte;
 
 	int pass_mist;
 	float mist_start;
diff --git a/intern/cycles/kernel/kernel_types.h.rej b/intern/cycles/kernel/kernel_types.h.rej
new file mode 100644
index 00000000000..35976e0cb1f
--- /dev/null
+++ b/intern/cycles/kernel/kernel_types.h.rej
@@ -0,0 +1,10 @@
+diff a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h	(rejected hunks)
+@@ -42,7 +42,7 @@ CCL_NAMESPACE_BEGIN
+ #define RAMP_TABLE_SIZE		256
+ #define SHUTTER_TABLE_SIZE		256
+ #define PARTICLE_SIZE 		5
+-#define SHADER_SIZE		13
++#define SHADER_SIZE		14
+ #define ID_SLOT_SIZE	2
+ 
+ #define BSSRDF_MIN_RADIUS			1e-8f
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 8f1d2705764..2e4d54a7bcc 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -183,7 +183,7 @@ bool RenderBuffers::get_aov_rect(ustring name, float exposure, int sample, int c
 				pixels[0] = f.y > f.w ? f.x : f.z;
 				pixels[1] = (f.y > f.w ? f.y : f.w)*scale;
 				pixels[2] = f.y > f.w ? f.z : f.x;
-				pixels[3] = (f.y > f.w ? f.w : f.y)*scale;;
+				pixels[3] = (f.y > f.w ? f.w : f.y)*scale;
 			}
 			break;
 		default:
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 22c9c141e42..75720ea840b 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -249,7 +249,7 @@ Pass* PassSettings::get_pass(PassType type, int &offset)
 		}
 		else if(passes[i].type == PASS_AOV_VALUE) {
 			for(size_t i = 0; i < aovs.size(); i++) {
-				if(!aovs[i].type == AOV_FLOAT) {
+				if(aovs[i].type == AOV_FLOAT) {
 					offset += 1;
 				}
 			}
@@ -385,7 +385,8 @@ Film::Film()
 {
 	use_light_visibility = false;
 	filter_table_offset = TABLE_OFFSET_INVALID;
-
+	use_cryptomatte = CRYPT_NONE;
+	
 	need_update = true;
 }
 
@@ -535,7 +536,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
 				break;
 			case PASS_AOV_VALUE:
 				for(int j = 0; j < passes.aovs.size(); j++) {
-					if(!passes.aovs[j].type == AOV_FLOAT) {
+					if(passes.aovs[j].type == AOV_FLOAT) {
 						kfilm->pass_aov[j] = kfilm->pass_stride & ~(1 << 31);
 						kfilm->pass_stride += 1;
 					}
diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h
index ffdd7506fa8..a3a75798543 100644
--- a/intern/cycles/render/film.h
+++ b/intern/cycles/render/film.h
@@ -110,7 +110,7 @@ public:
 
 	bool use_light_visibility;
 	bool use_sample_clamp;
-	bool use_cryptomatte;
+	int use_cryptomatte;
 
 	bool need_update;
 	
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index ef89288f167..7c7b4f49e56 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -30,6 +30,7 @@
 #include "render/tables.h"
 
 #include "util/util_foreach.h"
+#include "util/util_murmurhash.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -464,14 +465,18 @@ void ShaderManager::device_update_common(Device *device,
 		float3 constant_emission = make_float3(0.0f, 0.0f, 0.0f);
 		if(shader->is_constant_emission(&constant_emission))
 			flag |= SD_HAS_CONSTANT_EMISSION;
-
+		
+		uint32_t cryptomatte_id = 0;
+		MurmurHash3_x86_32(shader->name.c_str(), shader->name.length(), 0, &cryptomatte_id);
+		
 		/* regular shader */
 		shader_flag[i++] = flag;
 		shader_flag[i++] = shader->pass_id;
 		shader_flag[i+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list