Hello,
I’m trying to make a shader that works as close as possible to the fixed functionality in terms of lighting, and I’m having some difficulties with that. My problem is that the end result is darker than when I use fixed unctionality, and I don’t understand why.
I used 3DLabs’ ShaderGen to generate a shader for one directional light, since this is what I use in my scene. Since the generated shader does not take the color assigned to the vertex into account, I added the line “color = color * gl_Color;”. This is the vertex shader I end up with:
/*******************************************************
* Fixed.vert Fixed Function Equivalent Vertex Shader *
* Automatically Generated by 3Dlabs GLSL ShaderGen *
* http://developer.3dlabs.com *
*******************************************************/
vec4 Ambient;
vec4 Diffuse;
vec4 Specular;
void directionalLight(in int i, in vec3 normal)
{
float nDotVP; // normal . light direction
float nDotHV; // normal . light half vector
float pf; // power factor
nDotVP = max(0.0, dot(normal, normalize(vec3 (gl_LightSource[i].position))));
nDotHV = max(0.0, dot(normal, vec3 (gl_LightSource[i].halfVector)));
if (nDotVP == 0.0)
{
pf = 0.0;
}
else
{
pf = pow(nDotHV, gl_FrontMaterial.shininess);
}
Ambient += gl_LightSource[i].ambient;
Diffuse += gl_LightSource[i].diffuse * nDotVP;
Specular += gl_LightSource[i].specular * pf;
}
vec3 fnormal(void)
{
//Compute the normal
vec3 normal = gl_NormalMatrix * gl_Normal;
normal = normalize(normal);
return normal;
}
void flight(in vec3 normal, in vec4 ecPosition, float alphaFade)
{
vec4 color;
vec3 ecPosition3;
vec3 eye;
ecPosition3 = (vec3 (ecPosition)) / ecPosition.w;
eye = vec3 (0.0, 0.0, 1.0);
// Clear the light intensity accumulators
Ambient = vec4 (0.0);
Diffuse = vec4 (0.0);
Specular = vec4 (0.0);
directionalLight(0, normal);
color = gl_FrontLightModelProduct.sceneColor +
Ambient * gl_FrontMaterial.ambient +
Diffuse * gl_FrontMaterial.diffuse;
color += Specular * gl_FrontMaterial.specular;
color = color * gl_Color; // This is the line I added
color = clamp( color, 0.0, 1.0 );
gl_FrontColor = color;
gl_FrontColor.a *= alphaFade;
}
void main (void)
{
vec3 transformedNormal;
float alphaFade = 1.0;
// Eye-coordinate position of vertex, needed in various calculations
vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
// Do fixed functionality vertex transform
gl_Position = ftransform();
transformedNormal = fnormal();
flight(transformedNormal, ecPosition, alphaFade);
}
This is what I get if I use the shader:
[ATTACH=CONFIG]852[/ATTACH]
and this is when I get if I use NO shader:
[ATTACH=CONFIG]853[/ATTACH]
What could I be doing wrong?