[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11659] branches/soc-2007-maike/release/ glsl: Area light energy calculation bugfix

Miguel Torres Lima torreslima at gmail.com
Sat Aug 18 18:08:46 CEST 2007


Revision: 11659
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11659
Author:   maike
Date:     2007-08-18 18:08:46 +0200 (Sat, 18 Aug 2007)

Log Message:
-----------
Area light energy calculation bugfix

Modified Paths:
--------------
    branches/soc-2007-maike/release/glsl/area_energy.gsl
    branches/soc-2007-maike/release/glsl/lambert_area.gsl
    branches/soc-2007-maike/release/glsl/minnaert_area.gsl
    branches/soc-2007-maike/release/glsl/orennayar_area.gsl

Modified: branches/soc-2007-maike/release/glsl/area_energy.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/area_energy.gsl	2007-08-18 15:51:21 UTC (rev 11658)
+++ branches/soc-2007-maike/release/glsl/area_energy.gsl	2007-08-18 16:08:46 UTC (rev 11659)
@@ -6,6 +6,7 @@
 	float rad[4];
 
 	float fac;
+	float powfac;
 
 	vect1 = normalize(pos - vec3(l.mat[0][0], l.mat[0][1], l.mat[0][2]));
 	vect2 = normalize(pos - vec3(l.mat[1][0], l.mat[1][1], l.mat[1][2]));
@@ -32,6 +33,9 @@
 	fac += rad[2] * dot(vnormal, cross3);
 	fac += rad[3] * dot(vnormal, cross4);
 
-	fac = max(pow(-fac * l.areasize, l.k), 0.0);
+	powfac = -fac * l.areasize;
+	
+	if(powfac <= 0.0) return(0.0);
+	fac = max(pow(powfac, l.k), 0.0);
     	return(fac);
 }
\ No newline at end of file

Modified: branches/soc-2007-maike/release/glsl/lambert_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/lambert_area.gsl	2007-08-18 15:51:21 UTC (rev 11658)
+++ branches/soc-2007-maike/release/glsl/lambert_area.gsl	2007-08-18 16:08:46 UTC (rev 11659)
@@ -1,3 +1,3 @@
 float lambertarea(light l, vec3 vnormal, float unused1, float unused2){
-	return(area_energy(l, vnormal));
+	return(max(area_energy(l, vnormal), 0.0));
 }

Modified: branches/soc-2007-maike/release/glsl/minnaert_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/minnaert_area.gsl	2007-08-18 15:51:21 UTC (rev 11658)
+++ branches/soc-2007-maike/release/glsl/minnaert_area.gsl	2007-08-18 16:08:46 UTC (rev 11659)
@@ -1,44 +1,7 @@
-float minnaert_area_energy(light l, vec3 vnormal){
-	vec3 lightVec = normalize(l.loc - pos);
-	vec3 vect1, vect2, vect3, vect4;
-	vec3 cross1, cross2, cross3, cross4;
-	float rad[4];
-
-	float fac;
-
-	vect1 = normalize(pos - vec3(l.mat[0][0], l.mat[0][1], l.mat[0][2]));
-	vect2 = normalize(pos - vec3(l.mat[1][0], l.mat[1][1], l.mat[1][2]));
-	vect3 = normalize(pos - vec3(l.mat[2][0], l.mat[2][1], l.mat[2][2]));
-	vect4 = normalize(pos - vec3(l.mat[3][0], l.mat[3][1], l.mat[3][2]));
-
-	cross1 = normalize(cross(vect1, vect2));
-	cross2 = normalize(cross(vect2, vect3));
-	cross3 = normalize(cross(vect3, vect4));
-	cross4 = normalize(cross(vect4, vect1));
-	
-	rad[0] = dot(vect1, vect2);
-	rad[1] = dot(vect2, vect3);
-	rad[2] = dot(vect3, vect4);
-	rad[3] = dot(vect4, vect1);
-
-	rad[0] = acos(clamp(rad[0], -1.0, 1.0)) * (1.0 - floor(clamp(rad[0], 0.1, 1.0) + 0.00001));
-	rad[1] = acos(clamp(rad[1], -1.0, 1.0)) * (1.0 - floor(clamp(rad[1], 0.1, 1.0) + 0.00001));
-	rad[2] = acos(clamp(rad[2], -1.0, 1.0)) * (1.0 - floor(clamp(rad[2], 0.1, 1.0) + 0.00001));
-	rad[3] = acos(clamp(rad[3], -1.0, 1.0)) * (1.0 - floor(clamp(rad[3], 0.1, 1.0) + 0.00001));
-	
-	fac  = rad[0] * dot(vnormal, cross1);
-	fac += rad[1] * dot(vnormal, cross2);
-	fac += rad[2] * dot(vnormal, cross3);
-	fac += rad[3] * dot(vnormal, cross4);
-
-	fac = max(pow(-fac * l.areasize, l.k), 0.0);
-	return(fac);
-}
-
 float minnaertarea(light l, vec3 vnormal, float darkness, float unused){
 	vec3 lightVec = normalize(l.loc - pos);
 	vec3 view = normalize(eye - pos);
-	float nl = minnaert_area_energy(l, vnormal);  
+	float nl = area_energy(l, vnormal);  
 	float nv = max(dot(vnormal, view), 0.0);
 	float res;
 	if(darkness <= 1.0) res = nl * pow(max(nv * nl, 0.1), darkness - 1.0);

Modified: branches/soc-2007-maike/release/glsl/orennayar_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/orennayar_area.gsl	2007-08-18 15:51:21 UTC (rev 11658)
+++ branches/soc-2007-maike/release/glsl/orennayar_area.gsl	2007-08-18 16:08:46 UTC (rev 11659)
@@ -1,49 +1,10 @@
-float orennayar_area_energy(light l, vec3 vnormal){
-	vec3 lightVec = normalize(l.loc - pos);
-	vec3 vect1, vect2, vect3, vect4;
-	vec3 cross1, cross2, cross3, cross4;
-	float rad[4];
-
-	float fac;
-
-	vect1 = normalize(pos - vec3(l.mat[0][0], l.mat[0][1], l.mat[0][2]));
-	vect2 = normalize(pos - vec3(l.mat[1][0], l.mat[1][1], l.mat[1][2]));
-	vect3 = normalize(pos - vec3(l.mat[2][0], l.mat[2][1], l.mat[2][2]));
-	vect4 = normalize(pos - vec3(l.mat[3][0], l.mat[3][1], l.mat[3][2]));
-
-	cross1 = normalize(cross(vect1, vect2));
-	cross2 = normalize(cross(vect2, vect3));
-	cross3 = normalize(cross(vect3, vect4));
-	cross4 = normalize(cross(vect4, vect1));
-	
-	rad[0] = dot(vect1, vect2);
-	rad[1] = dot(vect2, vect3);
-	rad[2] = dot(vect3, vect4);
-	rad[3] = dot(vect4, vect1);
-
-	rad[0] = acos(clamp(rad[0], -1.0, 1.0)) * (1.0 - floor(clamp(rad[0], 0.1, 1.0) + 0.00001));
-	rad[1] = acos(clamp(rad[1], -1.0, 1.0)) * (1.0 - floor(clamp(rad[1], 0.1, 1.0) + 0.00001));
-	rad[2] = acos(clamp(rad[2], -1.0, 1.0)) * (1.0 - floor(clamp(rad[2], 0.1, 1.0) + 0.00001));
-	rad[3] = acos(clamp(rad[3], -1.0, 1.0)) * (1.0 - floor(clamp(rad[3], 0.1, 1.0) + 0.00001));
-	
-	fac  = rad[0] * dot(vnormal, cross1);
-	fac += rad[1] * dot(vnormal, cross2);
-	fac += rad[2] * dot(vnormal, cross3);
-	fac += rad[3] * dot(vnormal, cross4);
-
-	fac = max(pow(-fac * l.areasize, l.k), 0.0);
-	return(fac);
-}
-
 float orennayararea(light l, vec3 vnormal, float roughness, float unused){
-	
-
  	vec3 lightVec = normalize(l.loc - pos);	  
 	vec3 view = normalize(eye - pos);	
 	vec3 h = normalize(view + lightVec);
 	float nh = max(dot(vnormal, h), 0.0);
 	float nv = max(dot(vnormal, view), 0.0);
-	float nl = orennayar_area_energy(l, vnormal);      
+	float nl = area_energy(l, vnormal);      
 	float vh = max(dot(view, h), 0.0);
 	float lit_A = acos(clamp(nl, -1.0, 1.0)) * (1.0 - floor(clamp(nl, 0.1, 1.0) + 0.00001));
 	float view_A = acos(clamp(nv, -1.0, 1.0)) * (1.0 - floor(clamp(nv, 0.1, 1.0) + 0.00001));	





More information about the Bf-blender-cvs mailing list