[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