ajm113
ajm113

Reputation: 1006

OpenGL Lighting Not Shading

I'm attempting too add basic lighting to my scene. So far even without GLSL. It appears that my lighting doesn't work. And what I mean by that is everything has no shade at all (everything is lit up).

enter image description here

I know the picture isn't the best, but thats partly because of the texture is shaded in the image.

Here is my init code:

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);                            // Clear to black with full alpha
   glEnable(GL_DEPTH_TEST);                                         // Enable depth testing
   glDepthFunc(GL_LEQUAL);                                          // Specify depth testing function
   glClearDepth(1.0);                                               // Clear the full extent of the depth buffer (default)
   glEnable(GL_CULL_FACE);                                          // Enable face culling
   glCullFace(GL_BACK);                                             // Cull back faces of polygons
   glFrontFace(GL_CCW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
    glEnable ( GL_COLOR_MATERIAL );

    GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 0.2f };
    GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
    GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
    GLfloat position[] = {0, 100.0f, 0, 1.0f };

    glLightModelfv(GL_AMBIENT, ambientLight);
    glLightModelfv(GL_DIFFUSE, ambientLight);
    glLightModelfv(GL_SPECULAR, specularLight);
    glLightModelfv(GL_POSITION, position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
    glLightfv(GL_LIGHT0, GL_POSITION, position);

Draw code:

 glEnable(GL_COLOR_MATERIAL);
 glEnable(GL_LIGHTING);
 glEnable(GL_NORMALIZE);

 //For loop of the lights...
      glLightfv(GL_LIGHT0+m_lights.at(i)->id, GL_POSITION, glm_to_array(m_lights.at(i)->position));
        glEnable(GL_LIGHT0+m_lights.at(i)->id);

 //Draw geometry here...

And yes, I am retrieving the normals from the mesh file and inserting the glNormal3f of every face. (GL_TRIANGLES) And even the plane the model sits on never gets affected even if I completely change the normal to random values.

Plane Example:

 if(m_shader_programme){
        glUseProgram(m_shader_programme);
    }

    if(m_texture_id){
        glBindTexture(GL_TEXTURE_2D, m_texture_id);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    }


    glBegin(GL_TRIANGLES);

        glNormal3f(0.0f, 1.0f, 0.0f);
        glTexCoord2f(0.0f, m_sizey/10);
        glVertex3f(m_sizex, m_height, m_sizey);

        glTexCoord2f(m_sizex/10, m_sizey/10);
        glVertex3f(m_sizex, m_height, -m_sizey);

        glTexCoord2f(m_sizex/10, 0.0f);
        glVertex3f(-m_sizex, m_height, -m_sizey);

        glNormal3f(0.0f, 1.0f, 0.0f);

        glTexCoord2f(m_sizex/10, 0.0f);
        glVertex3f(-m_sizex, m_height, -m_sizey);

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-m_sizex, m_height, m_sizey);

        glTexCoord2f(0.0f, m_sizey/10);
        glVertex3f(m_sizex, m_height, m_sizey);
    glEnd();

    if(m_shader_programme){
        glUseProgram(0);
    }

    if(m_texture_id){
        glBindTexture(GL_TEXTURE_2D, 0);
    }

GLSL Fragment Shader:

#version 120

uniform sampler2D tex;

void main()
{
    vec4 color = texture2D(tex,gl_TexCoord[0].st);
    gl_FragColor = color;
}

Vertex Shader:

#version 120

void main() {

    vec3 normal, lightDir;
    vec4 diffuse, ambient, globalAmbient;
    float NdotL;


    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    normal = normalize(gl_NormalMatrix * gl_Normal);
    lightDir = normalize(vec3(gl_LightSource[0].position));
    NdotL = max(dot(normal, lightDir), 0.0);
    diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
    /* Compute the ambient and globalAmbient terms */

    ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
    globalAmbient = gl_LightModel.ambient * gl_FrontMaterial.ambient;
    gl_FrontColor =  NdotL * diffuse + globalAmbient + ambient;


    gl_Position = ftransform();
}

System Specs

Just encase anyone is wondering why I'm not using OpenGL 3.x is because GL 3.x doesn't appear to play nice on my machine.

Upvotes: 1

Views: 880

Answers (1)

sbabbi
sbabbi

Reputation: 11181

Your fragment shader:

vec4 color = texture2D(tex,gl_TexCoord[0].st);
gl_FragColor = color;

Simply discards all the computations you did in the vertex shader and samples the texture color. You need to multiply the texture sample by the interpolated color value:

 vec4 color = texture2D(tex, gl_TexCoord[0].st) * gl_Color;
                                                  ^~~~~~
 gl_FragColor = color;

Upvotes: 4

Related Questions