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).]