[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