[Bf-blender-cvs] [b3ca6d8] cycles_disney_brdf: Improvement of the SSS in the Disney shader
Pascal Schoen
noreply at git.blender.org
Tue Jul 26 12:33:39 CEST 2016
Commit: b3ca6d8a2f4f866b323fc2df0a3beff577218c27
Author: Pascal Schoen
Date: Tue Jul 26 12:30:25 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rBb3ca6d8a2f4f866b323fc2df0a3beff577218c27
Improvement of the SSS in the Disney shader
* Now the bump normal is correctly used for the SSS.
* SSS in Disney uses the Disney diffuse shader
===================================================================
M intern/cycles/kernel/closure/bsdf.h
M intern/cycles/kernel/closure/bssrdf.h
M intern/cycles/kernel/kernel_subsurface.h
M intern/cycles/kernel/osl/osl_bssrdf.cpp
M intern/cycles/kernel/osl/osl_shader.cpp
M intern/cycles/kernel/svm/svm_closure.h
M intern/cycles/kernel/svm/svm_types.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 8ede88f..1f225e1 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -121,6 +121,7 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const Shader
eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
break;
case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+ case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
label = bsdf_disney_diffuse_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
break;
@@ -217,6 +218,7 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
eval = bsdf_hair_transmission_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+ case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
eval = bsdf_disney_diffuse_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
case CLOSURE_BSDF_DISNEY_SHEEN_ID:
@@ -291,6 +293,7 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
eval = bsdf_hair_transmission_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+ case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
eval = bsdf_disney_diffuse_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
case CLOSURE_BSDF_DISNEY_SHEEN_ID:
diff --git a/intern/cycles/kernel/closure/bssrdf.h b/intern/cycles/kernel/closure/bssrdf.h
index c24720c..a192084 100644
--- a/intern/cycles/kernel/closure/bssrdf.h
+++ b/intern/cycles/kernel/closure/bssrdf.h
@@ -329,10 +329,20 @@ ccl_device int bssrdf_setup(ShaderClosure *sc, ClosureType type)
{
if(sc->data0 < BSSRDF_MIN_RADIUS) {
/* revert to diffuse BSDF if radius too small */
- sc->data0 = 0.0f;
- sc->data1 = 0.0f;
- int flag = bsdf_diffuse_setup(sc);
- sc->type = CLOSURE_BSDF_BSSRDF_ID;
+ int flag;
+ if (type == CLOSURE_BSSRDF_DISNEY_ID) {
+ sc->data0 = sc->data3;
+ sc->data1 = 0.0f;
+ flag = bsdf_disney_diffuse_setup(sc);
+ sc->type = CLOSURE_BSDF_BSSRDF_DISNEY_ID;
+ }
+ else {
+ sc->data0 = 0.0f;
+ sc->data1 = 0.0f;
+ flag = bsdf_diffuse_setup(sc);
+ sc->type = CLOSURE_BSDF_BSSRDF_ID;
+ }
+
return flag;
}
else {
@@ -340,7 +350,7 @@ ccl_device int bssrdf_setup(ShaderClosure *sc, ClosureType type)
sc->T.x = saturate(sc->T.x); /* sharpness */
sc->type = type;
- if(type == CLOSURE_BSSRDF_BURLEY_ID) {
+ if (type == CLOSURE_BSSRDF_BURLEY_ID || type == CLOSURE_BSSRDF_DISNEY_ID) {
bssrdf_burley_setup(sc);
}
@@ -354,7 +364,7 @@ ccl_device void bssrdf_sample(ShaderClosure *sc, float xi, float *r, float *h)
bssrdf_cubic_sample(sc, xi, r, h);
else if(sc->type == CLOSURE_BSSRDF_GAUSSIAN_ID)
bssrdf_gaussian_sample(sc, xi, r, h);
- else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID)*/
+ else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID || sc->type == CLOSURE_BSSRDF_DISNEY_ID)*/
bssrdf_burley_sample(sc, xi, r, h);
}
@@ -364,7 +374,7 @@ ccl_device float bssrdf_pdf(ShaderClosure *sc, float r)
return bssrdf_cubic_pdf(sc, r);
else if(sc->type == CLOSURE_BSSRDF_GAUSSIAN_ID)
return bssrdf_gaussian_pdf(sc, r);
- else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID)*/
+ else /*if(sc->type == CLOSURE_BSSRDF_BURLEY_ID || sc->type == CLOSURE_BSSRDF_DISNEY_ID)*/
return bssrdf_burley_pdf(sc, r);
}
diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h
index 705b57b..f64b347 100644
--- a/intern/cycles/kernel/kernel_subsurface.h
+++ b/intern/cycles/kernel/kernel_subsurface.h
@@ -147,14 +147,24 @@ ccl_device void subsurface_scatter_setup_diffuse_bsdf(ShaderData *sd, float3 wei
sc->weight = weight;
sc->sample_weight = 1.0f;
- sc->data0 = 0.0f;
- sc->data1 = 0.0f;
sc->N = N;
- sd->flag |= bsdf_diffuse_setup(sc);
+ if (sc->type == CLOSURE_BSSRDF_DISNEY_ID) {
+ sc->data0 = sc->data3;
+ sd->flag |= bsdf_disney_diffuse_setup(sc);
- /* replace CLOSURE_BSDF_DIFFUSE_ID with this special ID so render passes
- * can recognize it as not being a regular diffuse closure */
- sc->type = CLOSURE_BSDF_BSSRDF_ID;
+ /* replace CLOSURE_BSDF_DISNEY_DIFFUSE_ID with this special ID so render passes
+ * can recognize it as not being a regular Disney diffuse closure */
+ sc->type = CLOSURE_BSDF_BSSRDF_DISNEY_ID;
+ }
+ else {
+ sc->data0 = 0.0f;
+ sc->data1 = 0.0f;
+ sd->flag |= bsdf_diffuse_setup(sc);
+
+ /* replace CLOSURE_BSDF_DIFFUSE_ID with this special ID so render passes
+ * can recognize it as not being a regular diffuse closure */
+ sc->type = CLOSURE_BSDF_BSSRDF_ID;
+ }
}
else
sd->num_closure = 0;
diff --git a/intern/cycles/kernel/osl/osl_bssrdf.cpp b/intern/cycles/kernel/osl/osl_bssrdf.cpp
index da4afb1..f528465 100644
--- a/intern/cycles/kernel/osl/osl_bssrdf.cpp
+++ b/intern/cycles/kernel/osl/osl_bssrdf.cpp
@@ -41,7 +41,9 @@
#include "kernel_types.h"
#include "kernel_montecarlo.h"
+#include "closure/bsdf_util.h"
#include "closure/bsdf_diffuse.h"
+#include "closure/bsdf_disney_diffuse.h"
#include "closure/bssrdf.h"
CCL_NAMESPACE_BEGIN
diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp
index f58368e..a2f1c31 100644
--- a/intern/cycles/kernel/osl/osl_shader.cpp
+++ b/intern/cycles/kernel/osl/osl_shader.cpp
@@ -23,7 +23,9 @@
#include "geom/geom_object.h"
+#include "closure/bsdf_util.h"
#include "closure/bsdf_diffuse.h"
+#include "closure/bsdf_disney_diffuse.h"
#include "closure/bssrdf.h"
#include "osl_bssrdf.h"
@@ -278,7 +280,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag,
bssrdf->radius = make_float3(0.0f, 0.0f, 0.0f);
float3 albedo =
- (bssrdf->sc.type == CLOSURE_BSSRDF_BURLEY_ID)
+ (bssrdf->sc.type == CLOSURE_BSSRDF_BURLEY_ID || bssrdf->sc.type == CLOSURE_BSSRDF_DISNEY_ID)
? bssrdf->albedo
: make_float3(0.0f, 0.0f, 0.0f);
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 26bde57..9390806 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -193,19 +193,18 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
#ifdef __SUBSURFACE__
float3 albedo = baseColor;
- float3 subsurf_weight = baseColor * weight * saturate(subsurface) * diffuse_weight;
+ float3 subsurf_weight = weight * diffuse_weight;
float subsurf_sample_weight = fabsf(average(subsurf_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 */
- float radius_weight = 1.0f;
- if(path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
- radius_weight = 0.0f;
+ if (path_flag & PATH_RAY_DIFFUSE_ANCESTOR)
+ subsurface = 0.0f;
if (subsurf_sample_weight > CLOSURE_WEIGHT_CUTOFF && ccl_fetch(sd, num_closure) + 2 < MAX_CLOSURE) {
/* radius * scale */
- float3 radius = make_float3(1.0f, 1.0f, 1.0f) * radius_weight;
+ float3 radius = make_float3(1.0f, 1.0f, 1.0f) * subsurface;
/* sharpness */
float sharpness = 0.0f;
/* texture color blur */
@@ -218,12 +217,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
sc->data0 = radius.x;
sc->data1 = texture_blur;
sc->data2 = albedo.x;
+ sc->data3 = roughness;
sc->T.x = sharpness;
+ sc->color0 = baseColor;
# ifdef __OSL__
sc->prim = NULL;
# endif
sc->N = N;
- ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+ ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_DISNEY_ID);
ccl_fetch(sd, num_closure)++;
sc_next(sc);
@@ -235,12 +236,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
sc->data0 = radius.y;
sc->data1 = texture_blur;
sc->data2 = albedo.y;
+ sc->data3 = roughness;
sc->T.x = sharpness;
+ sc->color0 = baseColor;
# ifdef __OSL__
sc->prim = NULL;
# endif
sc->N = N;
- ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+ ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_DISNEY_ID);
ccl_fetch(sd, num_closure)++;
sc_next(sc);
@@ -252,23 +255,24 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
sc->data0 = radius.z;
sc->data1 = texture_blur;
sc->data2 = albedo.z;
+ sc->data3 = roughness;
sc->T.x = sharpness;
+ sc->color0 = baseColor;
# ifdef __OSL__
sc->prim = NULL;
# endif
sc->N = N;
- ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_BURLEY_ID);
+ ccl_fetch(sd, flag) |= bssrdf_setup(sc, (ClosureType)CLOSURE_BSSRDF_DISNEY_ID);
ccl_fetch(sd, num_closure)++;
sc_next(sc);
}
}
-#endif
-
+#else
/* diffuse */
- if ((1.0f - saturate(subsurface)) * diffuse_weight > 0.0f) {
+ if (diffuse_weight > 0.0f) {
if (ccl_fetch(sd, num_closure) < MAX_CLOSURE) {
- float3 diff_weight = weight * (1.0f - saturate(subsurface)) * diffuse_weight;
+ float3 diff_weight = weight * diffuse_weight;
float diff_sample_weight = fabsf(average(diff_weight));
if (diff_sample_weight > CLOSURE_WEIGHT_CUTOFF) {
@@ -289,6 +293,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
}
}
}
+#endif
/* sheen */
if (diffuse_weight > 0.0f && sheen != 0.0f) {
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 3814093..f69b4cc 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -412,11 +412,13 @@ typedef enum ClosureType {
/* Special cases */
CLOSURE_BSDF_BSSRDF_ID,
+ CLOSURE_BSDF_BSSRDF_DISNEY_ID,
CLOSURE_BSDF_TRANSPARENT_ID,
/* BSSRDF */
CLOSURE_BSSRDF_CUBIC_ID,
CLOSURE_BSSRDF_GAUSSIAN_ID,
+ CLOSURE_BSSRDF_DISNEY_ID,
CL
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list