[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