diff options
Diffstat (limited to 'intern/cycles/kernel/svm/svm_closure.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index 847195134e8..bd4a2d781eb 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -340,28 +340,36 @@ __device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *st break; } #ifdef __SUBSURFACE__ - case CLOSURE_BSSRDF_ID: { + case CLOSURE_BSSRDF_COMPATIBLE_ID: + case CLOSURE_BSSRDF_CUBIC_ID: + case CLOSURE_BSSRDF_GAUSSIAN_ID: { ShaderClosure *sc = &sd->closure[sd->num_closure]; float3 weight = sc->weight * mix_weight; float sample_weight = fabsf(average(weight)); + + /* disable in case of diffuse ancestor, can't see it well then and + * adds considerably noise due to probabilities of continuing path + * getting lower and lower */ + if(type != CLOSURE_BSSRDF_COMPATIBLE_ID && (path_flag & PATH_RAY_DIFFUSE_ANCESTOR)) + param1 = 0.0f; if(sample_weight > 1e-5f && sd->num_closure+2 < MAX_CLOSURE) { /* radius * scale */ float3 radius = stack_load_float3(stack, data_node.w)*param1; - /* index of refraction */ - float eta = fmaxf(param2, 1.0f + 1e-5f); + /* texture color blur */ + float texture_blur = param2; /* create one closure per color channel */ if(fabsf(weight.x) > 0.0f) { sc->weight = make_float3(weight.x, 0.0f, 0.0f); sc->sample_weight = sample_weight; sc->data0 = radius.x; - sc->data1 = eta; + sc->data1 = texture_blur; #ifdef __OSL__ sc->prim = NULL; #endif sc->N = N; - sd->flag |= bssrdf_setup(sc); + sd->flag |= bssrdf_setup(sc, (ClosureType)type); sd->num_closure++; sc++; @@ -371,12 +379,12 @@ __device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *st sc->weight = make_float3(0.0f, weight.y, 0.0f); sc->sample_weight = sample_weight; sc->data0 = radius.y; - sc->data1 = eta; + sc->data1 = texture_blur; #ifdef __OSL__ sc->prim = NULL; #endif sc->N = N; - sd->flag |= bssrdf_setup(sc); + sd->flag |= bssrdf_setup(sc, (ClosureType)type); sd->num_closure++; sc++; @@ -386,12 +394,12 @@ __device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *st sc->weight = make_float3(0.0f, 0.0f, weight.z); sc->sample_weight = sample_weight; sc->data0 = radius.z; - sc->data1 = eta; + sc->data1 = texture_blur; #ifdef __OSL__ sc->prim = NULL; #endif sc->N = N; - sd->flag |= bssrdf_setup(sc); + sd->flag |= bssrdf_setup(sc, (ClosureType)type); sd->num_closure++; sc++; |