[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