Code: Select all
uniform int light_enabled[gl_MaxLights];
uniform int max_light_enabled;
uniform vec4 detail0Plane;
uniform vec4 detail1Plane;
//temporarily using the Sun's solid angle, as seen from Earth, for the solid
//angle of all light sources, until this parameter can be passed as a uniform
//for each light.
#define SUNS_SOLID_ANGLE (0.000263759)
/* varyings:
* gl_TexCoord[...]
* 0 - tex coord
* 1 - ws normal
* 2 - ws tangent
* 3 - ws binormal
* 4 - vertex-to-eye direction
* 5 - vertex-to-light0@xyz, light_size@z
* 6 - vertex-to-light1@xyz, light_size@z
* 7 - untransformed vertex position
**/
//float selfshadowStep(float VNdotL) { return step(0.0,VNdotL); } // fast but hard selfshadow function
float selfshadowStep(float VNdotL) { return smoothstep(0.0,0.25,VNdotL); } // costly but soft and nice selfshadow function
vec4 lightPosAndSize0(in vec4 vertex)
{
vec4 lpos = gl_LightSource[0].position;
vec4 rv;
rv.xyz = lpos.xyz - vertex.xyz*lpos.w;
rv.w = SUNS_SOLID_ANGLE;
return rv;
}
vec4 lightPosAndSize1(in vec4 vertex)
{
vec4 lpos = gl_LightSource[1].position;
vec4 rv;
rv.xyz = lpos.xyz - vertex.xyz*lpos.w;
rv.w = SUNS_SOLID_ANGLE;
return rv;
}
vec4 lightPosAndSize2(in vec4 vertex)
{
vec4 lpos = gl_LightSource[2].position;
vec4 rv;
rv.xyz = normalize( lpos.xyz - vertex.xyz*lpos.w );
rv.w = 1.0;
return rv;
}
vec4 lightPosAndSize3(in vec4 vertex)
{
vec4 lpos = gl_LightSource[3].position;
vec4 rv;
rv.xyz = normalize( lpos.xyz - vertex.xyz*lpos.w );
rv.w = 1.0;
return rv;
}
vec4 lightPosAndSize4(in vec4 vertex)
{
vec4 lpos = gl_LightSource[4].position;
vec4 rv;
rv.xyz = normalize( lpos.xyz - vertex.xyz*lpos.w );
rv.w = 1.0;
return rv;
}
vec4 lightPosAndSize5(in vec4 vertex)
{
vec4 lpos = gl_LightSource[5].position;
vec4 rv;
rv.xyz = normalize( lpos.xyz - vertex.xyz*lpos.w );
rv.w = 1.0;
return rv;
}
vec4 lightPosAndSize6(in vec4 vertex)
{
vec4 lpos = gl_LightSource[6].position;
vec4 rv;
rv.xyz = normalize( lpos.xyz - vertex.xyz*lpos.w );
rv.w = 1.0;
return rv;
}
vec4 lightPosAndSize7(in vec4 vertex)
{
vec4 lpos = gl_LightSource[7].position;
vec4 rv;
rv.xyz = normalize( lpos.xyz - vertex.xyz*lpos.w );
rv.w = 1.0;
return rv;
}
void lighting2(in vec4 vertex, in vec3 refl, in vec3 normal, inout vec4 pc, inout vec4 sc)
{
vec4 lpatt = lightPosAndSize2(vertex);
float NdotL = dot( lpatt.xyz, normal );
float RdotL = dot( lpatt.xyz, refl );
pc += lpatt.w*( gl_FrontMaterial.ambient * gl_LightSource[2].ambient
+ max(0.0, NdotL) * gl_LightSource[2].diffuse * gl_FrontMaterial.diffuse );
sc += lpatt.w*( pow( max(0.0, RdotL) , max(1.0,gl_FrontMaterial.shininess) ) * selfshadowStep(NdotL)
* gl_LightSource[2].specular * gl_FrontMaterial.specular );
}
void lighting3(in vec4 vertex, in vec3 refl, in vec3 normal, inout vec4 pc, inout vec4 sc)
{
vec4 lpatt = lightPosAndSize3(vertex);
float NdotL = dot( lpatt.xyz, normal );
float RdotL = dot( lpatt.xyz, refl );
pc += lpatt.w*( gl_FrontMaterial.ambient * gl_LightSource[3].ambient
+ max(0.0, NdotL) * gl_LightSource[3].diffuse * gl_FrontMaterial.diffuse );
sc += lpatt.w*( pow( max(0.0, RdotL) , max(1.0,gl_FrontMaterial.shininess) ) * selfshadowStep(NdotL)
* gl_LightSource[3].specular * gl_FrontMaterial.specular );
}
void lighting4(in vec4 vertex, in vec3 refl, in vec3 normal, inout vec4 pc, inout vec4 sc)
{
vec4 lpatt = lightPosAndSize4(vertex);
float NdotL = dot( lpatt.xyz, normal );
float RdotL = dot( lpatt.xyz, refl );
pc += lpatt.w*( gl_FrontMaterial.ambient * gl_LightSource[4].ambient
+ max(0.0, NdotL) * gl_LightSource[4].diffuse * gl_FrontMaterial.diffuse );
sc += lpatt.w*( pow( max(0.0, RdotL) , max(1.0,gl_FrontMaterial.shininess) ) * selfshadowStep(NdotL)
* gl_LightSource[4].specular * gl_FrontMaterial.specular );
}
void lighting5(in vec4 vertex, in vec3 refl, in vec3 normal, inout vec4 pc, inout vec4 sc)
{
vec4 lpatt = lightPosAndSize5(vertex);
float NdotL = dot( lpatt.xyz, normal );
float RdotL = dot( lpatt.xyz, refl );
pc += lpatt.w*( gl_FrontMaterial.ambient * gl_LightSource[5].ambient
+ max(0.0, NdotL) * gl_LightSource[5].diffuse * gl_FrontMaterial.diffuse );
sc += lpatt.w*( pow( max(0.0, RdotL) , max(1.0,gl_FrontMaterial.shininess) ) * selfshadowStep(NdotL)
* gl_LightSource[5].specular * gl_FrontMaterial.specular );
}
void main()
{
// Compute position, eye-to-object direction and normalized world-space normal
vec4 position = gl_ModelViewMatrix * gl_Vertex;
vec3 eyetopos = normalize(position.xyz);
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec3 tangent = normalize(gl_NormalMatrix * gl_MultiTexCoord2.xyz);
vec3 binormal = cross(tangent, normal) * sign(gl_MultiTexCoord2.w);
// Load varyings
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1].xyz = normal;
gl_TexCoord[2].xyz = tangent;
gl_TexCoord[3].xyz = binormal;
gl_TexCoord[4].xyz = -eyetopos;
gl_TexCoord[5] = lightPosAndSize0(position);
gl_TexCoord[6] = lightPosAndSize1(position);
gl_TexCoord[1].w =
gl_TexCoord[2].w =
gl_TexCoord[3].w =
gl_TexCoord[4].w = 0.0;
gl_TexCoord[7] = position;
// set primary color to the emissive material properties
vec4 pc = gl_FrontMaterial.emission;
vec4 sc = vec4(0.0);
vec3 refl = reflect( eyetopos, normal );
if (max_light_enabled >= 2)
{
if (light_enabled[2] != 0) lighting2(position, refl, normal, pc, sc);
if (light_enabled[3] != 0) lighting3(position, refl, normal, pc, sc);
if (light_enabled[4] != 0) lighting4(position, refl, normal, pc, sc);
if (light_enabled[5] != 0) lighting5(position, refl, normal, pc, sc);
}
// Need this instead of ftransform() for invariance
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_BackColor = pc;
gl_FrontSecondaryColor = gl_BackSecondaryColor = sc;
}
No difference whatsoever. Wonder if the problem is in default.vp at all...