[Bf-blender-cvs] [32ac01b1b94] temp_cryptomatte: Cycles: Cryptomatte now also has a more accurate CPU only mode that keeps a per-pixel map of coverage

Stefan Werner noreply at git.blender.org
Fri Nov 3 21:10:06 CET 2017


Commit: 32ac01b1b943833ab112d0b09b5293dba2f1b1c1
Author: Stefan Werner
Date:   Tue Jul 18 16:04:08 2017 +0200
Branches: temp_cryptomatte
https://developer.blender.org/rB32ac01b1b943833ab112d0b09b5293dba2f1b1c1

Cycles: Cryptomatte now also has a more accurate CPU only mode that keeps a per-pixel map of coverage

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/kernel/kernel_globals.h
M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/CMakeLists.txt
A	intern/cycles/render/coverage.cpp
A	intern/cycles/render/coverage.h

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index ea5fdc6510c..dc4e17f3717 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1320,6 +1320,12 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
                 default=4, min=2, max=16, step=2,
                 update=update_render_passes,
                 )
+        cls.pass_crypto_accurate = BoolProperty(
+                name="CryptoMatte Accurate",
+                description="Gernate a more accurate CryptoMatte pass, CPU only, may render slower and use more memory",
+                default=True,
+                update=update_render_passes,
+                )
     @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 b5ab9dd69f2..acf1ad6371d 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -588,6 +588,9 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
         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.active = use_cpu(context)
+        row.prop(crl, "pass_crypto_accurate", text="Accurate Mode")
+        row = layout.row(align=True)
         row.prop(crl, "pass_crypto_depth")
 
         layout.label("AOVs:")
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index dae50a5138b..47689ad8474 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -600,6 +600,10 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
 			}
 			scene->film->use_cryptomatte |= CRYPT_MATERIAL;
 		}
+
+		if(get_boolean(crp, "pass_crypto_accurate")) {
+			scene->film->use_cryptomatte |= CRYPT_ACCURATE;
+		}
 		
 		RNA_BEGIN(&crp, b_aov, "aovs") {
 			bool is_color = RNA_enum_get(&b_aov, "type");
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 29bb1f91a40..3c7af96c2b6 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -52,6 +52,8 @@
 #include "util/util_system.h"
 #include "util/util_thread.h"
 
+#include "render/coverage.h"
+
 CCL_NAMESPACE_BEGIN
 
 class CPUDevice;
@@ -611,8 +613,21 @@ public:
 		return true;
 	}
 
-	void path_trace(DeviceTask &task, RenderTile &tile, KernelGlobals *kg)
+	void path_trace(DeviceTask &task, RenderTile &tile, KernelGlobals *kg, vector<map<float, float> >& coverage_object, vector<map<float, float> >& coverage_material)
 	{
+		kg->coverage_object = kg->coverage_material = NULL;
+
+		if(kg->__data.film.use_cryptomatte & CRYPT_ACCURATE) {
+			if(kg->__data.film.use_cryptomatte & CRYPT_OBJECT) {
+				coverage_object.clear();
+				coverage_object.resize(tile.w * tile.h);
+			}
+			if(kg->__data.film.use_cryptomatte & CRYPT_MATERIAL) {
+				coverage_material.clear();
+				coverage_material.resize(tile.w * tile.h);
+			}
+		}
+
 		float *render_buffer = (float*)tile.buffer;
 		uint *rng_state = (uint*)tile.rng_state;
 		int start_sample = tile.start_sample;
@@ -626,6 +641,14 @@ public:
 
 			for(int y = tile.y; y < tile.y + tile.h; y++) {
 				for(int x = tile.x; x < tile.x + tile.w; x++) {
+					if(kg->__data.film.use_cryptomatte & CRYPT_ACCURATE) {
+						if(kg->__data.film.use_cryptomatte & CRYPT_OBJECT) {
+							kg->coverage_object = &coverage_object[tile.w * (y - tile.y) + x - tile.x];
+						}
+						if(kg->__data.film.use_cryptomatte & CRYPT_MATERIAL) {
+							kg->coverage_material = &coverage_material[tile.w * (y - tile.y) + x - tile.x];
+						}
+					}
 					path_trace_kernel()(kg, render_buffer, rng_state,
 					                    sample, x, y, tile.offset, tile.stride);
 				}
@@ -699,16 +722,29 @@ public:
 		RenderTile tile;
 		while(task.acquire_tile(this, tile)) {
 			if(tile.task == RenderTile::PATH_TRACE) {
+				/* cryptomatte data. This needs a better place than here. */
+				vector<map<float, float> >coverage_object;
+				vector<map<float, float> >coverage_material;
+
 				if(use_split_kernel) {
 					device_memory data;
 					split_kernel->path_trace(&task, tile, kgbuffer, data);
 				}
 				else {
-					path_trace(task, tile, kg);
+					path_trace(task, tile, kg, coverage_object, coverage_material);
+				}
+				if(kg->__data.film.use_cryptomatte & CRYPT_ACCURATE) {
+					if(kg->__data.film.use_cryptomatte & CRYPT_OBJECT) {
+						flatten_coverage(kg, coverage_object, tile);
+					}
+					if(kg->__data.film.use_cryptomatte & CRYPT_MATERIAL) {
+						flatten_coverage(kg, coverage_material, tile);
+					}
 				}
 			}
 			else if(tile.task == RenderTile::DENOISE) {
 				denoise(task, tile);
+				task.update_progress(&tile, tile.w*tile.h);
 			}
 
 			task.release_tile(tile);
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index f95f0d98c52..0113c326c56 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -20,7 +20,9 @@
 #define __KERNEL_GLOBALS_H__
 
 #ifdef __KERNEL_CPU__
-#  include "util/util_vector.h"
+#include <vector>
+#include "util/util_vector.h"
+#include "util/util_map.h"
 #endif
 
 CCL_NAMESPACE_BEGIN
@@ -78,6 +80,10 @@ typedef struct KernelGlobals {
 
 	int2 global_size;
 	int2 global_id;
+
+	/* A buffer for storing per-pixel coverage for Cryptomatte. */
+	map<float, float> *coverage_object;
+	map<float, float> *coverage_material;
 } KernelGlobals;
 
 #endif  /* __KERNEL_CPU__ */
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 334f83a205c..9640a3207a1 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -296,29 +296,57 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
 		}
 	}
 	int aov_count = 0;
-	
-	// TODO: Write cryptomatte AOV
+
 	if(kernel_data.film.use_cryptomatte & CRYPT_OBJECT) {
 		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 *(kernel_data.film.use_cryptomatte & 255), id, matte_weight, initialize_slots);
-		state->written_aovs |= (1 << 0);
-		aov_count += kernel_data.film.use_cryptomatte & 255;
+		if(matte_weight > 0.0f) {
+			float id = object_cryptomatte_id(kg, sd->object);
+	#ifdef __KERNEL_CPU__
+			if(kg->coverage_object) {
+				if((sample == 0) && (state->transparent_bounce == 0)) {
+					(*kg->coverage_object)[id] = matte_weight;
+				} else {
+					(*kg->coverage_object)[id] += matte_weight;
+				}
+			}
+			else {
+	#endif /* __KERNEL_CPU__ */
+				bool initialize_slots = (sample == 0) && (state->transparent_bounce == 0);
+				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 * (kernel_data.film.use_cryptomatte & 255), id, matte_weight, initialize_slots);
+				state->written_aovs |= (1 << 0);
+				aov_count += kernel_data.film.use_cryptomatte & 255;
+	#ifdef __KERNEL_CPU__
+			}
+	#endif /* __KERNEL_CPU__ */
+		}
 	}
 	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, 2 * (kernel_data.film.use_cryptomatte & 255), id, matte_weight, initialize_slots);
-		state->written_aovs |= (1 << aov_count);
-		aov_count += kernel_data.film.use_cryptomatte & 255;
+		if(matte_weight > 0.0f) {
+			float id = shader_cryptomatte_id(kg, sd->shader);
+	#ifdef __KERNEL_CPU__
+			if(kg->coverage_material) {
+				if((sample == 0) && (state->transparent_bounce == 0)) {
+					(*kg->coverage_material)[id] = matte_weight;
+				} else {
+					(*kg->coverage_material)[id] += matte_weight;
+				}
+			}
+			else {
+	#endif /* __KERNEL_CPU__ */
+				bool initialize_slots = (sample == 0) && (state->transparent_bounce == 0);
+				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, 2 * (kernel_data.film.use_cryptomatte & 255), id, matte_weight, initialize_slots);
+				state->written_aovs |= (1 << aov_count);
+				aov_count += kernel_data.film.use_cryptomatte & 255;
+	#ifdef __KERNEL_CPU__
+			}
+	#endif /* __KERNEL_CPU__ */
+		}
 	}
-	// end TODO
 	
 	if(flag & (PASS_DIFFUSE_INDIRECT|PASS_DIFFUSE_COLOR|PASS_DIFFUSE_DIRECT))
 		L->color_diffuse += shader_bsdf_diffuse(kg, sd)*throughput;
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index f5d5c5941df..f9bc1b9e008 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -409,6 +409,7 @@ typedef enum CryptomatteType {
 	CRYPT_NONE = 0,
 	CRYPT_OBJECT = (1 << 31),
 	CRYPT_MATERIAL = (1 << 30),
+	CRYPT_ACCURATE = (1 << 29),
 } CryptomatteType;
 
 typedef enum DenoisingPassOffsets {
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 17ac66644e2..ce2344b9c35 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -15,6 +15,7 @@ set(SRC
 	buffers.cpp
 	camera.cpp
 	constant_fold.cpp
+	coverage.cpp
 	film.cpp
 	graph.cpp
 	image.cpp
@@ -44,6 +45,7 @@ set(SRC_HEADERS
 	buffers.h
 	camera.h
 	constant_fold.h
+	coverage.h
 	film.h
 	graph.h
 	image.h
diff --git a/intern/cycles/render/coverage.cpp b/intern/cycles/render/coverage.cpp


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list