From d43682d51bbe70448b328980d29c3a08cf4d4a26 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 18 Aug 2013 14:15:57 +0000 Subject: Cycles: Subsurface Scattering New features: * Bump mapping now works with SSS * Texture Blur factor for SSS, see the documentation for details: http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/Shaders#Subsurface_Scattering Work in progress for feedback: Initial implementation of the "BSSRDF Importance Sampling" paper, which uses a different importance sampling method. It gives better quality results in many ways, with the availability of both Cubic and Gaussian falloff functions, but also tends to be more noisy when using the progressive integrator and does not give great results with some geometry. It works quite well for the non-progressive integrator and is often less noisy there. This code may still change a lot, so unless you're testing it may be best to stick to the Compatible falloff function. Skin test render and file that takes advantage of the gaussian falloff: http://www.pasteall.org/pic/show.php?id=57661 http://www.pasteall.org/pic/show.php?id=57662 http://www.pasteall.org/blend/23501 --- intern/cycles/kernel/svm/svm_closure.h | 26 +++++++++++++++++--------- intern/cycles/kernel/svm/svm_types.h | 8 ++++++-- 2 files changed, 23 insertions(+), 11 deletions(-) (limited to 'intern/cycles/kernel/svm') 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) -- cgit v1.2.3