Lightning in OpenGL with spot Light
So far we have seen lighting effects which have the following properties:
- The light is being projected from an infinite distance.
- The rate of fading of the brightness at the circumference is very low.
But, we might want to produce lights, which have a position in the scene and are not projected from an infinite source unlike the normal lighting which we have seen so far. Like a study lamp or a spot light on a pool table, etc.
Source Code:
#include <windows.h>
#include <GL/glut.h>
static double yVal=1.0;
int spot(double a, double b, double c, double d, double e, double f){
/*
a, b and c -- x, y and z co-ordinates for light position
d, e and f -- x, y and z co-ordinates for spot light position
*/
GLfloat mat_specular[] = { 0.3, 1.0, 0.3, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { a,b,c, 1.0 };
GLfloat spotDir[] = { d,e,f };
glClearColor (0.5, 0.5, 0.5, 0.0);
glShadeModel (GL_SMOOTH);
glLightfv(GL_LIGHT0,GL_SPECULAR,mat_specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
// Definig spotlight attributes
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,95.0);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spotDir);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_DEPTH_TEST);
return 0;
}
void drawSphere(){
GLUquadricObj* cyl;
glClearColor (0.5, 0.5, 0.5, 0.0);
GLfloat light_position[] = { 50.0, 50.0 , 0.0, 1.0 };
GLfloat mat_specular[] = { 0.3, 0.3, 1.0, 1.0 };
GLfloat mat_shininess[] = { 100.0 };
GLfloat spotDir[] = { 50.0, 30.0, 0.0 };
glShadeModel (GL_SMOOTH);
spot( yVal,5.0,1.5,10.0,1.0,10.0);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0, 1.0, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
gluLookAt (30.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
cyl = gluNewQuadric();
gluQuadricDrawStyle(cyl, GLU_FILL);
glPushMatrix();
gluSphere(cyl, 4.0, 1000, 1000);
glPopMatrix();
glFlush();
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawSphere();
glFlush ();
}
void init (void){
glClearColor (0.5, 0.5, 0.5, 0.0);
glEnable(GL_DEPTH_TEST); //enabling z-buffer
/* initialize viewing values */
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0, 1.0, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
gluLookAt (30.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void keyboard(unsigned char key, int x, int y){
switch (key) {
case 27: // “esc” on keyboard
exit(0);
break;
case 97: // “a” on keyboard
yVal++;
glutPostRedisplay();
break;
}
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (600, 600);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Spot Light - Programming Techniques");
init ();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}Output
