diff options
author | Thomas Dinges <blender@dingto.org> | 2013-08-03 17:12:09 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2013-08-03 17:12:09 +0400 |
commit | 5fc6f04fc8b678670c2d40d91ca3ccadd653b3ed (patch) | |
tree | 48344bb4eccbb4c3048318891249c1081c527bc9 /intern/cycles/kernel/kernel_accumulate.h | |
parent | ea95a78b0bf69b2e8a90a60d01342de47c4b2d12 (diff) |
Cycles / SSS:
* Render Passes are now available for Subsurface Scattering (Direct, Indirect and Color pass).
This is part of my GSoC project, SVN merge of r58587, r58828 and r58835.
Diffstat (limited to 'intern/cycles/kernel/kernel_accumulate.h')
-rw-r--r-- | intern/cycles/kernel/kernel_accumulate.h | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h index e6307f23b32..ca420909bc7 100644 --- a/intern/cycles/kernel/kernel_accumulate.h +++ b/intern/cycles/kernel/kernel_accumulate.h @@ -33,6 +33,7 @@ __device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 val eval->glossy = make_float3(0.0f, 0.0f, 0.0f); eval->transmission = make_float3(0.0f, 0.0f, 0.0f); eval->transparent = make_float3(0.0f, 0.0f, 0.0f); + eval->subsurface = make_float3(0.0f, 0.0f, 0.0f); if(type == CLOSURE_BSDF_TRANSPARENT_ID) eval->transparent = value; @@ -40,8 +41,10 @@ __device_inline void bsdf_eval_init(BsdfEval *eval, ClosureType type, float3 val eval->diffuse = value; else if(CLOSURE_IS_BSDF_GLOSSY(type)) eval->glossy = value; - else + else if(CLOSURE_IS_BSDF_TRANSMISSION(type)) eval->transmission = value; + else if(CLOSURE_IS_BSDF_BSSRDF(type)) + eval->subsurface = value; } else eval->diffuse = value; @@ -58,8 +61,10 @@ __device_inline void bsdf_eval_accum(BsdfEval *eval, ClosureType type, float3 va eval->diffuse += value; else if(CLOSURE_IS_BSDF_GLOSSY(type)) eval->glossy += value; - else + else if(CLOSURE_IS_BSDF_TRANSMISSION(type)) eval->transmission += value; + else if(CLOSURE_IS_BSDF_BSSRDF(type)) + eval->subsurface += value; /* skipping transparent, this function is used by for eval(), will be zero then */ } @@ -77,7 +82,8 @@ __device_inline bool bsdf_eval_is_zero(BsdfEval *eval) return is_zero(eval->diffuse) && is_zero(eval->glossy) && is_zero(eval->transmission) - && is_zero(eval->transparent); + && is_zero(eval->transparent) + && is_zero(eval->subsurface); } else return is_zero(eval->diffuse); @@ -93,6 +99,7 @@ __device_inline void bsdf_eval_mul(BsdfEval *eval, float3 value) eval->diffuse *= value; eval->glossy *= value; eval->transmission *= value; + eval->subsurface *= value; /* skipping transparent, this function is used by for eval(), will be zero then */ } @@ -124,18 +131,22 @@ __device_inline void path_radiance_init(PathRadiance *L, int use_light_pass) L->color_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->color_glossy = make_float3(0.0f, 0.0f, 0.0f); L->color_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->color_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->path_glossy = make_float3(0.0f, 0.0f, 0.0f); L->path_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->path_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->emission = make_float3(0.0f, 0.0f, 0.0f); L->background = make_float3(0.0f, 0.0f, 0.0f); @@ -164,14 +175,15 @@ __device_inline void path_radiance_bsdf_bounce(PathRadiance *L, float3 *throughp L->path_diffuse = bsdf_eval->diffuse*value; L->path_glossy = bsdf_eval->glossy*value; L->path_transmission = bsdf_eval->transmission*value; + L->path_subsurface = bsdf_eval->subsurface*value; - *throughput = L->path_diffuse + L->path_glossy + L->path_transmission; + *throughput = L->path_diffuse + L->path_glossy + L->path_transmission + L->path_subsurface; L->direct_throughput = *throughput; } else { /* transparent bounce before first hit, or indirectly visible through BSDF */ - float3 sum = (bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->transparent)*inverse_pdf; + float3 sum = (bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->transparent + bsdf_eval->subsurface)*inverse_pdf; *throughput *= sum; } } @@ -230,6 +242,7 @@ __device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughpu L->direct_diffuse += throughput*bsdf_eval->diffuse*shadow; L->direct_glossy += throughput*bsdf_eval->glossy*shadow; L->direct_transmission += throughput*bsdf_eval->transmission*shadow; + L->direct_subsurface += throughput*bsdf_eval->subsurface*shadow; if(is_lamp) { L->shadow.x += shadow.x*shadow_fac; @@ -239,7 +252,7 @@ __device_inline void path_radiance_accum_light(PathRadiance *L, float3 throughpu } else { /* indirectly visible lighting after BSDF bounce */ - float3 sum = bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission; + float3 sum = bsdf_eval->diffuse + bsdf_eval->glossy + bsdf_eval->transmission + bsdf_eval->subsurface; L->indirect += throughput*sum*shadow; } } @@ -279,11 +292,13 @@ __device_inline void path_radiance_sum_indirect(PathRadiance *L) L->direct_diffuse += L->path_diffuse*L->direct_emission; L->direct_glossy += L->path_glossy*L->direct_emission; L->direct_transmission += L->path_transmission*L->direct_emission; + L->direct_subsurface += L->path_subsurface*L->direct_emission; L->indirect = safe_divide_color(L->indirect, L->direct_throughput); L->indirect_diffuse += L->path_diffuse*L->indirect; L->indirect_glossy += L->path_glossy*L->indirect; L->indirect_transmission += L->path_transmission*L->indirect; + L->indirect_subsurface += L->path_subsurface*L->indirect; } #endif } @@ -295,6 +310,7 @@ __device_inline void path_radiance_reset_indirect(PathRadiance *L) L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->path_glossy = make_float3(0.0f, 0.0f, 0.0f); L->path_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->path_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->direct_emission = make_float3(0.0f, 0.0f, 0.0f); L->indirect = make_float3(0.0f, 0.0f, 0.0f); @@ -309,8 +325,8 @@ __device_inline float3 path_radiance_sum(KernelGlobals *kg, PathRadiance *L) path_radiance_sum_indirect(L); float3 L_sum = L->emission - + L->direct_diffuse + L->direct_glossy + L->direct_transmission - + L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission; + + L->direct_diffuse + L->direct_glossy + L->direct_transmission + L->direct_subsurface + + L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission + L->indirect_subsurface; if(!kernel_data.background.transparent) L_sum += L->background; @@ -337,10 +353,12 @@ __device_inline void path_radiance_clamp(PathRadiance *L, float3 *L_sum, float c L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f); L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->direct_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f); L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f); L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f); + L->indirect_subsurface = make_float3(0.0f, 0.0f, 0.0f); L->emission = make_float3(0.0f, 0.0f, 0.0f); } @@ -357,10 +375,12 @@ __device_inline void path_radiance_clamp(PathRadiance *L, float3 *L_sum, float c L->direct_diffuse *= scale; L->direct_glossy *= scale; L->direct_transmission *= scale; + L->direct_subsurface *= scale; L->indirect_diffuse *= scale; L->indirect_glossy *= scale; L->indirect_transmission *= scale; + L->indirect_subsurface *= scale; L->emission *= scale; } |