[Bf-blender-cvs] [c36977652aa] cycles_cryptomatte: Cycles: Initial addition of Cryptomatte ID writing.
Stefan Werner
noreply at git.blender.org
Wed Jul 11 12:20:46 CEST 2018
Commit: c36977652aa834165a95f4a803313cdb61899264
Author: Stefan Werner
Date: Wed Jul 11 00:00:48 2018 +0200
Branches: cycles_cryptomatte
https://developer.blender.org/rBc36977652aa834165a95f4a803313cdb61899264
Cycles: Initial addition of Cryptomatte ID writing.
===================================================================
M intern/cycles/blender/addon/engine.py
M intern/cycles/blender/addon/properties.py
M intern/cycles/blender/addon/ui.py
M intern/cycles/blender/blender_object.cpp
M intern/cycles/device/device_cpu.cpp
M intern/cycles/kernel/geom/geom_object.h
M intern/cycles/kernel/kernel_globals.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_shader.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
M intern/cycles/render/film.cpp
M intern/cycles/render/film.h
M intern/cycles/render/object.cpp
M intern/cycles/render/object.h
M intern/cycles/render/shader.cpp
M intern/cycles/util/CMakeLists.txt
A intern/cycles/util/util_murmurhash.h
===================================================================
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index 1f97eff9bd0..d621b3dbd5b 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -254,3 +254,13 @@ def register_passes(engine, scene, srl):
engine.register_pass(scene, srl, "Denoising Shadow B", 3, "XYV", 'VECTOR')
engine.register_pass(scene, srl, "Denoising Image", 3, "RGB", 'COLOR')
engine.register_pass(scene, srl, "Denoising Image Variance", 3, "RGB", 'COLOR')
+
+ if(crl.use_pass_crypto_object):
+ for i in range(0, crl.pass_crypto_depth, 2):
+ engine.register_pass(scene, srl, "AOV uCryptoObject" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
+ if(crl.use_pass_crypto_material):
+ for i in range(0, crl.pass_crypto_depth, 2):
+ engine.register_pass(scene, srl, "AOV uCryptoMaterial" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
+ if(srl.cycles.use_pass_crypto_asset):
+ for i in range(0, srl.cycles.pass_crypto_depth, 2):
+ engine.register_pass(scene, srl, "AOV uCryptoAsset" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 4484dcfbfd7..5267d5a5476 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1336,7 +1336,36 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
default=False,
update=update_render_passes,
)
-
+ cls.use_pass_crypto_object = BoolProperty(
+ name="CryptoMatte Object",
+ description="CryptoMatte Object pass",
+ default=False,
+ update=update_render_passes,
+ )
+ cls.use_pass_crypto_material = BoolProperty(
+ name="CryptoMatte Material",
+ description="CryptoMatte Material pass",
+ default=False,
+ update=update_render_passes,
+ )
+ cls.use_pass_crypto_asset = BoolProperty(
+ name="CryptoMatte Asset",
+ description="CryptoMatte Asset pass",
+ default=False,
+ update=update_render_passes,
+ )
+ cls.pass_crypto_depth = IntProperty(
+ name="CryptoMatte Depth",
+ description="CryptoMatte Depth",
+ 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 2b11a2eefb0..92a466812ef 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -562,6 +562,17 @@ class CYCLES_RENDER_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.prop(crl, "use_pass_crypto_asset", text="Asset", 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")
class CYCLES_RENDER_PT_views(CyclesButtonsPanel, Panel):
bl_label = "Views"
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 35bf7beda41..d229f1098f3 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -384,6 +384,23 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
object_updated = true;
}
+ /* sync the asset name for Cryptomatte */
+ BL::Object parent = b_ob.parent();
+ ustring parent_name;
+ if(parent) {
+ while(parent.parent()) {
+ parent = parent.parent();
+ }
+ parent_name = parent.name();
+ }
+ else {
+ parent_name = b_ob.name();
+ }
+ if(object->asset_name != parent_name) {
+ object->asset_name = parent_name;
+ object_updated = true;
+ }
+
/* object sync
* transform comparison should not be needed, but duplis don't work perfect
* in the depsgraph and may not signal changes, so this is a workaround */
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index be0dcc20755..e70c3e0d78c 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -53,6 +53,8 @@
#include "util/util_system.h"
#include "util/util_thread.h"
+#include "render/coverage.h"
+
CCL_NAMESPACE_BEGIN
class CPUDevice;
@@ -672,9 +674,25 @@ 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, vector<map<float, float > >& coverage_asset)
{
scoped_timer timer(&tile.buffers->render_time);
+ 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);
+ }
+ if(kg->__data.film.use_cryptomatte & CRYPT_ASSET) {
+ coverage_asset.clear();
+ coverage_asset.resize(tile.w * tile.h);
+ }
+ }
float *render_buffer = (float*)tile.buffer;
int start_sample = tile.start_sample;
@@ -688,6 +706,17 @@ 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];
+ }
+ if(kg->__data.film.use_cryptomatte & CRYPT_ASSET) {
+ kg->coverage_asset = &coverage_asset[tile.w * (y - tile.y) + x - tile.x];
+ }
+ }
path_trace_kernel()(kg, render_buffer,
sample, x, y, tile.offset, tile.stride);
}
@@ -746,17 +775,33 @@ public:
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;
+ vector<map<float, float> >coverage_asset;
+
if(use_split_kernel) {
device_only_memory<uchar> void_buffer(this, "void_buffer");
split_kernel->path_trace(&task, tile, kgbuffer, void_buffer);
}
else {
- path_trace(task, tile, kg);
+ path_trace(task, tile, kg, coverage_object, coverage_material, coverage_asset);
+ }
+ if(kg->__data.film.use_cryptomatte & CRYPT_ACCURATE) {
+ int aov_index = 0;
+ if(kg->__data.film.use_cryptomatte & CRYPT_OBJECT) {
+ aov_index += flatten_coverage(kg, coverage_object, tile, aov_index);
+ }
+ if(kg->__data.film.use_cryptomatte & CRYPT_MATERIAL) {
+ aov_index += flatten_coverage(kg, coverage_material, tile, aov_index);
+ }
+ if(kg->__data.film.use_cryptomatte & CRYPT_ASSET) {
+ aov_index += flatten_coverage(kg, coverage_asset, tile, aov_index);
+ }
}
}
else if(tile.task == RenderTile::DENOISE) {
denoise(denoising, tile);
-
task.update_progress(&tile, tile.w*tile.h);
}
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index cfe17e63627..0eb8ce2cf8b 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -304,6 +304,24 @@ ccl_device int shader_pass_id(KernelGlobals *kg, const ShaderData *sd)
return kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).pass_id;
}
+/* Cryptomatte ID */
+
+ccl_device_inline float object_cryptomatte_id(KernelGlobals *kg, int object)
+{
+ if(object == OBJECT_NONE)
+ return 0.0f;
+
+ return kernel_tex_fetch(__objects, object).cryptomatte_object;
+}
+
+ccl_device_inline float object_cryptomatte_asset_id(KernelGlobals *kg, int object)
+{
+ if(object == OBJECT_NONE)
+ return 0;
+
+ return kernel_tex_fetch(__objects, object).cryptomatte_asset;
+}
+
/* Particle data from which object was instanced */
ccl_device_inline uint particle_index(KernelGlobals *kg, int particle)
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index 74cfacb5bc1..5276ea4b08b 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 <vector>
# include "util/util_vector.h"
+#include "util/util_map.h"
#endif
#ifdef __KERNEL_OPENCL__
@@ -68,6 +70,11 @@ typedef struct KernelGlobals {
VolumeStep *decoupled_volume_steps[2];
int decoupled_volume_steps_index;
+ /* A buffer for storing per-pixel coverage for Cryptomatte. */
+ map<float, float> *coverage_object;
+ map<float, float> *coverage_material;
+ map<float, float> *coverage_asset;
+
/* split kernel */
SplitData split_data;
SplitParams split_param_data;
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 458aa6c2a97..ebad5410ddb
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list