[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