davoring

12-27-2014, 04:03 AM

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:

1573

and this is when I get if I use NO shader:

1574

What could I be doing wrong?

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:

1573

and this is when I get if I use NO shader:

1574

What could I be doing wrong?