diff options
author | Thomas Dinges <blender@dingto.org> | 2013-05-18 18:36:03 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2013-05-18 18:36:03 +0400 |
commit | eaf493d323ce778c0b68a793b9cd6c813315aea3 (patch) | |
tree | 1868ee01db89af2e156c37837c46fa293405b508 | |
parent | 040279679c229fb6ca4d3c6424166492a02e5cc1 (diff) |
Cycles / OSL:
* Added Westin Sheen and Westin Backscatter closures for testing, useful for Cloth like effects.
Only available via OSL, added an example OSL shader to the Templates (Text Editor).
-rw-r--r-- | intern/cycles/kernel/closure/bsdf.h | 16 | ||||
-rw-r--r-- | intern/cycles/kernel/closure/bsdf_westin.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/CMakeLists.txt | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/bsdf_westin.cpp | 177 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/osl_closures.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/stdosl.h | 2 | ||||
-rw-r--r-- | release/scripts/templates_osl/westin_closure.osl | 12 |
8 files changed, 209 insertions, 14 deletions
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h index 6403606c2df..76b80ba9d86 100644 --- a/intern/cycles/kernel/closure/bsdf.h +++ b/intern/cycles/kernel/closure/bsdf.h @@ -96,14 +96,14 @@ __device int bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const ShaderCl label = bsdf_ashikhmin_velvet_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); break; - case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: + /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: label = bsdf_westin_backscatter_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); break; case CLOSURE_BSDF_WESTIN_SHEEN_ID: label = bsdf_westin_sheen_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf); - break; + break;*/ #endif default: label = LABEL_NONE; @@ -165,12 +165,12 @@ __device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderC case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: eval = bsdf_ashikhmin_velvet_eval_reflect(sc, sd->I, omega_in, pdf); break; - case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: + /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: eval = bsdf_westin_backscatter_eval_reflect(sc, sd->I, omega_in, pdf); break; case CLOSURE_BSDF_WESTIN_SHEEN_ID: eval = bsdf_westin_sheen_eval_reflect(sc, sd->I, omega_in, pdf); - break; + break;*/ #endif default: eval = make_float3(0.0f, 0.0f, 0.0f); @@ -214,12 +214,12 @@ __device float3 bsdf_eval(KernelGlobals *kg, const ShaderData *sd, const ShaderC case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: eval = bsdf_ashikhmin_velvet_eval_transmit(sc, sd->I, omega_in, pdf); break; - case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: + /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: eval = bsdf_westin_backscatter_eval_transmit(sc, sd->I, omega_in, pdf); break; case CLOSURE_BSDF_WESTIN_SHEEN_ID: eval = bsdf_westin_sheen_eval_transmit(sc, sd->I, omega_in, pdf); - break; + break;*/ #endif default: eval = make_float3(0.0f, 0.0f, 0.0f); @@ -281,12 +281,12 @@ __device void bsdf_blur(KernelGlobals *kg, ShaderClosure *sc, float roughness) case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: bsdf_ashikhmin_velvet_blur(sc, roughness); break; - case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: + /*case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID: bsdf_westin_backscatter_blur(sc, roughness); break; case CLOSURE_BSDF_WESTIN_SHEEN_ID: bsdf_westin_sheen_blur(sc, roughness); - break; + break;*/ #endif default: break; diff --git a/intern/cycles/kernel/closure/bsdf_westin.h b/intern/cycles/kernel/closure/bsdf_westin.h index 9ad1c175713..e1a6b031d5e 100644 --- a/intern/cycles/kernel/closure/bsdf_westin.h +++ b/intern/cycles/kernel/closure/bsdf_westin.h @@ -118,9 +118,8 @@ __device int bsdf_westin_backscatter_sample(const ShaderClosure *sc, float3 Ng, __device int bsdf_westin_sheen_setup(ShaderClosure *sc) { - float edginess = sc->data0; + /* float edginess = sc->data0; */ sc->type = CLOSURE_BSDF_WESTIN_SHEEN_ID; - sc->data0 = edginess; return SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY; } diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt index 0ce40eda4df..be1e1c68bc9 100644 --- a/intern/cycles/kernel/osl/CMakeLists.txt +++ b/intern/cycles/kernel/osl/CMakeLists.txt @@ -17,6 +17,7 @@ set(SRC bsdf_diffuse_ramp.cpp bsdf_phong_ramp.cpp bsdf_toon.cpp + bsdf_westin.cpp emissive.cpp osl_bssrdf.cpp osl_closures.cpp diff --git a/intern/cycles/kernel/osl/bsdf_westin.cpp b/intern/cycles/kernel/osl/bsdf_westin.cpp new file mode 100644 index 00000000000..d8129b1ce7c --- /dev/null +++ b/intern/cycles/kernel/osl/bsdf_westin.cpp @@ -0,0 +1,177 @@ +/* + * Adapted from Open Shading Language with this license: + * + * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al. + * All Rights Reserved. + * + * Modifications Copyright 2011, Blender Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Sony Pictures Imageworks nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <OpenImageIO/fmath.h> + +#include <OSL/genclosure.h> + +#include "osl_closures.h" + +#include "kernel_types.h" +#include "kernel_montecarlo.h" +#include "closure/bsdf_westin.h" + +CCL_NAMESPACE_BEGIN + +using namespace OSL; + +/* WESTIN BACKSCATTER */ + +class WestinBackscatterClosure : public CBSDFClosure { +public: + WestinBackscatterClosure() : CBSDFClosure(LABEL_GLOSSY) {} + + size_t memsize() const { return sizeof(*this); } + const char *name() const { return "westin_backscatter"; } + + void setup() + { + sc.prim = this; + m_shaderdata_flag = bsdf_westin_backscatter_setup(&sc); + } + + bool mergeable(const ClosurePrimitive *other) const + { + return false; + } + + void blur(float roughness) + { + bsdf_westin_backscatter_blur(&sc, roughness); + } + + void print_on(std::ostream &out) const + { + out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))"; + } + + float3 eval_reflect(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_westin_backscatter_eval_reflect(&sc, omega_out, omega_in, &pdf); + } + + float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_westin_backscatter_eval_transmit(&sc, omega_out, omega_in, &pdf); + } + + int sample(const float3 &Ng, + const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, + float randu, float randv, + float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, + float &pdf, float3 &eval) const + { + return bsdf_westin_backscatter_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, + randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); + } +}; + +ClosureParam *closure_westin_backscatter_params() +{ + static ClosureParam params[] = { + CLOSURE_FLOAT3_PARAM(WestinBackscatterClosure, sc.N), + CLOSURE_FLOAT_PARAM(WestinBackscatterClosure, sc.data0), + CLOSURE_STRING_KEYPARAM("label"), + CLOSURE_FINISH_PARAM(WestinBackscatterClosure) + }; + return params; +} + +CLOSURE_PREPARE(closure_westin_backscatter_prepare, WestinBackscatterClosure) + +/* WESTIN SHEEN */ + +class WestinSheenClosure : public CBSDFClosure { +public: + WestinSheenClosure() : CBSDFClosure(LABEL_DIFFUSE) {} + + size_t memsize() const { return sizeof(*this); } + const char *name() const { return "westin_sheen"; } + + void setup() + { + sc.prim = this; + m_shaderdata_flag = bsdf_westin_sheen_setup(&sc); + } + + bool mergeable(const ClosurePrimitive *other) const + { + return false; + } + + void blur(float roughness) + { + bsdf_westin_sheen_blur(&sc, roughness); + } + + void print_on(std::ostream &out) const + { + out << name() << " ((" << sc.N[0] << ", " << sc.N[1] << ", " << sc.N[2] << "))"; + } + + float3 eval_reflect(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_westin_sheen_eval_reflect(&sc, omega_out, omega_in, &pdf); + } + + float3 eval_transmit(const float3 &omega_out, const float3 &omega_in, float& pdf) const + { + return bsdf_westin_sheen_eval_transmit(&sc, omega_out, omega_in, &pdf); + } + + int sample(const float3 &Ng, + const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy, + float randu, float randv, + float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy, + float &pdf, float3 &eval) const + { + return bsdf_westin_sheen_sample(&sc, Ng, omega_out, domega_out_dx, domega_out_dy, + randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf); + } +}; + +ClosureParam *closure_westin_sheen_params() +{ + static ClosureParam params[] = { + CLOSURE_FLOAT3_PARAM(WestinSheenClosure, sc.N), + CLOSURE_FLOAT_PARAM(WestinSheenClosure, sc.data0), + CLOSURE_STRING_KEYPARAM("label"), + CLOSURE_FINISH_PARAM(WestinSheenClosure) + }; + return params; +} + +CLOSURE_PREPARE(closure_westin_sheen_prepare, WestinSheenClosure) + + +CCL_NAMESPACE_END + diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp index 9ce11ca1207..b477b186080 100644 --- a/intern/cycles/kernel/osl/osl_closures.cpp +++ b/intern/cycles/kernel/osl/osl_closures.cpp @@ -181,10 +181,6 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) bsdf_ward_params(), bsdf_ward_prepare); register_closure(ss, "ashikhmin_velvet", id++, bsdf_ashikhmin_velvet_params(), bsdf_ashikhmin_velvet_prepare); - register_closure(ss, "westin_backscatter", id++, - bsdf_westin_backscatter_params(), bsdf_westin_backscatter_prepare); - register_closure(ss, "westin_sheen", id++, - bsdf_westin_sheen_params(), bsdf_westin_sheen_prepare); register_closure(ss, "emission", id++, closure_emission_params(), closure_emission_prepare); register_closure(ss, "background", id++, @@ -201,6 +197,10 @@ void OSLShader::register_closures(OSLShadingSystem *ss_) closure_bsdf_diffuse_toon_params(), closure_bsdf_diffuse_toon_prepare); register_closure(ss, "specular_toon", id++, closure_bsdf_specular_toon_params(), closure_bsdf_specular_toon_prepare); + register_closure(ss, "westin_backscatter", id++, + closure_westin_backscatter_params(), closure_westin_backscatter_prepare); + register_closure(ss, "westin_sheen", id++, + closure_westin_sheen_params(), closure_westin_sheen_prepare); register_closure(ss, "bssrdf_cubic", id++, closure_bssrdf_params(), closure_bssrdf_prepare); } diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h index d0e25bb2b0c..79b9b378d12 100644 --- a/intern/cycles/kernel/osl/osl_closures.h +++ b/intern/cycles/kernel/osl/osl_closures.h @@ -51,6 +51,8 @@ OSL::ClosureParam *closure_bsdf_diffuse_ramp_params(); OSL::ClosureParam *closure_bsdf_phong_ramp_params(); OSL::ClosureParam *closure_bsdf_diffuse_toon_params(); OSL::ClosureParam *closure_bsdf_specular_toon_params(); +OSL::ClosureParam *closure_westin_backscatter_params(); +OSL::ClosureParam *closure_westin_sheen_params(); OSL::ClosureParam *closure_bssrdf_params(); void closure_emission_prepare(OSL::RendererServices *, int id, void *data); @@ -61,6 +63,8 @@ void closure_bsdf_diffuse_ramp_prepare(OSL::RendererServices *, int id, void *da void closure_bsdf_phong_ramp_prepare(OSL::RendererServices *, int id, void *data); void closure_bsdf_diffuse_toon_prepare(OSL::RendererServices *, int id, void *data); void closure_bsdf_specular_toon_prepare(OSL::RendererServices *, int id, void *data); +void closure_westin_backscatter_prepare(OSL::RendererServices *, int id, void *data); +void closure_westin_sheen_prepare(OSL::RendererServices *, int id, void *data); void closure_bssrdf_prepare(OSL::RendererServices *, int id, void *data); enum { diff --git a/intern/cycles/kernel/shaders/stdosl.h b/intern/cycles/kernel/shaders/stdosl.h index 010d6ddd200..9c9e04ab721 100644 --- a/intern/cycles/kernel/shaders/stdosl.h +++ b/intern/cycles/kernel/shaders/stdosl.h @@ -447,6 +447,8 @@ closure color diffuse_ramp(normal N, color colors[8]) BUILTIN; closure color phong_ramp(normal N, float exponent, color colors[8]) BUILTIN; closure color diffuse_toon(normal N, float size, float smooth) BUILTIN; closure color specular_toon(normal N, float size, float smooth) BUILTIN; +closure color westin_backscatter(normal N, float roughness) BUILTIN; +closure color westin_sheen(normal N, float edginess) BUILTIN; closure color translucent(normal N) BUILTIN; closure color reflection(normal N) BUILTIN; closure color refraction(normal N, float eta) BUILTIN; diff --git a/release/scripts/templates_osl/westin_closure.osl b/release/scripts/templates_osl/westin_closure.osl new file mode 100644 index 00000000000..8d90f3aa306 --- /dev/null +++ b/release/scripts/templates_osl/westin_closure.osl @@ -0,0 +1,12 @@ + +shader node_westin_bsdf( + color Color = 0.8, + float Roughness = 0.5, + float Edginess = 0.2, + normal Normal = N, + output closure color Sheen = 0, + output closure color Backscatter = 0) +{ + Sheen = Color * westin_sheen(Normal, Roughness); + Backscatter = Color * westin_backscatter(Normal, Edginess); +}
\ No newline at end of file |