Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
40 views

Getting Started With Opengl: Woo, Neider Et Al., Chapter 1

The document provides an introduction to OpenGL including key resources, how OpenGL works as a state machine, and a basic "Hello World" OpenGL program. It also covers handling input events, double buffering for animation, and a double buffering example program.

Uploaded by

rokoto98
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
40 views

Getting Started With Opengl: Woo, Neider Et Al., Chapter 1

The document provides an introduction to OpenGL including key resources, how OpenGL works as a state machine, and a basic "Hello World" OpenGL program. It also covers handling input events, double buffering for animation, and a double buffering example program.

Uploaded by

rokoto98
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 11

Getting Started with OpenGL

Woo, Neider et Al., Chapter 1


OpenGL Resources
OpenGL main site:
http://www.opengl.org/

GLUT: OpenGL Utility Toolkit:


http://www.xmission.com/~nate/glut.html

Programs from the book:


ftp://ftp.sgi.com/opengl/

Nate Robins Tutorial:


http://www.xmission.com/~nate/opengl.html
OpenGL as a State Machine
Set various stated and modes and they
remain in effect until you change them
Possible to read and write these state
variables (even as a collection, on a stack)

Example:
glutInitDisplayMode(GLUT_RGB);
glColor3f(1.0, 1.0, 1.0);

Write operations will be performed with the


RGB color white (1.0, 1.0, 1.0)
Program: Hello.c
#include <GL/glut.h>
#include <stdlib.h>

void display(void) {
glClear (GL_COLOR_BUFFER_BIT); /* clear all pixels */

/* draw white polygon with corners at (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */
glColor3f (1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd();

glFlush (); /* start processing buffered OpenGL routines */


}
Program: Hello.c
void init (void) {
glClearColor (0.0, 0.0, 0.0, 0.0); /* select clearing color */
glMatrixMode(GL_PROJECTION); /* initialize viewing values */
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

/* Declare initial window size, position, and display mode. Open window with
"hello in its title bar. Call initialization routines. Register callback function
to display graphics. Enter main loop and process events. */
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
init ();
glutDisplayFunc(display);
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
Handling Input Events
glutReshapeFunction()
To register the function that should be called when
resizing the window

glutKeyboardFunc(), glutMouseFunc()
To register the functions called to handle keyboard
and mouse events

glutMotionFunc()
To register the function that handles the mouse
movement when a button pressed
Handling Input Events - Example
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 27: /* ASCII code of the ESC key */
exit(0);
break;
}
}

/* Main Loop */
int main(int argc, char** argv) {
..
glutKeyboardFunc (keyboard);
..
}
Double Buffering
#include <GL/glut.h>
#include <stdlib.h>

static GLfloat spin = 0.0;

void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glRectf(-25.0, -25.0, 25.0, 25.0);
glPopMatrix();

glutSwapBuffers();
}
Double Buffering
void spinDisplay(void) {
spin = spin + 2.0;
if (spin > 360.0)
spin = spin - 360.0;
glutPostRedisplay();
}

void init(void) {
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}

void reshape(int w, int h) {


glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
Double Buffering
void mouse(int button, int state, int x, int y) {
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
Double Buffering
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}

You might also like