[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