diff options
author | Lukas Stockner <lukas.stockner@freenet.de> | 2016-11-19 21:18:30 +0300 |
---|---|---|
committer | Lukas Stockner <lukas.stockner@freenet.de> | 2016-11-19 21:19:07 +0300 |
commit | 36682585db2005b6208c2943126c8df84e9c4099 (patch) | |
tree | a5c0eea2cca96638f1d8a99aac3fa2c76df53978 /intern/cycles/kernel/kernel_passes.h | |
parent | 2f2a1bbee5eebd2e204160c6dc7106cec0768973 (diff) |
Cycles: Tweak feature pass heuristic
Diffstat (limited to 'intern/cycles/kernel/kernel_passes.h')
-rw-r--r-- | intern/cycles/kernel/kernel_passes.h | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h index cb619768a5c..422de5e7548 100644 --- a/intern/cycles/kernel/kernel_passes.h +++ b/intern/cycles/kernel/kernel_passes.h @@ -160,23 +160,30 @@ ccl_device_inline bool kernel_write_denoising_passes(KernelGlobals *kg, ccl_glob float3 normal = make_float3(0.0f, 0.0f, 0.0f); float3 albedo = make_float3(0.0f, 0.0f, 0.0f); - float sum_weight = 0.0f, max_weight = 0.0f; - int max_weight_closure = -1; + float sum_weight = 0.0f, sum_nonspecular_weight = 0.0f; - /* Average normal and albedo, determine the closure with the highest weight for the roughness decision. */ for(int i = 0; i < ccl_fetch(sd, num_closure); i++) { ShaderClosure *sc = ccl_fetch_array(sd, closure, i); if(!CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) continue; + /* Classify closures into diffuse-like and specular-like closures. + * This is pretty arbitrary, but some distinction has to be made. */ + bool is_specular = (sc->type == CLOSURE_BSDF_TRANSPARENT_ID); + if(CLOSURE_IS_BSDF_MICROFACET(sc->type)) { + MicrofacetBsdf *bsdf = (MicrofacetBsdf*) sc; + if(bsdf->alpha_x*bsdf->alpha_y <= 0.075f*0.075f) { + is_specular = true; + } + } + + /* All closures contribute to the normal feature, but only diffuse-like ones to the albedo. */ normal += sc->N * sc->sample_weight; - albedo += sc->weight; sum_weight += sc->sample_weight; - - if(sc->sample_weight > max_weight) { - max_weight = sc->sample_weight; - max_weight_closure = i; + if(!is_specular) { + albedo += sc->weight; + sum_nonspecular_weight += sc->sample_weight; } } @@ -186,17 +193,10 @@ ccl_device_inline bool kernel_write_denoising_passes(KernelGlobals *kg, ccl_glob kernel_write_pass_float_var(buffer + 12, sample, 0.0f); } else { - ShaderClosure *max_sc = ccl_fetch_array(sd, closure, max_weight_closure); - if(max_sc->type == CLOSURE_BSDF_TRANSPARENT_ID) { + /* Wait for next bounce if 75% or more sample weight belongs to specular-like closures. */ + if(sum_nonspecular_weight*4.0f <= sum_weight) { return false; } - if(CLOSURE_IS_BSDF_MICROFACET(max_sc->type)) { - /* Check for roughness, almost specular surfaces don't write data. */ - MicrofacetBsdf *bsdf = (MicrofacetBsdf*) max_sc; - if(bsdf->alpha_x*bsdf->alpha_y <= 0.075f*0.075f) { - return false; - } - } kernel_write_pass_float3_var(buffer, sample, ensure_finite3(normal/sum_weight)); kernel_write_pass_float3_var(buffer + 6, sample, ensure_finite3(albedo)); kernel_write_pass_float_var(buffer + 12, sample, ensure_finite(state->path_length)); |