[Bf-blender-cvs] [11160fa] cycles_disney_brdf: Added Disney Sheen shader as a preparation to get to a BSSRDF
Pascal Schoen
noreply at git.blender.org
Mon May 30 12:43:27 CEST 2016
Commit: 11160fa4e1c32230119d4506e7e9fd3da2ab37f2
Author: Pascal Schoen
Date: Mon May 30 10:16:30 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB11160fa4e1c32230119d4506e7e9fd3da2ab37f2
Added Disney Sheen shader as a preparation to get to a BSSRDF
===================================================================
M intern/cycles/kernel/CMakeLists.txt
M intern/cycles/kernel/closure/bsdf.h
M intern/cycles/kernel/closure/bsdf_disney_diffuse.h
A intern/cycles/kernel/closure/bsdf_disney_sheen.h
M intern/cycles/kernel/osl/CMakeLists.txt
M intern/cycles/kernel/osl/osl_closures.cpp
M intern/cycles/kernel/osl/osl_closures.h
M intern/cycles/kernel/shaders/node_disney_bsdf.osl
M intern/cycles/kernel/shaders/stdosl.h
M intern/cycles/kernel/svm/svm_closure.h
M intern/cycles/kernel/svm/svm_types.h
===================================================================
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index bc75adb..b8f8aa0 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -89,6 +89,7 @@ set(SRC_CLOSURE_HEADERS
closure/emissive.h
closure/volume.h
closure/bsdf_disney_diffuse.h
+ closure/bsdf_disney_sheen.h
closure/bsdf_disney_specular.h
closure/bsdf_disney_clearcoat.h
)
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 3da9d22..8ede88f 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -27,6 +27,7 @@
#include "../closure/bsdf_toon.h"
#include "../closure/bsdf_hair.h"
#include "../closure/bsdf_disney_diffuse.h"
+#include "../closure/bsdf_disney_sheen.h"
#include "../closure/bsdf_disney_specular.h"
#include "../closure/bsdf_disney_clearcoat.h"
#ifdef __SUBSURFACE__
@@ -123,6 +124,10 @@ ccl_device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const Shader
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;
+ case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+ label = bsdf_disney_sheen_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;
case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
label = bsdf_disney_specular_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);
@@ -214,6 +219,9 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
eval = bsdf_disney_diffuse_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
+ case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+ eval = bsdf_disney_sheen_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
eval = bsdf_disney_specular_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
@@ -285,6 +293,9 @@ ccl_device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const Shade
case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
eval = bsdf_disney_diffuse_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
+ case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+ eval = bsdf_disney_sheen_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
eval = bsdf_disney_specular_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
index 2706770..7e0b74d 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
@@ -69,13 +69,6 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
*pdf = M_1_PI_F * 0.5f;
- // sheen component
- if (sc->data2/*sheen*/ != 0.0f) {
- float FH = schlick_fresnel(LdotH);
-
- value += FH * sc->data2/*sheen*/ * sc->custom_color0/*baseColor*/;
- }
-
value *= NdotL;
return value;
@@ -83,13 +76,6 @@ ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
ccl_device int bsdf_disney_diffuse_setup(ShaderClosure *sc)
{
- float m_cdlum = 0.3f * sc->color0[0] + 0.6f * sc->color0[1] + 0.1f * sc->color0[2]; // luminance approx.
-
- float3 m_ctint = m_cdlum > 0.0f ? sc->color0 / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
-
- /* csheen0 */
- sc->custom_color0 = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data3/*sheenTint*/); // make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data3) + m_ctint * sc->data3;
-
sc->type = CLOSURE_BSDF_DISNEY_DIFFUSE_ID;
return SD_BSDF|SD_BSDF_HAS_EVAL;
}
diff --git a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
similarity index 65%
copy from intern/cycles/kernel/closure/bsdf_disney_diffuse.h
copy to intern/cycles/kernel/closure/bsdf_disney_sheen.h
index 2706770..c386254 100644
--- a/intern/cycles/kernel/closure/bsdf_disney_diffuse.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_sheen.h
@@ -31,70 +31,50 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __BSDF_DISNEY_DIFFUSE_H__
-#define __BSDF_DISNEY_DIFFUSE_H__
+#ifndef __BSDF_DISNEY_SHEEN_H__
+#define __BSDF_DISNEY_SHEEN_H__
CCL_NAMESPACE_BEGIN
-ccl_device float3 calculate_disney_diffuse_brdf(const ShaderClosure *sc,
+ccl_device float3 calculate_disney_sheen_brdf(const ShaderClosure *sc,
float3 N, float3 V, float3 L, float3 H, float *pdf)
{
float NdotL = dot(N, L);
float NdotV = dot(N, V);
- if (NdotL < 0 || NdotV < 0) {
+ if (NdotL < 0 || NdotV < 0 || sc->data0 == 0.0f) {
*pdf = 0.0f;
return make_float3(0.0f, 0.0f, 0.0f);
}
float LdotH = dot(L, H);
- float Fd = 0.0f;
- float FL = schlick_fresnel(NdotL), FV = schlick_fresnel(NdotV);
-
- if (sc->data0/*subsurface*/ != 1.0f) {
- const float Fd90 = 0.5f + 2.0f * LdotH*LdotH * sc->data1/*roughness*/;
- Fd = lerp(1.0f, Fd90, FL) * lerp(1.0f, Fd90, FV); // (1.0f * (1.0f - FL) + Fd90 * FL) * (1.0f * (1.0f - FV) + Fd90 * FV);
- }
-
- if (sc->data0/*subsurface*/ > 0.0f) {
- float Fss90 = LdotH*LdotH * sc->data1/*roughness*/;
- float Fss = lerp(1.0f, Fss90, FL) * lerp(1.0f, Fss90, FV); // (1.0f * (1.0f - FL) + Fss90 * FL) * (1.0f * (1.0f - FV) + Fss90 * FV);
- float ss = 1.25f * (Fss * (1.0f / (NdotL + NdotV) - 0.5f) + 0.5f);
- Fd = lerp(Fd, ss, sc->data0/*subsurface*/); // (Fd * (1.0f - sc->data0) + ss * sc->data0);
- }
-
- float3 value = M_1_PI_F * Fd * sc->color0/*baseColor*/;
-
*pdf = M_1_PI_F * 0.5f;
- // sheen component
- if (sc->data2/*sheen*/ != 0.0f) {
- float FH = schlick_fresnel(LdotH);
+ float FH = schlick_fresnel(LdotH);
- value += FH * sc->data2/*sheen*/ * sc->custom_color0/*baseColor*/;
- }
+ float3 value = FH * sc->data0/*sheen*/ * sc->custom_color0/*csheen0*/;
value *= NdotL;
return value;
}
-ccl_device int bsdf_disney_diffuse_setup(ShaderClosure *sc)
+ccl_device int bsdf_disney_sheen_setup(ShaderClosure *sc)
{
float m_cdlum = 0.3f * sc->color0[0] + 0.6f * sc->color0[1] + 0.1f * sc->color0[2]; // luminance approx.
float3 m_ctint = m_cdlum > 0.0f ? sc->color0 / m_cdlum : make_float3(1.0f, 1.0f, 1.0f); // normalize lum. to isolate hue+sat
/* csheen0 */
- sc->custom_color0 = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data3/*sheenTint*/); // make_float3(1.0f, 1.0f, 1.0f) * (1.0f - sc->data3) + m_ctint * sc->data3;
+ sc->custom_color0 = lerp(make_float3(1.0f, 1.0f, 1.0f), m_ctint, sc->data1/*sheenTint*/);
- sc->type = CLOSURE_BSDF_DISNEY_DIFFUSE_ID;
+ sc->type = CLOSURE_BSDF_DISNEY_SHEEN_ID;
return SD_BSDF|SD_BSDF_HAS_EVAL;
}
-ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I,
+ccl_device float3 bsdf_disney_sheen_eval_reflect(const ShaderClosure *sc, const float3 I,
const float3 omega_in, float *pdf)
{
float3 N = normalize(sc->N);
@@ -103,7 +83,7 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, cons
float3 H = normalize(L + V);
if (dot(sc->N, omega_in) > 0.0f) {
- float3 value = calculate_disney_diffuse_brdf(sc, N, V, L, H, pdf);
+ float3 value = calculate_disney_sheen_brdf(sc, N, V, L, H, pdf);
return value;
}
@@ -113,13 +93,13 @@ ccl_device float3 bsdf_disney_diffuse_eval_reflect(const ShaderClosure *sc, cons
}
}
-ccl_device float3 bsdf_disney_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I,
+ccl_device float3 bsdf_disney_sheen_eval_transmit(const ShaderClosure *sc, const float3 I,
const float3 omega_in, float *pdf)
{
return make_float3(0.0f, 0.0f, 0.0f);
}
-ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
+ccl_device int bsdf_disney_sheen_sample(const ShaderClosure *sc,
float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv,
float3 *eval, float3 *omega_in, float3 *domega_in_dx,
float3 *domega_in_dy, float *pdf)
@@ -131,7 +111,7 @@ ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
if (dot(Ng, *omega_in) > 0) {
float3 H = normalize(I + *omega_in);
- *eval = calculate_disney_diffuse_brdf(sc, N, I, *omega_in, H, pdf);
+ *eval = calculate_disney_sheen_brdf(sc, N, I, *omega_in, H, pdf);
#ifdef __RAY_DIFFERENTIALS__
// TODO: find a better approximation for the diffuse bounce
@@ -147,6 +127,6 @@ ccl_device int bsdf_disney_diffuse_sample(const ShaderClosure *sc,
CCL_NAMESPACE_END
-#endif /* __BSDF_DISNEY_DIFFUSE_H__ */
+#endif /* __BSDF_DISNEY_SHEEN_H__ */
diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt
index 6bde211..9cf4f2d 100644
--- a/intern/cycles/kernel/osl/CMakeLists.txt
+++ b/intern/cycles/kernel/osl/CMakeLists.txt
@@ -22,9 +22,6 @@ set(SRC
osl_closures.cpp
osl_services.cpp
osl_shader.cpp
- #bsdf_disney_diffuse.cpp
- #bsdf_disney_specular.cpp
- #bsdf_disney_clearcoat.cpp
)
set(HEADER_SRC
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp
index 96694ed..45fe156 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -57,6 +57,7 @@
#include "closure/bsdf_toon.h"
#include "closure/bsdf_hair.h"
#include "closure/bsdf_disney_diffuse.h"
+#include "closure/bsdf_disney_sheen.h"
#include "closure/bsdf_disney_specular.h"
#include "closure/bsdf_disney_clearcoat.h"
#include "closure/volume.h"
@@ -168,32 +169,6 @@ BSDF_CLOSURE_CLASS_BEGIN(HairTransmission, hair_transmission, hair_transmission,
CLOSURE_FLOAT_PARAM(HairReflectionClosure, sc.data2),
BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission)
-/*BSDF_CLOSURE_CLASS_BEGIN(DisneyDiffuse, disney_diffuse, disney_diffuse, LABEL_DIFFUSE|LABEL_REFLECT)
- CLOSURE_FLOAT3_PARAM(DisneyDiffuseClosure, sc.N),
- CLOSURE_FLOAT3_PARAM(DisneyDiffuse
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list