[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, &params); \
+            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