[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27260] branches/render25/source/blender/ render/intern: Render Branch: implement area lamp form factor usage again like in old material

Brecht Van Lommel brecht at blender.org
Thu Mar 4 12:14:30 CET 2010


Revision: 27260
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27260
Author:   blendix
Date:     2010-03-04 12:14:29 +0100 (Thu, 04 Mar 2010)

Log Message:
-----------
Render Branch: implement area lamp form factor usage again like in old material
system, it works better. Though it also completely breaks the material/lamp
separation, and I'm not sure how this could work in a node system. Still, quick
area lamps with no noise seems to be useful..

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/material.h
    branches/render25/source/blender/render/intern/source/lamp.c
    branches/render25/source/blender/render/intern/source/material.c
    branches/render25/source/blender/render/intern/source/shadeoutput.c

Modified: branches/render25/source/blender/render/intern/include/material.h
===================================================================
--- branches/render25/source/blender/render/intern/include/material.h	2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/include/material.h	2010-03-04 11:14:29 UTC (rev 27260)
@@ -51,6 +51,7 @@
 #define BSDF_SPECULAR		2
 #define BSDF_REFLECTION		(BSDF_DIFFUSE|BSDF_SPECULAR)
 #define BSDF_TRANSMISSION	4
+#define BSDF_AREA_FF_HACK	8
 
 void mat_bsdf_f(float bsdf[3],
 	struct ShadeMaterial *mat, struct ShadeGeometry *geom, int thread, float lv[3], int flag);

Modified: branches/render25/source/blender/render/intern/source/lamp.c
===================================================================
--- branches/render25/source/blender/render/intern/source/lamp.c	2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/source/lamp.c	2010-03-04 11:14:29 UTC (rev 27260)
@@ -66,7 +66,7 @@
 
 static float area_lamp_form_factor(LampRen *lar, float co[3], float n[3], float lv[3])
 {
-	float v1[3], v2[3], v3[3], v4[3], fn[3], ff, inp;
+	float v1[3], v2[3], v3[3], v4[3], fn[3], ff;
 
 	area_lamp_location(v1, lar, 0.0f, 0.0f);
 	area_lamp_location(v2, lar, 1.0f, 0.0f);
@@ -76,11 +76,7 @@
 	negate_v3_v3(fn, n);
 	ff= form_factor_hemi_poly(co, fn, v4, v3, v2, v1)*(M_PI/area_quad_v3(v1, v2, v3, v4));
 
-	/* TODO ugly compensation for cosine term being included here and again in
-	   material, doesn't work with shaders that don't include this.. */
-	inp= maxf(dot_v3v3(n, lv), 1e-8f);
-
-	return ff/inp;
+	return ff;
 }
 
 /******************************* Visibility ********************************/
@@ -193,25 +189,26 @@
 			sub_v3_v3v3(vec, co, lco);
 			dist= normalize_v3(vec);
 
-			if(dot_v3v3(lar->vec, vec) > 0.0f) {
-
-				if(lar->mode & LA_MULTI_SHADE) {
+			if(lar->mode & LA_MULTI_SHADE) {
+				if(dot_v3v3(lar->vec, vec) > 0.0f) {
 					fac= lamp_falloff(lar, dist);
 					fac *= dot_v3v3(lar->vec, vec);
 
 					if(lar->mode & LA_SPHERE)
 						fac= lamp_sphere_factor(lar, dist, fac);
 				}
-				else if(r_fac) /* optimization, skip for only shadow */
+				else
+					fac= 0.0f;
+			}
+			else {
+				if(r_fac) /* optimization, skip for only shadow */
 					fac= area_lamp_form_factor(lar, co, vn, vec);
 				else
 					fac= 1.0f;
-
-				if(fac <= 1e-6f) fac = 0.0f;
 			}
-			else
-				fac= 0.0f;
 
+			if(fac <= 1e-6f) fac = 0.0f;
+
 			break;
 
 		case LA_SPOT:

Modified: branches/render25/source/blender/render/intern/source/material.c
===================================================================
--- branches/render25/source/blender/render/intern/source/material.c	2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/source/material.c	2010-03-04 11:14:29 UTC (rev 27260)
@@ -480,7 +480,7 @@
 	}
 }
 
-static void diffuse_shader(float diff[3], ShadeMaterial *mat, ShadeGeometry *geom, float *lv)
+static void diffuse_shader(float diff[3], ShadeMaterial *mat, ShadeGeometry *geom, float *lv, int area_ff_hack)
 {
 	Material *ma= mat->mat;
 	float *view= geom->view;
@@ -492,9 +492,17 @@
 	}
 
 	vn= diffuse_tangent(mat, geom, vnor, lv);
-	inp= dot_v3v3(vn, lv);
-	inp= MAX2(inp, 0.0f);
 
+	if(area_ff_hack) {
+		/* area lamps already includes cosine term by computing the form factor,
+		   this hack is not sustainable in more complex shading systems.. */
+		inp= 1.0f;
+	}
+	else {
+		inp= dot_v3v3(vn, lv);
+		inp= MAX2(inp, 0.0f);
+	}
+
 	/* diffuse shaders (oren nayer gets inp from area light) */
 	if(ma->diff_shader==MA_DIFF_ORENNAYAR)
 		fac= brdf_diffuse_oren_nayar(inp, vn, lv, view, ma->roughness);
@@ -608,7 +616,7 @@
 	zero_v3(bsdf);
 
 	if(flag & BSDF_DIFFUSE) {
-		diffuse_shader(tmp, mat, geom, lv);
+		diffuse_shader(tmp, mat, geom, lv, flag & BSDF_AREA_FF_HACK);
 		add_v3_v3(bsdf, tmp);
 	}
 

Modified: branches/render25/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/render25/source/blender/render/intern/source/shadeoutput.c	2010-03-04 01:07:26 UTC (rev 27259)
+++ branches/render25/source/blender/render/intern/source/shadeoutput.c	2010-03-04 11:14:29 UTC (rev 27260)
@@ -411,8 +411,10 @@
 
 	/* diffuse */
 	if(!(lar->mode & LA_NO_DIFF) && (passflag & (SCE_PASS_COMBINED|SCE_PASS_DIFFUSE|SCE_PASS_SHADOW))) {
-		mat_bsdf_f(diff, &shi->material, &shi->geometry, shi->shading.thread, lv, BSDF_DIFFUSE);
+		int area_ff_hack= (lar->type == LA_AREA && !(lar->mode & LA_MULTI_SHADE))? BSDF_AREA_FF_HACK: 0;
 
+		mat_bsdf_f(diff, &shi->material, &shi->geometry, shi->shading.thread, lv, BSDF_DIFFUSE|area_ff_hack);
+
 		if(lar->mode & LA_ONLYSHADOW) {
 			shr->onlyshadow[0] += diff[0]*lainf[0]*(1.0f - lashdw[0]);
 			shr->onlyshadow[1] += diff[1]*lainf[1]*(1.0f - lashdw[1]);





More information about the Bf-blender-cvs mailing list