PDA

View Full Version : strange light behaviour



Norling
04-02-2002, 05:12 AM
I am trying to light a surface made from a few triangle strips but when putting the light in the middle only half of the patch gets lit.

you can see a picture of it at http://www.empetre.nu/ljusfel2.jpg

my code looks like this:

#include <stdlib.h>
#include <GL\glut.h>
#include <math.h>
#include "lighting.h"

static GLfloat rot = 0.0;
static GLfloat roty = 0.0;

Patch_3D thePatch(15, 15);

GLdouble coord_x = thePatch.X/2;
GLdouble coord_y = 2;
GLdouble coord_z = thePatch.Z/2;
GLdouble f = 0.5;

bool points = true;
bool lines = true;
bool surface = true;
bool hoger = true;
bool animated = false;

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

void init(void){
glClearColor(0.0, 0.0 ,0.0 ,0.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLineWidth(1);
glPointSize(3);
glEnable(GL_DEPTH_TEST);

GLfloat light_ambient[] = {0.0, 0.0, 0.0, 1.0};
GLfloat light_diffuse[] = {0.7, 0.7, 0.7, 1.0};
GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};

glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0);

glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
}

void ShowSurface(Patch_3D thePatch){
glColor3f(0.0, 0.0, 1.0);
for(GLuint i = 0; i < thePatch.X-1; i++){
glBegin(GL_TRIANGLE_STRIP);
for(GLuint j = 0; j < thePatch.Z; j++){
glVertex3fv(thePatch.points[i][j]);
glVertex3fv(thePatch.points[i+1][j]);
}
glEnd();
}
}

void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glRotatef(rot, 0.0, 0.0, 1.0);

light_position[0] = 7.5;
light_position[1] = 0.0;
light_position[2] = 7.5;
light_position[3] = 1.0;

gluLookAt(coord_x, 10, coord_z, coord_x, coord_y, 0.001+coord_z,0.0, 1.0, 0.0); //Top view

glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glScalef(1.0, 1.0, 1.0);

if(surface) ShowSurface(thePatch);
if(lines) ShowLines(thePatch);
if(points) ShowPoints(thePatch);

glutSwapBuffers();
}

-------------------

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, -10.0, 10.0);
else
glOrtho(-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h,
-1.5, 1.5, -10.0, 10.0);
gluPerspective(60.0, 1.0, 1.5, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


If anyone could tell me what I'm doing wrong I would really appreciate it!!

/M
[Edit: added reshape]


[This message has been edited by Norling (edited 04-02-2002).]

Norling
04-02-2002, 10:20 AM
no one answered... not that it mattered... I realized that if you are stupid enough to start lighting things without calculation normals you deserve to get errors...

nexusone
04-02-2002, 10:36 AM
Sometimes the best way to learn is to find out the error yourself!

Happy to hear your problem is solved, if you had waited a little longer one of us would have given you a answer.....
Not everyone is on here 24/7.

http://www.opengl.org/discussion_boards/ubb/smile.gif


Originally posted by Norling:
no one answered... not that it mattered... I realized that if you are stupid enough to start lighting things without calculation normals you deserve to get errors...



[This message has been edited by nexusone (edited 04-02-2002).]

Norling
04-02-2002, 01:00 PM
don't worry I know...
I was just a little tired...