88 lines
2.5 KiB
Text
88 lines
2.5 KiB
Text
|
varying vec3 q_tilde;
|
||
|
//varying float u_tilde;
|
||
|
varying vec3 inv_T_square_v;
|
||
|
varying vec3 inv_T_square_e_c;
|
||
|
varying vec4 e_clip;
|
||
|
varying vec4 V_clip;
|
||
|
varying vec3 h0;
|
||
|
varying vec3 l0;
|
||
|
varying vec3 h1;
|
||
|
varying vec3 l1;
|
||
|
varying vec4 a;
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
// decompress the matrix T
|
||
|
mat3 T;
|
||
|
T[0] = gl_MultiTexCoord0.xyz;
|
||
|
T[1].x = gl_MultiTexCoord0.y;
|
||
|
T[1].yz = gl_MultiTexCoord1.xy;
|
||
|
T[2].x = gl_MultiTexCoord0.z;
|
||
|
T[2].y = gl_MultiTexCoord1.y;
|
||
|
T[2].z = gl_MultiTexCoord1.z;
|
||
|
|
||
|
// invert the matrix T
|
||
|
mat3 inv_T;
|
||
|
float inv_denom = 1.0/dot(T[0],cross(T[1],T[2]));
|
||
|
inv_T[0] = inv_denom*cross(T[1],T[2]);
|
||
|
inv_T[1] = inv_denom*cross(T[2],T[0]);
|
||
|
inv_T[2] = inv_denom*cross(T[0],T[1]);
|
||
|
|
||
|
// determine eye point in parameter space
|
||
|
vec3 e = gl_ModelViewMatrixInverse[3].xyz;
|
||
|
vec3 e_tilde = inv_T*(e - gl_Vertex.xyz);
|
||
|
|
||
|
// compute helper
|
||
|
float inv_e_square = 1.0/dot(e_tilde,e_tilde);
|
||
|
|
||
|
// determine silhoutte center in parameter space
|
||
|
vec3 m_tilde = inv_e_square*e_tilde;
|
||
|
|
||
|
// determine radius of silhouette in parameter space
|
||
|
float r = sqrt(1.0-inv_e_square);
|
||
|
|
||
|
// compute vector x of length r orthogonal to e in parameter space
|
||
|
vec3 x_tilde = vec3(0,0,0);
|
||
|
if (abs(e_tilde[1]) > abs(e_tilde[0]))
|
||
|
x_tilde[0] = 1.0;
|
||
|
else
|
||
|
x_tilde[1] = 1.0;
|
||
|
x_tilde = r*normalize(cross(x_tilde,e_tilde));
|
||
|
|
||
|
// compute vector y of length r orthogonal to x and e in parameter space
|
||
|
vec3 y_tilde = r*normalize(cross(e_tilde,x_tilde));
|
||
|
|
||
|
// compute the corner point in homogeneous object coordinates
|
||
|
vec3 V_tilde = m_tilde+gl_MultiTexCoord2.x*x_tilde+gl_MultiTexCoord2.y*y_tilde;
|
||
|
vec3 v_tilde = V_tilde - e_tilde;
|
||
|
|
||
|
vec4 V;
|
||
|
V.xyz = T*V_tilde+gl_Vertex.xyz;
|
||
|
V.w = 1.0;
|
||
|
|
||
|
q_tilde.xy = gl_MultiTexCoord2.xy;
|
||
|
q_tilde.z = sqrt(inv_e_square);
|
||
|
|
||
|
// compute vector from eye to vertex in eye space
|
||
|
vec3 v = (gl_ModelViewMatrix*V).xyz;
|
||
|
|
||
|
|
||
|
// compute components to compute normal in eye space
|
||
|
inv_T_square_e_c = gl_NormalMatrix*(inv_T*e_tilde);
|
||
|
inv_T_square_v = gl_NormalMatrix*(inv_T*v_tilde);
|
||
|
|
||
|
// compute light source directions
|
||
|
l0 = normalize(gl_LightSource[0].position.xyz);
|
||
|
|
||
|
// compute half vectors in eye space
|
||
|
v = -normalize(v);
|
||
|
h0 = normalize(v+l0);
|
||
|
l1 = normalize(vec3(gl_LightSource[1].position));
|
||
|
h1 = normalize(v+l1);
|
||
|
|
||
|
gl_FrontColor = gl_Color;
|
||
|
e_clip = gl_ModelViewProjectionMatrix * gl_ModelViewMatrixInverse[3];
|
||
|
V_clip = gl_ModelViewProjectionMatrix * V;
|
||
|
gl_Position = V_clip;
|
||
|
a = gl_FrontLightModelProduct.sceneColor;
|
||
|
}
|