[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