diff options
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 2 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/closure/bsdf_transparent.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_passes.h | 60 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 22 | ||||
-rw-r--r-- | intern/cycles/render/film.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/render/film.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 1 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_defaults.c | 4 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 6 |
12 files changed, 71 insertions, 42 deletions
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 0b107de58a9..55322fed8b8 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -391,6 +391,8 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel): col.separator() col.prop(rl, "use_pass_shadow") col.prop(rl, "use_pass_ambient_occlusion") + col.separator() + col.prop(rl, "pass_alpha_threshold") col = split.column() col.label(text="Diffuse:") diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index f81de7d529a..94d390cc330 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -382,6 +382,7 @@ void BlenderSession::render() end_render_result(b_engine, b_rr, true, false); buffer_params.passes = passes; + scene->film->pass_alpha_threshold = b_iter->pass_alpha_threshold(); scene->film->tag_passes_update(scene, passes); scene->film->tag_update(scene); scene->integrator->tag_update(scene); diff --git a/intern/cycles/kernel/closure/bsdf_transparent.h b/intern/cycles/kernel/closure/bsdf_transparent.h index e62aecf3da6..73601d20c3a 100644 --- a/intern/cycles/kernel/closure/bsdf_transparent.h +++ b/intern/cycles/kernel/closure/bsdf_transparent.h @@ -38,7 +38,7 @@ CCL_NAMESPACE_BEGIN ccl_device int bsdf_transparent_setup(ShaderClosure *sc) { sc->type = CLOSURE_BSDF_TRANSPARENT_ID; - return SD_BSDF; + return SD_BSDF|SD_TRANSPARENT; } ccl_device void bsdf_transparent_blur(ShaderClosure *sc, float roughness) diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index 512db9ec392..9cdcb8c5229 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -35,9 +35,11 @@ ccl_device_inline void kernel_write_pass_float4(ccl_global float *buffer, int sa } ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global float *buffer, PathRadiance *L, - ShaderData *sd, int sample, int path_flag, float3 throughput) + ShaderData *sd, int sample, PathState *state, float3 throughput) { #ifdef __PASSES__ + int path_flag = state->flag; + if(!(path_flag & PATH_RAY_CAMERA)) return; @@ -46,35 +48,41 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl if(!(flag & PASS_ALL)) return; - /* todo: add alpha threshold */ - if(!(path_flag & PATH_RAY_TRANSPARENT)) { - if(sample == 0) { - if(flag & PASS_DEPTH) { - float depth = camera_distance(kg, sd->P); - kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth); + if(!(path_flag & PATH_RAY_SINGLE_PASS_DONE)) { + if(!(sd->flag & SD_TRANSPARENT) || + kernel_data.film.pass_alpha_threshold == 0.0f || + average(shader_bsdf_alpha(kg, sd)) >= kernel_data.film.pass_alpha_threshold) { + + if(sample == 0) { + if(flag & PASS_DEPTH) { + float depth = camera_distance(kg, sd->P); + kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth); + } + if(flag & PASS_OBJECT_ID) { + float id = object_pass_id(kg, sd->object); + kernel_write_pass_float(buffer + kernel_data.film.pass_object_id, sample, id); + } + if(flag & PASS_MATERIAL_ID) { + float id = shader_pass_id(kg, sd); + kernel_write_pass_float(buffer + kernel_data.film.pass_material_id, sample, id); + } } - if(flag & PASS_OBJECT_ID) { - float id = object_pass_id(kg, sd->object); - kernel_write_pass_float(buffer + kernel_data.film.pass_object_id, sample, id); + + if(flag & PASS_NORMAL) { + float3 normal = sd->N; + kernel_write_pass_float3(buffer + kernel_data.film.pass_normal, sample, normal); } - if(flag & PASS_MATERIAL_ID) { - float id = shader_pass_id(kg, sd); - kernel_write_pass_float(buffer + kernel_data.film.pass_material_id, sample, id); + if(flag & PASS_UV) { + float3 uv = primitive_uv(kg, sd); + kernel_write_pass_float3(buffer + kernel_data.film.pass_uv, sample, uv); + } + if(flag & PASS_MOTION) { + float4 speed = primitive_motion_vector(kg, sd); + 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); } - } - if(flag & PASS_NORMAL) { - float3 normal = sd->N; - kernel_write_pass_float3(buffer + kernel_data.film.pass_normal, sample, normal); - } - if(flag & PASS_UV) { - float3 uv = primitive_uv(kg, sd); - kernel_write_pass_float3(buffer + kernel_data.film.pass_uv, sample, uv); - } - if(flag & PASS_MOTION) { - float4 speed = primitive_motion_vector(kg, sd); - 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); + state->flag |= PATH_RAY_SINGLE_PASS_DONE; } } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 8460af85d4c..aabac2e8e5e 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -652,7 +652,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, #endif /* holdout mask objects do not write data passes */ - kernel_write_data_passes(kg, buffer, &L, &sd, sample, state.flag, throughput); + kernel_write_data_passes(kg, buffer, &L, &sd, sample, &state, throughput); /* blurring of bsdf after bounces, for rays that have a small likelihood * of following this particular path (diffuse, rough glossy) */ @@ -1185,7 +1185,7 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in #endif /* holdout mask objects do not write data passes */ - kernel_write_data_passes(kg, buffer, &L, &sd, sample, state.flag, throughput); + kernel_write_data_passes(kg, buffer, &L, &sd, sample, &state, throughput); #ifdef __EMISSION__ /* emission */ diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index cdde0fe0291..06bf6b7c5dd 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -234,6 +234,7 @@ enum PathRayFlag { PATH_RAY_DIFFUSE_ANCESTOR = 2048, PATH_RAY_GLOSSY_ANCESTOR = 4096, PATH_RAY_BSSRDF_ANCESTOR = 8192, + PATH_RAY_SINGLE_PASS_DONE = 8192, /* this gives collisions with localview bits * see: blender_util.h, grr - Campbell */ @@ -519,23 +520,24 @@ enum ShaderDataFlag { SD_ABSORPTION = 128, /* have volume absorption closure? */ SD_SCATTER = 256, /* have volume phase closure? */ SD_AO = 512, /* have ao closure? */ + SD_TRANSPARENT = 1024, /* have transparent closure? */ SD_CLOSURE_FLAGS = (SD_EMISSION|SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY|SD_BSSRDF|SD_HOLDOUT|SD_ABSORPTION|SD_SCATTER|SD_AO), /* shader flags */ - SD_USE_MIS = 1024, /* direct light sample */ - SD_HAS_TRANSPARENT_SHADOW = 2048, /* has transparent shadow */ - SD_HAS_VOLUME = 4096, /* has volume shader */ - SD_HAS_ONLY_VOLUME = 8192, /* has only volume shader, no surface */ - SD_HETEROGENEOUS_VOLUME = 16384, /* has heterogeneous volume */ - SD_HAS_BSSRDF_BUMP = 32768, /* bssrdf normal uses bump */ + SD_USE_MIS = 2048, /* direct light sample */ + SD_HAS_TRANSPARENT_SHADOW = 4096, /* has transparent shadow */ + SD_HAS_VOLUME = 8192, /* has volume shader */ + SD_HAS_ONLY_VOLUME = 16384, /* has only volume shader, no surface */ + SD_HETEROGENEOUS_VOLUME = 32768, /* has heterogeneous volume */ + SD_HAS_BSSRDF_BUMP = 65536, /* bssrdf normal uses bump */ SD_SHADER_FLAGS = (SD_USE_MIS|SD_HAS_TRANSPARENT_SHADOW|SD_HAS_VOLUME|SD_HAS_ONLY_VOLUME|SD_HETEROGENEOUS_VOLUME|SD_HAS_BSSRDF_BUMP), /* object flags */ - SD_HOLDOUT_MASK = 65536, /* holdout for camera rays */ - SD_OBJECT_MOTION = 131072, /* has object motion blur */ - SD_TRANSFORM_APPLIED = 262144, /* vertices have transform applied */ + SD_HOLDOUT_MASK = 131072, /* holdout for camera rays */ + SD_OBJECT_MOTION = 262144, /* has object motion blur */ + SD_TRANSFORM_APPLIED = 524288, /* vertices have transform applied */ SD_OBJECT_FLAGS = (SD_HOLDOUT_MASK|SD_OBJECT_MOTION|SD_TRANSFORM_APPLIED) }; @@ -758,7 +760,7 @@ typedef struct KernelFilm { int pass_emission; int pass_background; int pass_ao; - int pass_pad1; + float pass_alpha_threshold; int pass_shadow; float pass_shadow_scale; diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp index f97417b5251..23a70303557 100644 --- a/intern/cycles/render/film.cpp +++ b/intern/cycles/render/film.cpp @@ -261,6 +261,7 @@ Film::Film() { exposure = 0.8f; Pass::add(PASS_COMBINED, passes); + pass_alpha_threshold = 0.5f; filter_type = FILTER_BOX; filter_width = 1.0f; @@ -399,6 +400,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene) } kfilm->pass_stride = align_up(kfilm->pass_stride, 4); + kfilm->pass_alpha_threshold = pass_alpha_threshold; /* update filter table */ vector<float> table = filter_table(filter_type, filter_width); @@ -425,8 +427,12 @@ bool Film::modified(const Film& film) { return !(exposure == film.exposure && Pass::equals(passes, film.passes) + && pass_alpha_threshold == film.pass_alpha_threshold && filter_type == film.filter_type - && filter_width == film.filter_width); + && filter_width == film.filter_width + && mist_start == film.mist_start + && mist_depth == film.mist_depth + && mist_falloff == film.mist_falloff); } void Film::tag_passes_update(Scene *scene, const vector<Pass>& passes_) diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h index a991d36182f..1e1c775aac3 100644 --- a/intern/cycles/render/film.h +++ b/intern/cycles/render/film.h @@ -50,6 +50,7 @@ class Film { public: float exposure; vector<Pass> passes; + float pass_alpha_threshold; FilterType filter_type; float filter_width; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 1088b3a2523..580f7ab2e54 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1707,6 +1707,7 @@ SceneRenderLayer *BKE_scene_add_render_layer(Scene *sce, const char *name) srl->lay = (1 << 20) - 1; srl->layflag = 0x7FFF; /* solid ztra halo edge strand */ srl->passflag = SCE_PASS_COMBINED | SCE_PASS_Z; + slr->pass_alpha_threshold = 0.5f; BKE_freestyle_config_init(&srl->freestyleConfig); return srl; diff --git a/source/blender/blenloader/intern/versioning_defaults.c b/source/blender/blenloader/intern/versioning_defaults.c index 82fa58b57e1..d6117224bb4 100644 --- a/source/blender/blenloader/intern/versioning_defaults.c +++ b/source/blender/blenloader/intern/versioning_defaults.c @@ -48,8 +48,10 @@ void BLO_update_defaults_startup_blend(Main *main) scene->r.im_format.planes = R_IMF_PLANES_RGBA; scene->r.im_format.compress = 15; - for (srl = scene->r.layers.first; srl; srl = srl->next) + for (srl = scene->r.layers.first; srl; srl = srl->next) { srl->freestyleConfig.sphere_radius = 0.1f; + srl->pass_alpha_threshold = 0.5f; + } } for (linestyle = main->linestyle.first; linestyle; linestyle = linestyle->id.next) diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 177b687802d..8c4026e8b67 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -187,7 +187,7 @@ typedef struct SceneRenderLayer { int pass_xor; int samples; - int pad; + float pass_alpha_threshold; struct FreestyleConfig freestyleConfig; } SceneRenderLayer; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index e901737c670..a3b8c9ff859 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2271,6 +2271,12 @@ void rna_def_render_layer_common(StructRNA *srna, int scene) RNA_def_property_ui_text(prop, "Samples", "Override number of render samples for this render layer, " "0 will use the scene setting"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); + + prop = RNA_def_property(srna, "pass_alpha_threshold", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_ui_text(prop, "Alpha Treshold", "Z, Index, normal, UV and vector passes are" + "only affected by surfaces with alpha transparency equal to" + "or higher than this threshold"); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL); } /* layer options */ |