[Bf-blender-cvs] [df0ead4dabd] soc-2018-hair-shader: OSL: initialize geometry as part of the setup
L. E. Segovia
noreply at git.blender.org
Wed May 30 19:37:43 CEST 2018
Commit: df0ead4dabd0c0f07ff046b59c7d850005d59e60
Author: L. E. Segovia
Date: Wed May 30 17:37:25 2018 +0000
Branches: soc-2018-hair-shader
https://developer.blender.org/rBdf0ead4dabd0c0f07ff046b59c7d850005d59e60
OSL: initialize geometry as part of the setup
This needs a custom OSL closure. Now it renders, but the colors don't make sense
Ref T54796
===================================================================
M intern/cycles/kernel/closure/bsdf_hair_principled.h
M intern/cycles/kernel/osl/osl_closures.cpp
M intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
M intern/cycles/kernel/svm/svm_closure.h
M intern/cycles/render/nodes.cpp
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h
index f620b13b329..40b04b29ce5 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_principled.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h
@@ -146,7 +146,7 @@ ccl_device_inline float4 combine_with_energy(float3 c)
#ifdef __HAIR__
-ccl_device int bsdf_principled_hair_setup(PrincipledHairBSDF *bsdf)
+ccl_device int bsdf_principled_hair_setup(ShaderData *sd, PrincipledHairBSDF *bsdf)
{
// if((sd->type & PRIMITIVE_ALL_CURVE) == 0) {
// bsdf->type = CLOSURE_BSDF_DIFFUSE_ID;
@@ -160,46 +160,46 @@ ccl_device int bsdf_principled_hair_setup(PrincipledHairBSDF *bsdf)
bsdf->v = sqr(0.726f*bsdf->v + 0.812f*sqr(bsdf->v) + 3.700f*pow20(bsdf->v));
bsdf->s = (0.265f*bsdf->s + 1.194f*sqr(bsdf->s) + 5.372f*pow22(bsdf->s))*M_SQRT_PI_8_F;
- return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_NEEDS_LCG;
-}
-
-#endif /* __HAIR__ */
-
-ccl_device_inline void setup_geometry(KernelGlobals *kg, ShaderData *sd, PrincipledHairBSDF *bsdf)
-{
/* Compute local frame, aligned to curve tangent and ray direction. */
float3 X = normalize(sd->dPdu);
float3 Y = safe_normalize(cross(X, sd->I));
float3 Z = safe_normalize(cross(X, Y));
-
-#if 0
- /* TODO: this seems to give wrong results, and h should be in the -1..1 range? */
- float curve_r;
- float3 curve_P = curve_center(kg, sd, &curve_r);
- float h = safe_divide(dot(Y, sd->P - curve_P), curve_r);
- kernel_assert(fabsf(h) <= 2.0f);
-#else
+
+//#if 0
+// /* TODO: this seems to give wrong results, and h should be in the -1..1 range? */
+// /* It doesn't work either if you call it from OSL */
+// float curve_r;
+// float3 curve_P = curve_center(kg, sd, &curve_r);
+// float h = safe_divide(dot(Y, sd->P - curve_P), curve_r);
+// kernel_assert(fabsf(h) <= 2.0f);
+//#else
/* TODO: this only works for thick curves where sd->Ng is the normal
* pointing from the center of the curve to the shading point. For
* ribbons we need to find another solution. */
-
+ /* Amyspark: it works for ribbons too, but NOT triangles.
+ * See https://developer.blender.org/T43625 */
+
/* h -1..0..1 means the rays goes from grazing the hair, to hitting it at
* the center, to grazing the other edge. This is the sine of the angle
* between sd->Ng and Z, as seen from the tangent X. */
-
+
/* TODO: we convert this value to a cosine later and discard the sign, so
* we could probably save some operations. */
float h = dot(cross(sd->Ng, X), Z);
-
+
kernel_assert(fabsf(h) < 1.0f + 1e-4f);
-#endif
-
+//#endif
+
kernel_assert(isfinite3_safe(Y));
kernel_assert(isfinite_safe(h));
-
+
bsdf->geom = make_float4(Y.x, Y.y, Y.z, h);
+
+ return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_NEEDS_LCG;
}
+#endif /* __HAIR__ */
+
ccl_device_inline void hair_ap(float f, float3 T, float4 *Ap)
{
/* Primary specular (R). */
@@ -244,7 +244,7 @@ ccl_device_inline void hair_alpha_angles(float sin_theta_i, float cos_theta_i, f
angles[5] = fabsf(cos_theta_i*cos_4alpha + sin_theta_i*sin_4alpha);
}
-ccl_device_noinline float3 bsdf_principled_hair_eval(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
+ccl_device float3 bsdf_principled_hair_eval(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
{
//*pdf = 0.0f;
//return make_float3(0.0f, 0.0f, 0.0f);
@@ -327,16 +327,6 @@ ccl_device_noinline float3 bsdf_principled_hair_eval(const ShaderData *sd, const
return float4_to_float3(F);
}
-ccl_device_noinline float3 bsdf_principled_hair_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
-{
- return bsdf_principled_hair_eval(sd, sc, omega_in, pdf);
-}
-
-ccl_device_noinline float3 bsdf_principled_hair_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
-{
- return bsdf_principled_hair_eval(sd, sc, omega_in, pdf);
-}
-
ccl_device int bsdf_principled_hair_sample(KernelGlobals *kg, const ShaderClosure *sc, ShaderData *sd, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
{
#ifdef __KERNEL_CPU__
@@ -345,8 +335,6 @@ ccl_device int bsdf_principled_hair_sample(KernelGlobals *kg, const ShaderClosur
PrincipledHairBSDF *bsdf = (PrincipledHairBSDF*) sc;
- setup_geometry(kg, sd, bsdf);
-
float3 Y = float4_to_float3(bsdf->geom);
float3 X = normalize(sd->dPdu);
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp
index 473d1fd40f8..8b74cc99d44 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -4,7 +4,7 @@
* Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
* All Rights Reserved.
*
- * Modifications Copyright 2011, Blender Foundation.
+ * Modifications Copyright 2011, 2018, Blender Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -168,16 +168,6 @@ BSDF_CLOSURE_CLASS_BEGIN(HairTransmission, hair_transmission, HairBsdf, LABEL_GL
CLOSURE_FLOAT_PARAM(HairReflectionClosure, params.offset),
BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission)
-BSDF_CLOSURE_CLASS_BEGIN(PrincipledHair, principled_hair, PrincipledHairBSDF,
-LABEL_GLOSSY)
- CLOSURE_FLOAT3_PARAM(PrincipledHairClosure, params.N),
- CLOSURE_FLOAT3_PARAM(PrincipledHairClosure, params.sigma),
- CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.v),
- CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.s),
- CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.alpha),
- CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.eta),
-BSDF_CLOSURE_CLASS_END(PrincipledHair, principled_hair)
-
BSDF_CLOSURE_CLASS_BEGIN(PrincipledDiffuse, principled_diffuse, PrincipledDiffuseBsdf, LABEL_DIFFUSE)
CLOSURE_FLOAT3_PARAM(PrincipledDiffuseClosure, params.N),
CLOSURE_FLOAT_PARAM(PrincipledDiffuseClosure, params.roughness),
@@ -187,6 +177,50 @@ BSDF_CLOSURE_CLASS_BEGIN(PrincipledSheen, principled_sheen, PrincipledSheenBsdf,
CLOSURE_FLOAT3_PARAM(PrincipledSheenClosure, params.N),
BSDF_CLOSURE_CLASS_END(PrincipledSheen, principled_sheen)
+/* ZOOTOPIA'S HAIR */
+
+//BSDF_CLOSURE_CLASS_BEGIN(PrincipledHair, principled_hair, PrincipledHairBSDF,
+// LABEL_GLOSSY)
+// CLOSURE_FLOAT3_PARAM(PrincipledHairClosure, params.N),
+// CLOSURE_FLOAT3_PARAM(PrincipledHairClosure, params.sigma),
+// CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.v),
+// CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.s),
+// CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.alpha),
+// CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.eta),
+//BSDF_CLOSURE_CLASS_END(PrincipledHair, principled_hair)
+
+class PrincipledHairClosure : public CBSDFClosure {
+public:
+ PrincipledHairBSDF params;
+ float3 unused;
+
+ void setup(ShaderData *sd, int path_flag, float3 weight)
+ {
+ if(!skip(sd, path_flag, LABEL_GLOSSY)) {
+ PrincipledHairBSDF *bsdf = (PrincipledHairBSDF*)bsdf_alloc_osl(sd, sizeof(PrincipledHairBSDF), weight, ¶ms); \
+ sd->flag |= (bsdf) ? bsdf_principled_hair_setup(sd, bsdf) : 0;
+ }
+ }
+};
+
+static ClosureParam *bsdf_principled_hair_params()
+{
+ static ClosureParam params[] = {
+ CLOSURE_FLOAT3_PARAM(PrincipledHairClosure, params.N),
+ CLOSURE_FLOAT3_PARAM(PrincipledHairClosure, params.sigma),
+ CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.v),
+ CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.s),
+ CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.alpha),
+ CLOSURE_FLOAT_PARAM(PrincipledHairClosure, params.eta),
+ CLOSURE_STRING_KEYPARAM(PrincipledHairClosure, label, "label"),
+ CLOSURE_FINISH_PARAM(PrincipledHairClosure)
+ };
+
+ return params;
+}
+
+CCLOSURE_PREPARE(bsdf_principled_hair_prepare, PrincipledHairClosure)
+
/* DISNEY PRINCIPLED CLEARCOAT */
class PrincipledClearcoatClosure : public CBSDFClosure {
public:
@@ -335,8 +369,8 @@ void OSLShader::register_closures(OSLShadingSystem *ss_)
register_closure(ss, "hair_transmission", id++,
bsdf_hair_transmission_params(), bsdf_hair_transmission_prepare);
- register_closure(ss, "principled_hair", id++,
- bsdf_principled_hair_params(), bsdf_principled_hair_prepare);
+ register_closure(ss, "principled_hair", id++,
+ bsdf_principled_hair_params(), bsdf_principled_hair_prepare);
register_closure(ss, "henyey_greenstein", id++,
closure_henyey_greenstein_params(), closure_henyey_greenstein_prepare);
diff --git a/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
index 8ed788a54b8..46a6cfccefc 100644
--- a/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
+++ b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
@@ -17,29 +17,29 @@
#include "stdosl.h"
color log3 (color a) {
- return color(log(a[0]), log(a[1]), log(a[2]));
+ return color(log(a[0]), log(a[1]), log(a[2]));
}
shader node_principled_hair_bsdf(
color Color = 0.0,
- normal Normal = N,
- string Parametrization = "Direct coloring",
- float Offset = 2.0,
- float RoughnessU = 0.2,
- float RoughnessV = 0.2,
- float IOR = 1.55,
+ normal Normal = 0.0,
+ string parametrization = "Absorption coefficient",
+ float Offset = 0,
+ float RoughnessU = 0,
+ float RoughnessV = 0,
+ float IOR = 0,
output closure color BSDF = 0)
{
- color Sigma;
+ color Sigma;
- if (Parametrization == "Direct coloring") {
+ if (parametrization == "Absorption coefficient") {
Sigma = Color;
}
- else if (Parametrization == "physical") {
+ else if (parametrization == "physical") {
Sigma = -log3(max(Color, 1e-5));
}
- else if (Parametrization == "Melanin concentration") {
+ else if (parametrization == "Melanin concentration") {
Sigma = Color[0]*color(0.419, 0.697, 1.37) + Color[1]*color(0.187, 0.4, 1.05);
}
else {
@@ -48,5 +48,8 @@ shader node_principled_hair_bsdf(
Sigma *= Color;
}
- BSDF = principled_hair(Ng, Color, Ro
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list