[Bf-blender-cvs] [718d730bb40] soc-2018-hair-shader: A first attempt towards a OSL shader

L. E. Segovia noreply at git.blender.org
Wed May 30 03:22:08 CEST 2018


Commit: 718d730bb409322dd9078273bfc0dc16b956a8d6
Author: L. E. Segovia
Date:   Wed May 30 01:21:36 2018 +0000
Branches: soc-2018-hair-shader
https://developer.blender.org/rB718d730bb409322dd9078273bfc0dc16b956a8d6

A first attempt towards a OSL shader

Obviously, it doesn't work, but at least it renders something non-black...

Ref T54796

===================================================================

M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_hair_principled.h
M	intern/cycles/kernel/osl/osl_closures.cpp
M	intern/cycles/kernel/shaders/CMakeLists.txt
A	intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
M	intern/cycles/kernel/shaders/stdosl.h
M	intern/cycles/kernel/svm/svm_closure.h
M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib
M	source/tools

===================================================================

diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 0c26c74370d..f2c366725dc 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -172,7 +172,8 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
 				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
 			break;
 		case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
-			label = bsdf_principled_hair_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+			label = bsdf_principled_hair_sample(kg, sc, sd, randu, randv,
+				eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
 			break;
 #ifdef __PRINCIPLED__
 		case CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID:
@@ -320,7 +321,7 @@ float3 bsdf_eval(KernelGlobals *kg,
 		switch(sc->type) {
 			case CLOSURE_BSDF_DIFFUSE_ID:
 			case CLOSURE_BSDF_BSSRDF_ID:
-                eval = bsdf_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
+				eval = bsdf_diffuse_eval_transmit(sc, sd->I, omega_in, pdf);
 				break;
 #ifdef __SVM__
 			case CLOSURE_BSDF_OREN_NAYAR_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h
index e35cdf57abc..83de29d07dc 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_principled.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h
@@ -144,12 +144,12 @@ ccl_device_inline float4 combine_with_energy(float3 c)
 	return make_float4(c.x, c.y, c.z, linear_rgb_to_gray(c));
 }
 
-ccl_device int bsdf_principled_hair_setup(KernelGlobals *kg, ShaderData *sd, PrincipledHairBSDF *bsdf)
+ccl_device int bsdf_principled_hair_setup(PrincipledHairBSDF *bsdf)
 {
-	if((sd->type & PRIMITIVE_ALL_CURVE) == 0) {
-		bsdf->type = CLOSURE_BSDF_DIFFUSE_ID;
-		return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_NEEDS_LCG;
-	}
+	// if((sd->type & PRIMITIVE_ALL_CURVE) == 0) {
+	// 	bsdf->type = CLOSURE_BSDF_DIFFUSE_ID;
+	// 	return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_NEEDS_LCG;
+	// }
 
 	bsdf->type = CLOSURE_BSDF_HAIR_PRINCIPLED_ID;
 	bsdf->v = clamp(bsdf->v, 0.001f, 0.999f);
@@ -158,6 +158,11 @@ ccl_device int bsdf_principled_hair_setup(KernelGlobals *kg, ShaderData *sd, Pri
 	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;
+}
+
+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));
@@ -189,8 +194,6 @@ ccl_device int bsdf_principled_hair_setup(KernelGlobals *kg, ShaderData *sd, Pri
 	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;
 }
 
 ccl_device_inline void hair_ap(float f, float3 T, float4 *Ap)
@@ -237,7 +240,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 float3 bsdf_principled_hair_eval(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
+ccl_device_noinline 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);
@@ -320,13 +323,26 @@ ccl_device float3 bsdf_principled_hair_eval(const ShaderData *sd, const ShaderCl
 	return float4_to_float3(F);
 }
 
-ccl_device int bsdf_principled_hair_sample(ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+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__
 	//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
 #endif
 
-	const PrincipledHairBSDF *bsdf = (const PrincipledHairBSDF*) sc;
+	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 ee16ddaf0fd..473d1fd40f8 100644
--- a/intern/cycles/kernel/osl/osl_closures.cpp
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -59,6 +59,7 @@
 #include "kernel/closure/bsdf_ashikhmin_shirley.h"
 #include "kernel/closure/bsdf_toon.h"
 #include "kernel/closure/bsdf_hair.h"
+#include "kernel/closure/bsdf_hair_principled.h"
 #include "kernel/closure/bsdf_principled_diffuse.h"
 #include "kernel/closure/bsdf_principled_sheen.h"
 #include "kernel/closure/volume.h"
@@ -167,6 +168,16 @@ 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),
@@ -324,6 +335,9 @@ 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, "henyey_greenstein", id++,
 		closure_henyey_greenstein_params(), closure_henyey_greenstein_prepare);
 	register_closure(ss, "absorption", id++,
diff --git a/intern/cycles/kernel/shaders/CMakeLists.txt b/intern/cycles/kernel/shaders/CMakeLists.txt
index b28d017c1c2..3f2b1e9b5ef 100644
--- a/intern/cycles/kernel/shaders/CMakeLists.txt
+++ b/intern/cycles/kernel/shaders/CMakeLists.txt
@@ -85,6 +85,7 @@ set(SRC_OSL
 	node_wave_texture.osl
 	node_wireframe.osl
 	node_hair_bsdf.osl
+	node_principled_hair_bsdf.osl
 	node_uv_map.osl
 	node_principled_bsdf.osl
 	node_rgb_to_bw.osl
diff --git a/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
new file mode 100644
index 00000000000..8ed788a54b8
--- /dev/null
+++ b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "stdosl.h"
+
+color log3 (color a) {
+    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,
+
+	output closure color BSDF = 0)
+{
+    color Sigma;
+
+	if (Parametrization == "Direct coloring") {
+		Sigma = Color;
+	}
+	else if (Parametrization == "physical") {
+		Sigma = -log3(max(Color, 1e-5));
+	}
+	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 {
+		float roughness_fac = (((((0.245*RoughnessU) + 5.574)*RoughnessU - 10.73)*RoughnessU + 2.532)*RoughnessU - 0.215)*RoughnessU + 5.969;
+		Sigma = log3(Color)/roughness_fac;
+		Sigma *= Color;
+	}
+
+	BSDF = principled_hair(Ng, Color, RoughnessU, RoughnessV, Offset, IOR);
+}
diff --git a/intern/cycles/kernel/shaders/stdosl.h b/intern/cycles/kernel/shaders/stdosl.h
index 091ade4a60d..020cc9e151b 100644
--- a/intern/cycles/kernel/shaders/stdosl.h
+++ b/intern/cycles/kernel/shaders/stdosl.h
@@ -554,6 +554,7 @@ closure color bssrdf(string method, normal N, vector radius, color albedo) BUILT
 // Hair
 closure color hair_reflection(normal N, float roughnessu, float roughnessv, vector T, float offset) BUILTIN;
 closure color hair_transmission(normal N, float roughnessu, float roughnessv, vector T, float offset) BUILTIN;
+closure color principled_hair(normal N, color sigma, float roughnessu, float roughnessv, float alpha, float eta) BUILTIN;
 
 // Volume
 closure color henyey_greenstein(float g) BUILTIN;
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 73b24a8785d..65cb4cbfd43 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -759,7 +759,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 						break;
 				}
 
-				sd->flag |= bsdf_principled_hair_setup(kg, sd, bsdf);
+				sd->flag |= bsdf_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list