[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11142] branches/soc-2007-maike/release/ glsl: Spot and area lights glsl generic functions
Miguel Torres Lima
torreslima at gmail.com
Mon Jul 2 13:30:43 CEST 2007
Revision: 11142
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11142
Author: maike
Date: 2007-07-02 13:30:43 +0200 (Mon, 02 Jul 2007)
Log Message:
-----------
Spot and area lights glsl generic functions
Modified Paths:
--------------
branches/soc-2007-maike/release/glsl/area_visibility.gsl
branches/soc-2007-maike/release/glsl/lambert.gsl
branches/soc-2007-maike/release/glsl/light_struct.gsl
branches/soc-2007-maike/release/glsl/spot_visibility.gsl
Added Paths:
-----------
branches/soc-2007-maike/release/glsl/blinn_area.gsl
branches/soc-2007-maike/release/glsl/cooktorr_area.gsl
branches/soc-2007-maike/release/glsl/difftoon_area.gsl
branches/soc-2007-maike/release/glsl/fresnel_area.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
branches/soc-2007-maike/release/glsl/phong_area.gsl
branches/soc-2007-maike/release/glsl/spectoon_area.gsl
branches/soc-2007-maike/release/glsl/wardiso_area.gsl
Modified: branches/soc-2007-maike/release/glsl/area_visibility.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/area_visibility.gsl 2007-07-02 11:29:01 UTC (rev 11141)
+++ branches/soc-2007-maike/release/glsl/area_visibility.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -1,8 +1,17 @@
float visibility_area(light l)
{
+ float visifac = 1.0;
vec3 lv = (pos - l.loc);
float dist = sqrt(dot(lv, lv));
float t = 1.0 / dist;
lv = lv * t;
- return ceil(max(dot(lv, l.vec) - 0.00001, -0.00001));
+ if(dot(lv, l.vec) > 0.0)
+ visifac = 1.0;
+ else
+ visifac = 0.0;
+
+ return(visifac);
}
+
+
+
Added: branches/soc-2007-maike/release/glsl/blinn_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/blinn_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/blinn_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,23 @@
+vec3 blinnarea(light l, vec3 vnormal, vec3 spec_color, float spec, float hard, float refrac){
+ vec3 view = normalize(eye - pos);
+
+ float har;
+ if(refrac < 1.0 || hard == 0.0) return(0.0, 0.0, 0.0, 0.0);
+ if(hard < 100.0) har = sqrt(1.0 / hard);
+ else har = 10.0 / hard;
+
+ vec3 h = normalize((eye - pos) + (l.loc - pos));
+ float nh = dot(vnormal, h);
+ float nv = max(dot(vnormal, view), 0.01);
+ float nl = dot(vnormal, normalize(l.loc - pos));
+ float vh = max(dot(view, h), 0.01);
+ float a = 1.0;
+ float b = (2.0 * nh * nv) / vh;
+ float c = (2.0 * nh * nl) / vh;
+ float ang = acos(clamp(nh, -1.0, 1.0));
+ float g = min(a, min(b, c));
+ float p = sqrt((refrac * refrac) + (vh * vh) - 1.0);
+ float f = (((p - vh) * (p - vh)) / ((p + vh) * (p + vh))) * (1.0 + ((((vh * (p + vh)) - 1.0) * ((vh * (p + vh)) - 1.0)) / (((vh * (p - vh)) + 1.0) * ((vh * (p - vh)) + 1.0))));
+ float rslt = max(f * g * exp((-1 * (ang * ang)) / (2.0 * har * har)), 0.0);
+ return(spec * rslt * vec3(l.color + vert_color) * spec_color);
+}
Added: branches/soc-2007-maike/release/glsl/cooktorr_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/cooktorr_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/cooktorr_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,7 @@
+vec3 cooktorrarea(light l, vec3 vnormal, vec3 spec_color, float spec, float hard, float unused){
+ vec3 view = normalize(eye - pos);
+ vec3 h = normalize((eye - pos) + (l.loc - pos));
+ float nh = max(dot(vnormal, h), 0.0);
+ float nv = max(dot(vnormal, view), 0.0);
+ return((spec * pow(nh, hard) * spec_color / (0.1 + nv)) * vec3(l.color + vert_color));
+}
Added: branches/soc-2007-maike/release/glsl/difftoon_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/difftoon_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/difftoon_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,10 @@
+vec3 difftoonarea(light l, vec3 vnormal, vec3 diff_color, float ref, float size, float smooth){
+ vec3 lightVec = normalize(l.loc - pos);
+ float rslt = dot(vnormal, lightVec);
+ float ang;
+ ang = acos(clamp(rslt, -1.0, 1.0)) * (1 - floor(clamp(rslt, 0.1, 1.0) + 0.00001));
+
+ rslt = (1.0 - max((ang - size) / smooth, 0.0)) * ceil(clamp(size + smooth - ang, 0.0, 1.0) - 0.00001);
+ return(rslt * ref * vec3(l.color + vert_color) * diff_color);
+}
+
Added: branches/soc-2007-maike/release/glsl/fresnel_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/fresnel_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/fresnel_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,7 @@
+vec3 fresnelarea(light l, vec3 vnormal, vec3 diff_color, float ref, float grad, float fac){
+ vec3 view = normalize(eye - pos);
+ float t1 = dot(view, vnormal);
+ float t2 = 1.0 + abs(t1);
+ t2 = grad + (1.0 - grad) * pow(t2, fac);
+ return(ref * clamp(t2, 0.0, 1.0) * vec3(l.color + vert_color) * diff_color);
+}
Modified: branches/soc-2007-maike/release/glsl/lambert.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/lambert.gsl 2007-07-02 11:29:01 UTC (rev 11141)
+++ branches/soc-2007-maike/release/glsl/lambert.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -1,4 +1,4 @@
vec3 lambertdef(light l, vec3 vnormal, vec3 diff_color, float ref, float unused1, float unused2){
vec3 lightVec = normalize(l.loc - pos);
- return(max(dot(lightVec, vnormal) * ref * vec3(l.color + vert_color) * diff_color, 0.0));
+ return(max(dot(lightVec, vnormal), 0.0) * ref * vec3(l.color + vert_color) * diff_color);
}
Added: branches/soc-2007-maike/release/glsl/lambert_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/lambert_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/lambert_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,36 @@
+vec3 lambertarea(light l, vec3 vnormal, vec3 diff_color, float ref, float unused1, float unused2){
+ 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 - floor(clamp(rad[0], 0.1, 1.0) + 0.00001));
+ rad[1] = acos(clamp(rad[1], -1.0, 1.0)) * (1 - floor(clamp(rad[1], 0.1, 1.0) + 0.00001));
+ rad[2] = acos(clamp(rad[2], -1.0, 1.0)) * (1 - floor(clamp(rad[2], 0.1, 1.0) + 0.00001));
+ rad[3] = acos(clamp(rad[3], -1.0, 1.0)) * (1 - 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 * ref * vec3(l.color + vert_color) * diff_color);
+}
Modified: branches/soc-2007-maike/release/glsl/light_struct.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/light_struct.gsl 2007-07-02 11:29:01 UTC (rev 11141)
+++ branches/soc-2007-maike/release/glsl/light_struct.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -16,4 +16,8 @@
int area_type;
int layer;
mat4 mat;
+ float areasize;
+ float k;
+ float spotsize;
+ float spotblend;
};
Added: branches/soc-2007-maike/release/glsl/minnaert_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/minnaert_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/minnaert_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,47 @@
+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 - floor(clamp(rad[0], 0.1, 1.0) + 0.00001));
+ rad[1] = acos(clamp(rad[1], -1.0, 1.0)) * (1 - floor(clamp(rad[1], 0.1, 1.0) + 0.00001));
+ rad[2] = acos(clamp(rad[2], -1.0, 1.0)) * (1 - floor(clamp(rad[2], 0.1, 1.0) + 0.00001));
+ rad[3] = acos(clamp(rad[3], -1.0, 1.0)) * (1 - 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);
+}
+
+vec3 minnaertarea(light l, vec3 vnormal, vec3 diff_color, float ref, float darkness, float unused){
+ vec3 lightVec = normalize(l.loc - pos);
+ vec3 view = normalize(eye - pos);
+ float nl = minnaert_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);
+ else res = nl * pow(1.001 - nv, darkness - 1.0);
+ return(ref * res * vec3(l.color + vert_color) * diff_color);
+}
Added: branches/soc-2007-maike/release/glsl/orennayar_area.gsl
===================================================================
--- branches/soc-2007-maike/release/glsl/orennayar_area.gsl (rev 0)
+++ branches/soc-2007-maike/release/glsl/orennayar_area.gsl 2007-07-02 11:30:43 UTC (rev 11142)
@@ -0,0 +1,61 @@
+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 - floor(clamp(rad[0], 0.1, 1.0) + 0.00001));
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list