#include <GL/gl.h> #include <GL/glu.h> #include "aux.h" /* Initialize z-buffer, projection matrix, light source, * and lighting model. Do not specify a material property here. */ void myinit(void) { GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 }; GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 }; GLfloat local_view[] = { 0.0 }; glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glClearColor(0.0, 0.1, 0.1, 0.0); } /* Draw twelve spheres in 3 rows with 4 columns. * The spheres in the first row have materials with no ambient reflection. * The second row has materials with significant ambient reflection. * The third row has materials with colored ambient reflection. * * The first column has materials with blue, diffuse reflection only. * The second column has blue diffuse reflection, as well as specular * reflection with a low shininess exponent. * The third column has blue diffuse reflection, as well as specular * reflection with a high shininess exponent (a more concentrated highlight). * The fourth column has materials which also include an emissive component. * * glTranslatef() is used to move spheres to their appropriate locations. */ GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 }; GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 }; GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 }; GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat no_shininess[] = { 0.0 }; GLfloat low_shininess[] = { 5.0 }; GLfloat high_shininess[] = { 100.0 }; GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0}; GLfloat *spec_mat[]={ no_mat,mat_specular,mat_specular,no_mat}; GLfloat *amb_mat[]={ no_mat,mat_ambient,mat_ambient_color}; GLfloat *shininess_mat[]={ no_shininess,low_shininess,high_shininess,no_shininess}; GLfloat *emission_mat[]={ no_mat,no_mat,no_mat,mat_emission}; void display(void) { int i,j; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); for (i=0;i<3;i++) { glMaterialfv(GL_FRONT, GL_AMBIENT,amb_mat[i]); for (j=0;j<4;j++) { glPushMatrix(); glTranslatef (-3.75+2.5*j, 3.0-3*i, 0.0); glMaterialfv(GL_FRONT, GL_SPECULAR, spec_mat[j]); glMaterialfv(GL_FRONT, GL_SHININESS,shininess_mat[j]); glMaterialfv(GL_FRONT, GL_EMISSION,emission_mat[j]); auxSolidSphere(1.0); glPopMatrix(); } } glFlush(); } void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= (h * 2)) glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w, 3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0); else glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2), 6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); } /* Main Loop * Open window with initial window size, title bar, * RGBA display mode, and handle input events. */ int main(int argc, char** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB | AUX_DEPTH); auxInitPosition (0, 0, 600, 450); auxInitWindow (argv[0]); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); }