[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51383] trunk/blender: Cycles: add Tangent input for Anisotropic BSDF.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Oct 17 14:17:19 CEST 2012


Revision: 51383
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51383
Author:   blendix
Date:     2012-10-17 12:17:17 +0000 (Wed, 17 Oct 2012)
Log Message:
-----------
Cycles: add Tangent input for Anisotropic BSDF.

Also refactor SVM BSDF code, preparing it to be shared with OSL.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_attribute.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_microfacet.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_oren_nayar.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_reflection.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_refraction.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_transparent.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_ward.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_westin.h
    trunk/blender/intern/cycles/kernel/svm/svm.h
    trunk/blender/intern/cycles/kernel/svm/svm_bsdf.h
    trunk/blender/intern/cycles/kernel/svm/svm_closure.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c

Modified: trunk/blender/intern/cycles/kernel/kernel_attribute.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_attribute.h	2012-10-17 12:12:26 UTC (rev 51382)
+++ trunk/blender/intern/cycles/kernel/kernel_attribute.h	2012-10-17 12:17:17 UTC (rev 51383)
@@ -59,7 +59,7 @@
 			attr_map = kernel_tex_fetch(__attributes_map, ++attr_offset);
 		
 		/* return result */
-		return (attr_map.y == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : attr_map.z;
+		return (attr_map.y == ATTR_ELEMENT_NONE) ? (int)ATTR_STD_NOT_FOUND : (int)attr_map.z;
 	}
 }
 

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-10-17 12:12:26 UTC (rev 51382)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2012-10-17 12:17:17 UTC (rev 51383)
@@ -98,7 +98,6 @@
 #ifdef __DPDU__
 	/* dPdu/dPdv */
 	triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
-	sd->T = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 
 #ifdef __INSTANCING__
@@ -123,7 +122,6 @@
 #ifdef __DPDU__
 		sd->dPdu = -sd->dPdu;
 		sd->dPdv = -sd->dPdv;
-		sd->T = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 	}
 
@@ -223,8 +221,6 @@
 		}
 #endif
 	}
-
-   	sd->T = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 
 	/* backfacing test */
@@ -310,7 +306,6 @@
 	/* dPdu/dPdv */
 	sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
 	sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
-	sd->T = make_float3(0.0f, 0.0f, 0.0f);
 #endif
 
 #ifdef __RAY_DIFFERENTIALS__

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-17 12:12:26 UTC (rev 51382)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-17 12:17:17 UTC (rev 51383)
@@ -369,7 +369,9 @@
 #endif
 	float data0;
 	float data1;
+
 	float3 N;
+	float3 T;
 
 } ShaderClosure;
 
@@ -440,9 +442,6 @@
 	/* differential of P w.r.t. parametric coordinates. note that dPdu is
 	 * not readily suitable as a tangent for shading on triangles. */
 	float3 dPdu, dPdv;
-
-	/* tangent for shading */
-	float3 T;
 #endif
 
 #ifdef __OBJECT_MOTION__

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h	2012-10-17 12:12:26 UTC (rev 51382)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h	2012-10-17 12:17:17 UTC (rev 51383)
@@ -35,11 +35,6 @@
 
 CCL_NAMESPACE_BEGIN
 
-typedef struct BsdfAshikhminVelvetClosure {
-	//float3 m_N;
-	float m_invsigma2;
-} BsdfAshikhminVelvetClosure;
-
 __device void bsdf_ashikhmin_velvet_setup(ShaderData *sd, ShaderClosure *sc, float sigma)
 {
 	sigma = fmaxf(sigma, 0.01f);
@@ -55,17 +50,17 @@
 {
 }
 
-__device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+__device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
 	float m_invsigma2 = sc->data0;
-	float3 m_N = sc->N;
+	float3 N = sc->N;
 
-	float cosNO = dot(m_N, I);
-	float cosNI = dot(m_N, omega_in);
+	float cosNO = dot(N, I);
+	float cosNI = dot(N, omega_in);
 	if(cosNO > 0 && cosNI > 0) {
 		float3 H = normalize(omega_in + I);
 
-		float cosNH = dot(m_N, H);
+		float cosNH = dot(N, H);
 		float cosHO = fabsf(dot(I, H));
 
 		if(!(fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f))
@@ -93,32 +88,32 @@
 	return make_float3(0, 0, 0);
 }
 
-__device float3 bsdf_ashikhmin_velvet_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+__device float3 bsdf_ashikhmin_velvet_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
 	return make_float3(0.0f, 0.0f, 0.0f);
 }
 
-__device float bsdf_ashikhmin_velvet_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+__device float bsdf_ashikhmin_velvet_albedo(const ShaderClosure *sc, const float3 I)
 {
 	return 1.0f;
 }
 
-__device int bsdf_ashikhmin_velvet_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+__device int bsdf_ashikhmin_velvet_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)
 {
 	float m_invsigma2 = sc->data0;
-	float3 m_N = sc->N;
+	float3 N = sc->N;
 
 	// we are viewing the surface from above - send a ray out with uniform
 	// distribution over the hemisphere
-	sample_uniform_hemisphere(m_N, randu, randv, omega_in, pdf);
+	sample_uniform_hemisphere(N, randu, randv, omega_in, pdf);
 
-	if(dot(sd->Ng, *omega_in) > 0) {
-		float3 H = normalize(*omega_in + sd->I);
+	if(dot(Ng, *omega_in) > 0) {
+		float3 H = normalize(*omega_in + I);
 
-		float cosNI = dot(m_N, *omega_in);
-		float cosNO = dot(m_N, sd->I);
-		float cosNH = dot(m_N, H);
-		float cosHO = fabsf(dot(sd->I, H));
+		float cosNI = dot(N, *omega_in);
+		float cosNO = dot(N, I);
+		float cosNH = dot(N, H);
+		float cosHO = fabsf(dot(I, H));
 
 		if(fabsf(cosNO) > 1e-5f && fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f) {
 			float cosNHdivHO = cosNH / cosHO;
@@ -140,8 +135,8 @@
 
 #ifdef __RAY_DIFFERENTIALS__
 			// TODO: find a better approximation for the retroreflective bounce
-			*domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
-			*domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+			*domega_in_dx = (2 * dot(N, dIdx)) * N - dIdx;
+			*domega_in_dy = (2 * dot(N, dIdy)) * N - dIdy;
 			*domega_in_dx *= 125.0f;
 			*domega_in_dy *= 125.0f;
 #endif

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h	2012-10-17 12:12:26 UTC (rev 51382)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h	2012-10-17 12:17:17 UTC (rev 51383)
@@ -37,10 +37,6 @@
 
 /* DIFFUSE */
 
-typedef struct BsdfDiffuseClosure {
-	//float3 m_N;
-} BsdfDiffuseClosure;
-
 __device void bsdf_diffuse_setup(ShaderData *sd, ShaderClosure *sc)
 {
 	sc->type = CLOSURE_BSDF_DIFFUSE_ID;
@@ -51,38 +47,38 @@
 {
 }
 
-__device float3 bsdf_diffuse_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+__device float3 bsdf_diffuse_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
-	float3 m_N = sc->N;
+	float3 N = sc->N;
 
-	float cos_pi = fmaxf(dot(m_N, omega_in), 0.0f) * M_1_PI_F;
+	float cos_pi = fmaxf(dot(N, omega_in), 0.0f) * M_1_PI_F;
 	*pdf = cos_pi;
 	return make_float3(cos_pi, cos_pi, cos_pi);
 }
 
-__device float3 bsdf_diffuse_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+__device float3 bsdf_diffuse_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
 	return make_float3(0.0f, 0.0f, 0.0f);
 }
 
-__device float bsdf_diffuse_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+__device float bsdf_diffuse_albedo(const ShaderClosure *sc, const float3 I)
 {
 	return 1.0f;
 }
 
-__device int bsdf_diffuse_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+__device int bsdf_diffuse_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)
 {
-	float3 m_N = sc->N;
+	float3 N = sc->N;
 
 	// distribution over the hemisphere
-	sample_cos_hemisphere(m_N, randu, randv, omega_in, pdf);
+	sample_cos_hemisphere(N, randu, randv, omega_in, pdf);
 
-	if(dot(sd->Ng, *omega_in) > 0.0f) {
+	if(dot(Ng, *omega_in) > 0.0f) {
 		*eval = make_float3(*pdf, *pdf, *pdf);
 #ifdef __RAY_DIFFERENTIALS__
 		// TODO: find a better approximation for the diffuse bounce
-		*domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
-		*domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+		*domega_in_dx = (2 * dot(N, dIdx)) * N - dIdx;
+		*domega_in_dy = (2 * dot(N, dIdy)) * N - dIdy;
 		*domega_in_dx *= 125.0f;
 		*domega_in_dy *= 125.0f;
 #endif
@@ -95,10 +91,6 @@
 
 /* TRANSLUCENT */
 
-typedef struct BsdfTranslucentClosure {
-	//float3 m_N;
-} BsdfTranslucentClosure;
-
 __device void bsdf_translucent_setup(ShaderData *sd, ShaderClosure *sc)
 {
 	sc->type = CLOSURE_BSDF_TRANSLUCENT_ID;
@@ -109,38 +101,38 @@
 {
 }
 
-__device float3 bsdf_translucent_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+__device float3 bsdf_translucent_eval_reflect(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
 	return make_float3(0.0f, 0.0f, 0.0f);
 }
 
-__device float3 bsdf_translucent_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+__device float3 bsdf_translucent_eval_transmit(const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
-	float3 m_N = sc->N;
+	float3 N = sc->N;
 
-	float cos_pi = fmaxf(-dot(m_N, omega_in), 0.0f) * M_1_PI_F;
+	float cos_pi = fmaxf(-dot(N, omega_in), 0.0f) * M_1_PI_F;
 	*pdf = cos_pi;
 	return make_float3 (cos_pi, cos_pi, cos_pi);
 }
 
-__device float bsdf_translucent_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+__device float bsdf_translucent_albedo(const ShaderClosure *sc, const float3 I)
 {
 	return 1.0f;
 }
 
-__device int bsdf_translucent_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+__device int bsdf_translucent_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)
 {
-	float3 m_N = sc->N;
+	float3 N = sc->N;
 
 	// we are viewing the surface from the right side - send a ray out with cosine
 	// distribution over the hemisphere

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list