diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-02-04 01:34:49 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-02-04 11:27:23 +0300 |
commit | ad26407b525c15595694aab49c0a7f1669886fc8 (patch) | |
tree | ba84c2ebf809aa8b1344c9959b2676a9a3fe012f /intern/cycles/kernel/svm/svm_closure.h | |
parent | d8a998ce71f5dafa1f5681158bad8225ca289408 (diff) |
Cycles: Implement approximate reflectance profiles
Using this paper:
http://graphics.pixar.com/library/ApproxBSSRDF/paper.pdf
This model gives less blurry results than the Cubic and Gaussian
we had implemented:
- Cubic: https://developer.blender.org/F279670
- Burley: https://developer.blender.org/F279671
The model is called "Christensen-Burley" in the interface, which
actually should be read as "Physically based" or "Realistic".
Reviewers: juicyfruit, dingto, lukasstockner97, brecht
Reviewed By: brecht, dingto
Subscribers: robocyte
Differential Revision: https://developer.blender.org/D1759
Diffstat (limited to 'intern/cycles/kernel/svm/svm_closure.h')
-rw-r--r-- | intern/cycles/kernel/svm/svm_closure.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h index e3f469b1cb6..b24873d9839 100644 --- a/intern/cycles/kernel/svm/svm_closure.h +++ b/intern/cycles/kernel/svm/svm_closure.h @@ -442,8 +442,10 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * # define sc_next(sc) sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)) #endif case CLOSURE_BSSRDF_CUBIC_ID: - case CLOSURE_BSSRDF_GAUSSIAN_ID: { + case CLOSURE_BSSRDF_GAUSSIAN_ID: + case CLOSURE_BSSRDF_BURLEY_ID: { ShaderClosure *sc = ccl_fetch_array(sd, closure, ccl_fetch(sd, num_closure)); + float3 albedo = sc->weight; float3 weight = sc->weight * mix_weight; float sample_weight = fabsf(average(weight)); @@ -467,7 +469,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->sample_weight = sample_weight; sc->data0 = radius.x; sc->data1 = texture_blur; - sc->data2 = 0.0f; + sc->data2 = albedo.x; sc->T.x = sharpness; #ifdef __OSL__ sc->prim = NULL; @@ -484,7 +486,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->sample_weight = sample_weight; sc->data0 = radius.y; sc->data1 = texture_blur; - sc->data2 = 0.0f; + sc->data2 = albedo.y; sc->T.x = sharpness; #ifdef __OSL__ sc->prim = NULL; @@ -501,7 +503,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float * sc->sample_weight = sample_weight; sc->data0 = radius.z; sc->data1 = texture_blur; - sc->data2 = 0.0f; + sc->data2 = albedo.z; sc->T.x = sharpness; #ifdef __OSL__ sc->prim = NULL; |