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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to