Lightning in OpenGL with Material Effect

This is second tutorial on Lightning in OpenGL. In this tutorial, I will discuss about producing Material Effect in OpenGL. Material parameters specify how a surface reflects light. Applications change OpenGL material parameters to emulate different colored materials, shiny and flat materials, high gloss materials such as pool ball, etc.
The routine glColor3f(), sets the primary color and is a good idea to call this routine as long as we are not using lighting effects. The OpenGL lighting doesn’t use the primary color, instead uses the material colors. Hence it is important to introduce materials while talking about lighting.

So far we have seen a simple lighting example which has no material effects. But, in order to make the scene more attractive, we have to make use of materials. In the following code, we have used a green material. We make use of GL_SPECULAR, GL_AMBIENT, GL_SHININESS depending on the
scene requirements. The same parameters are also applicable to lighting methods.

Source Code:

 
#include 
 
#include 
 
 
 
static double yVal=50.0;
 
 
 
void drawSphere(){
 
    GLUquadricObj* cyl;
 
    GLfloat light_position[] = { 0.0, 40.0, yVal, 0.0 };
 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
 
    GLfloat mat_specular[] = { 0.3f, 1.0f, 0.3f, 1.0f }; // Green color material
 
    GLfloat mat_shininess[] = { 70.0 }; // Defines shininess
 
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); // Using materials
 
    glMaterialfv(GL_FRONT, GL_AMBIENT, 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);
 
    gluSphere(cyl, 2.0, 50, 50);
 
    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
 
    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 = yVal-5.0;
 
        glutPostRedisplay();
 
        break;
 
    }
 
}
 
 
 
int main(int argc, char** argv){
 
    glutInit(&argc, argv);
 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
 
    glutInitWindowSize (600, 600);
 
    glutInitWindowPosition (100, 100);
 
    glutCreateWindow ("Light Material effect - Programming Techniques");
 
    init ();
 
    glutDisplayFunc(display);
 
    glutKeyboardFunc(keyboard);
 
    glutMainLoop();
 
    return 0;
 
}
 
 
 

Output