/* CSCI 250 Fall 2002 Sample Z-buffer program Author: Don Allison (with help from OpenGL refs/web sites) Date: 4 October 2002 */ #include /* light colors and positions */ GLfloat ambient[] = {0.2, 0.2, 0.2, 1.0}; GLfloat red_diffuse[] = {1.0, 0.0, 0.0, 1.0}; GLfloat green_diffuse[] = {0.0, 1.0, 0.0, 1.0}; GLfloat blue_diffuse[] = {0.0, 0.0, 1.0, 1.0}; GLfloat position1[] = {10.0, 10.0, 10.0, 0.0}; GLfloat position2[] = {-10.0, -10.0, -10.0, 0.0}; GLfloat position3[] = {-10.0, 10.0, 10.0, 0.0}; /* object colors */ GLfloat cyan[] = {0.0, 0.8, 0.8, 1.0}; GLfloat magenta[] = {0.8, 0.0, 0.8, 1.0}; GLfloat yellow[] = {0.8, 0.8, 0.0, 1.0}; void init(void) { // set clear color glClearColor(0.0, 0.0, 0.0, 0.0); // drawing setup glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_DEPTH_TEST); // specify lights glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, red_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, position1); glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, green_diffuse); glLightfv(GL_LIGHT1, GL_POSITION, position2); glLightfv(GL_LIGHT2, GL_AMBIENT, ambient); glLightfv(GL_LIGHT2, GL_DIFFUSE, blue_diffuse); glLightfv(GL_LIGHT2, GL_POSITION, position3); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); } void display(void) { // clear display and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // draw two spheres glMatrixMode(GL_MODELVIEW); glMaterialfv(GL_FRONT, GL_AMBIENT, cyan); glMaterialfv(GL_FRONT, GL_DIFFUSE, cyan); glMaterialfv(GL_FRONT, GL_SPECULAR, cyan); glMaterialf(GL_FRONT, GL_SHININESS, 1000.0); glPushMatrix(); glTranslatef(2.0, 5.0, 2.0); glutSolidSphere(1.0, 10, 10); glPopMatrix(); glMaterialfv(GL_FRONT, GL_AMBIENT, yellow); glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow); glMaterialfv(GL_FRONT, GL_SPECULAR, yellow); glMaterialf(GL_FRONT, GL_SHININESS, 100000.0); glPushMatrix(); glTranslatef(-2.0, 2.0, -2.0); glutSolidSphere(1.5, 10, 10); glPopMatrix(); // draw plane glMaterialfv(GL_FRONT, GL_AMBIENT, magenta); glMaterialfv(GL_FRONT, GL_DIFFUSE, magenta); glMaterialfv(GL_FRONT, GL_SPECULAR, magenta); glMaterialf(GL_FRONT, GL_SHININESS, 100.0); glBegin(GL_POLYGON); glVertex3f(-5.0, 0.0, -5.0); glVertex3f(-5.0, 0.0, 5.0); glVertex3f(5.0, 0.0, 5.0); glVertex3f(5.0, 0.0, -5.0); glEnd(); // flip buffers so one were drawing in is now displayed glutSwapBuffers(); } void resize_window(int w, int h) { // set up viewport and perspective projection glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective (45.0, 5.0/4.0, 0.1, 200.0); // now set up the eye position glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(-10.0, 10.0, 5.0, // from 0.0, 2.0, 0.0, // at 0.0, 1.0, 0.0); // up } int main(int argc, char ** argv) { // standard glut stuff glutInit(&argc, argv); glutInitWindowPosition(100, 100); glutInitWindowSize(500, 500); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH); glutCreateWindow("zbuffer sample"); init(); glutReshapeFunc(resize_window); glutDisplayFunc(display); glutMainLoop(); return 0; }