[Bf-blender-cvs] [81f6c06] cycles_disney_brdf: Merge branch 'master' into cycles_disney_brdf
Pascal Schoen
noreply at git.blender.org
Tue Aug 16 15:23:07 CEST 2016
Commit: 81f6c06b1f53180bf32a5c11ac1fa64e2b6abf52
Author: Pascal Schoen
Date: Wed Aug 3 11:42:02 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB81f6c06b1f53180bf32a5c11ac1fa64e2b6abf52
Merge branch 'master' into cycles_disney_brdf
===================================================================
===================================================================
diff --cc intern/cycles/kernel/closure/bsdf.h
index 1f225e1,a251e3b..72096f4
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@@ -120,23 -122,6 +126,23 @@@ ccl_device int bsdf_sample(KernelGlobal
label = bsdf_hair_transmission_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
break;
+ case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+ case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
+ label = bsdf_disney_diffuse_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
+ eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+ label = bsdf_disney_sheen_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
+ eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
- case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
++ /*case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
+ label = bsdf_disney_specular_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
+ eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
- break;
++ break;*/
+ case CLOSURE_BSDF_DISNEY_CLEARCOAT_ID:
+ label = bsdf_disney_clearcoat_sample(sc, ccl_fetch(sd, Ng), ccl_fetch(sd, I), ccl_fetch(sd, dI).dx, ccl_fetch(sd, dI).dy, randu, randv,
+ eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
#endif
#ifdef __VOLUME__
case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
@@@ -217,19 -205,6 +226,19 @@@ ccl_device float3 bsdf_eval(KernelGloba
case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
eval = bsdf_hair_transmission_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
+ case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+ case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
+ eval = bsdf_disney_diffuse_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+ eval = bsdf_disney_sheen_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
- case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
++ /*case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
+ eval = bsdf_disney_specular_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
- break;
++ break;*/
+ case CLOSURE_BSDF_DISNEY_CLEARCOAT_ID:
+ eval = bsdf_disney_clearcoat_eval_reflect(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
#endif
#ifdef __VOLUME__
case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
@@@ -292,19 -273,6 +307,19 @@@
case CLOSURE_BSDF_HAIR_TRANSMISSION_ID:
eval = bsdf_hair_transmission_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
break;
+ case CLOSURE_BSDF_DISNEY_DIFFUSE_ID:
+ case CLOSURE_BSDF_BSSRDF_DISNEY_ID:
+ eval = bsdf_disney_diffuse_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_DISNEY_SHEEN_ID:
+ eval = bsdf_disney_sheen_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
- case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
++ /*case CLOSURE_BSDF_DISNEY_SPECULAR_ID:
+ eval = bsdf_disney_specular_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
- break;
++ break;*/
+ case CLOSURE_BSDF_DISNEY_CLEARCOAT_ID:
+ eval = bsdf_disney_clearcoat_eval_transmit(sc, ccl_fetch(sd, I), omega_in, pdf);
+ break;
#endif
#ifdef __VOLUME__
case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
diff --cc intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
index 377d219,0000000..cdb8b3e
mode 100644,000000..100644
--- a/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
+++ b/intern/cycles/kernel/closure/bsdf_disney_clearcoat.h
@@@ -1,190 -1,0 +1,200 @@@
+/*
+ * 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.
+ */
+
+#ifndef __BSDF_DISNEY_CLEARCOAT_H__
+#define __BSDF_DISNEY_CLEARCOAT_H__
+
+CCL_NAMESPACE_BEGIN
+
++typedef ccl_addr_space struct DisneyClearcoatBsdf {
++ SHADER_CLOSURE_BASE;
+
- ccl_device int bsdf_disney_clearcoat_setup(ShaderClosure *sc)
++ float clearcoat, clearcoatGloss, clearcoatRoughness;
++ float3 N;
++} DisneyClearcoatBsdf;
++
++ccl_device int bsdf_disney_clearcoat_setup(DisneyClearcoatBsdf *bsdf)
+{
+ /* clearcoat roughness */
- sc->custom1 = 0.1f * (1.0f - sc->data1/*clearcoatGloss*/) + 0.001f * sc->data1/*clearcoatGloss*/; // lerp(0.1f, 0.001f, sc->data1/*clearcoatGloss*/); //
++ bsdf->clearcoatRoughness = 0.1f * (1.0f - bsdf->clearcoatGloss) + 0.001f * bsdf->clearcoatGloss; // lerp(0.1f, 0.001f, sc->data1/*clearcoatGloss*/); //
+
- sc->type = CLOSURE_BSDF_DISNEY_CLEARCOAT_ID;
++ bsdf->type = CLOSURE_BSDF_DISNEY_CLEARCOAT_ID;
+ return SD_BSDF|SD_BSDF_HAS_EVAL;
+}
+
+ccl_device float3 bsdf_disney_clearcoat_eval_reflect(const ShaderClosure *sc, const float3 I,
+ const float3 omega_in, float *pdf)
+{
- if (sc->data0 > 0.0f) {
- float alpha = sc->custom1;
- float3 N = sc->N;
++ const DisneyClearcoatBsdf *bsdf = (const DisneyClearcoatBsdf *)sc;
++
++ if (bsdf->clearcoat > 0.0f) {
++ float alpha = bsdf->clearcoatRoughness;
++ float3 N = bsdf->N;
+
+ if (alpha <= 1e-4f)
+ return make_float3(0.0f, 0.0f, 0.0f);
+
+ float cosNO = dot(N, I);
+ float cosNI = dot(N, omega_in);
+
+ if (cosNI > 0 && cosNO > 0) {
+ /* get half vector */
+ float3 m = normalize(omega_in + I);
+ float alpha2 = alpha * alpha;
+ float D, G1o, G1i;
+
+ /* isotropic
+ * eq. 20: (F*G*D)/(4*in*on)
+ * eq. 33: first we calculate D(m) */
+ float cosThetaM = dot(N, m);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ D = (alpha2 - 1) / (M_PI_F * logf(alpha2) * (1 + (alpha2 - 1) * cosThetaM2));
+
+ /* eq. 34: now calculate G1(i,m) and G1(o,m) */
+ G1o = 2 / (1 + safe_sqrtf(1 + 0.0625f * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ G1i = 2 / (1 + safe_sqrtf(1 + 0.0625f * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+
+ float G = G1o * G1i;
+
+ /* eq. 20 */
+ float common = D * 0.25f / cosNO;
+
+ float FH = schlick_fresnel(dot(omega_in, m));
- float3 F = (0.04f * (1.0f - FH) + 1.0f * FH) * 0.25f * sc->data0/*clearcoat*/ * make_float3(1.0f, 1.0f, 1.0f); // lerp(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
++ float3 F = (0.04f * (1.0f - FH) + 1.0f * FH) * 0.25f * bsdf->clearcoat * make_float3(1.0f, 1.0f, 1.0f); // lerp(make_float3(0.04f, 0.04f, 0.04f), make_float3(1.0f, 1.0f, 1.0f), FH);
+
+ float3 out = F * G * common;
+
+ /* eq. 2 in distribution of visible normals sampling
+ * pm = Dw = G1o * dot(m, I) * D / dot(N, I); */
+
+ /* eq. 38 - but see also:
+ * eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ * pdf = pm * 0.25 / dot(m, I); */
+ *pdf = G1o * common;
+
+ return out;
+ }
+ }
+
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+ccl_device float3 bsdf_disney_clearcoat_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+ccl_device int bsdf_disney_clearcoat_sample(const ShaderClosure *sc,
+ float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv,
+ float3 *eval, float3 *omega_in, float3 *domega_in_dx,
+ float3 *domega_in_dy, float *pdf)
+{
- if (sc->data0 > 0.0f) {
- float alpha = sc->custom1;
- float3 N = sc->N;
++ const DisneyClearcoatBsdf *bsdf = (const DisneyClearcoatBsdf *)sc;
++
++ if (bsdf->clearcoat > 0.0f) {
++ float alpha = bsdf->clearcoatRoughness;
++ float3 N = bsdf->N;
+
+ float cosNO = dot(N, I);
+ if (cosNO > 0) {
+ float3 X, Y, Z = N;
+
+ make_orthonormals(Z, &X, &Y);
+
+ /* importance sampling with distribution of visible normals. vectors are
+ * transformed to local space before and after */
+ float3 local_I = make_float3(dot(X, I), dot(Y, I), cosNO);
+ float3 local_m;
+ float3 m;
+ float G1o;
+
+ local_m = importance_sample_microfacet_stretched(local_I, alpha, alpha,
+ randu, randv, false, &G1o);
+
+ m = X*local_m.x + Y*local_m.y + Z*local_m.z;
+ float cosThetaM = local_m.z;
+
+ /* reflection or refraction? */
+ float cosMO = dot(m, I);
+
+ if (cosMO > 0) {
+ /* eq. 39 - compute actual reflected direction */
+ *omega_in = 2 * cosMO * m - I;
+
+ if (dot(Ng, *omega_in) > 0) {
+ if (alpha <= 1e-4f) {
+ /* some high number for MIS */
+ *pdf = 1e6f;
+ *eval = make_float3(1e6f, 1e6f, 1e6f);
+ }
+ else {
+ /* microf
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list