diff options
Diffstat (limited to 'intern/cycles/kernel/svm')
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 26 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 8 |
2 files changed, 23 insertions, 11 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++; diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 939decf80a9..37ed5ead49f 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -369,8 +369,12 @@ typedef enum ClosureType { CLOSURE_BSDF_BSSRDF_ID, CLOSURE_BSDF_TRANSPARENT_ID, + /* BSSRDF */ + CLOSURE_BSSRDF_COMPATIBLE_ID, + CLOSURE_BSSRDF_CUBIC_ID, + CLOSURE_BSSRDF_GAUSSIAN_ID, + /* Other */ - CLOSURE_BSSRDF_ID, CLOSURE_EMISSION_ID, CLOSURE_DEBUG_ID, CLOSURE_BACKGROUND_ID, @@ -391,7 +395,7 @@ typedef enum ClosureType { #define CLOSURE_IS_BSDF_GLOSSY(type) (type >= CLOSURE_BSDF_GLOSSY_ID && type <= CLOSURE_BSDF_GLOSSY_TOON_ID) #define CLOSURE_IS_BSDF_TRANSMISSION(type) (type >= CLOSURE_BSDF_TRANSMISSION_ID && type <= CLOSURE_BSDF_SHARP_GLASS_ID) #define CLOSURE_IS_BSDF_BSSRDF(type) (type == CLOSURE_BSDF_BSSRDF_ID) -#define CLOSURE_IS_BSSRDF(type) (type == CLOSURE_BSSRDF_ID) +#define CLOSURE_IS_BSSRDF(type) (type >= CLOSURE_BSSRDF_COMPATIBLE_ID && type <= CLOSURE_BSSRDF_GAUSSIAN_ID) #define CLOSURE_IS_VOLUME(type) (type >= CLOSURE_VOLUME_ID && type <= CLOSURE_VOLUME_ISOTROPIC_ID) #define CLOSURE_IS_EMISSION(type) (type == CLOSURE_EMISSION_ID) #define CLOSURE_IS_HOLDOUT(type) (type == CLOSURE_HOLDOUT_ID) |