Lighting Question

Hi All,

I have a question about lighting in OpenGL.

I am using GLUT to draw two spheres. One has been translated to (-1.5, 0, 0). The other has been translated to (1.5, 0, 0).

I place my light at (1,1,0). You would expect both objects to be lit from different sides but what I am seeing is that the shadows, and highlights appear to be what you would see if the objects were at (0,0,0).

Is this a problem with Normals or am I missing something else here.

Any help is appreciated.

I have also included a short source example if anyone is interested.

Source:
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glut.h>

void init(void)
{
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 90.0 };
GLfloat light_position[] = { 1.0, 1.0, 0.0, 0.0 };
GLfloat mat_ambient[] = { 0.6, 0.6, 0.6, 1.0 };
glClearColor (0.3, 0.3, 0.3, 0.0);
glShadeModel (GL_SMOOTH);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);

}

void display(void)
{
GLfloat mat_diffuse1[] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat mat_diffuse2[] = { 1.0, 1.0, 0.0, 1.0 };

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
glTranslatef(-1.5,0.0,0.0);
glutSolidSphere (0.5, 36, 36);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse2);
glTranslatef(3.0, 0.0, 0.0);
glutSolidSphere (0.5, 36, 36);

glFlush();

}

void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -40.0, 40.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -40.0, 40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (900, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

change

GLfloat light_position[] = { 1.0, 1.0, 0.0, 0.0 };

to

GLfloat light_position[] = { 1.0, 1.0, 0.0, 1.0 };

EDIT - Perhaps I should explain why really

when the fourth parameter is 0.0f the light is treated as though it is just directional (infinitely far away), and if the parameter is 1.0f the light is treated as positional and exists as a point at the coordinates you give it.

[This message has been edited by Shag (edited 03-03-2002).]

There are 2 issues here:

  1. directional or positional lights
  2. lights get transformed by the modelview

You are asking for a directional light so the light vector doesnt change.

For positional
glPushMatrix();
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPopMatrix();

is an easy way to keep the lights in place.

V-man

Thanks to both Shag and V-man. I will try out your suggestions.

One other note. I did think that I might be having trouble due to my translations so I called glLoadIdentity before drawing the light, and before drawing the spheres.

I guess if I had the fourth float set to 1.0, this would have made a difference.

Thanks again for the help,
jpummill