Saturday, February 4, 2012

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


Spot Light in OpenGL

No comments:

Post a Comment