Introduction to OpenGL
TA: Xiaolin Yang
CISC 440/640
[email protected]The Programmer’s Interface
Programmer sees the graphics system
through a software interface: the
Application Programmer Interface (API)
OpenGL Libraries
GL (Graphics Library): Library of 2-D, 3-D
drawing primitives and operations
• API for 3-D hardware acceleration
GLU (GL Utilities): Miscellaneous functions
dealing with camera set-up and higher-level
shape descriptions
GLUT (GL Utility Toolkit): Window-system
independent toolkit with numerous utility
functions, mostly dealing with user interface
Software Organization
application program
OpenGL Motif
widget or similar GLUT
GLX, AGL
or WGL GLU
X, Win32, Mac O/S GL
software and/or hardware
OpenGL function format
function name
dimensions
glVertex3f(x,y,z)
x,y,z are floats
belongs to GL library
glVertex3fv(p)
p is a pointer to an array
simple.c
#include <GL/glut.h>
void mydisplay(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
int main(int argc, char** argv){
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
}
Event Loop
Note that the program defines a display
callback function named mydisplay
• Every glut program must have a display
callback
• The display callback is executed whenever
OpenGL decides the display must be
refreshed, for example when the window is
opened
• The main function ends with the program
entering an event loop
Default parameters
simple.c is too simple
Makes heavy use of state variable
default values for
• Viewing
• Colors
• Window parameters
Transformations in OpenGl
Modeling transformation
• Refer to the transformation of models (i.e., the
scenes, or objects)
Viewing transformation
• Refer to the transformation on the camera
Projection transformation
• Refer to the transformation from scene to
image
Model/View Transformations
Model-view transformations are usually
visualized as a single entity
• Before applying modeling or viewing
transformations, need to set
glMatrixMode(GL_MODELVIEW)
• Modeling transforms the object
• Translation: glTranslate(x,y,z)
• Scale: glScale(sx,sy,sz)
• Rotation: glRotate(theta, x,y,z)
Projection Transformation
Transformation of the 3D scene into the
2D rendered image plane
• Before applying projection transformations,
need to set glMatrixMode(GL_PROJECTION)
• Orthographic projection
• glOrtho(left, right, bottom, top, near, far)
• Perspective projection
• glFrustum (left, right, bottom, top, near, far)
Program Structure
Most OpenGL programs have the following
structure
• main():
• defines the callback functions
• opens one or more windows with the required properties
• enters event loop (last executable statement)
• init(): sets the state variables
• Viewing
• Attributes
• callbacks
• Display function
• Input and window functions
simple.c revisited
#include <GL/glut.h> includes gl.h
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("simple"); define window properties
glutDisplayFunc(mydisplay);
init(); display callback
glutMainLoop(); set OpenGL state
}
enter event loop
GLUT functions
glutInit allows application to get command line
arguments and initializes system
gluInitDisplayMode requests properties for the
window (the rendering context)
• RGB color
• Single buffering
glutWindowSize in pixels
glutWindowPosition from top-left corner of display
glutCreateWindow create window with title “simple”
glutDisplayFunc display callback
glutMainLoop enter infinite event loop
Window Initialization
black clear color
void init() opaque window
{
glClearColor (0.0, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0); fill/draw with white
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
}
viewing volume
Display callback function
void mydisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
Callbacks
Programming interface for event-driven
input
Define a callback function for each type
of event the graphics system recognizes
This user-supplied function is executed
when the event occurs
mouse callback function
• GLUT example: glutMouseFunc(mymouse)
GLUT event loop
Last line in main.c for a program using GLUT is the
infinite event loop
glutMainLoop();
In each pass through the event loop, GLUT
• looks at the events in the queue
• for each event in the queue, GLUT executes the
appropriate callback function if one is defined
• if no callback is defined for the event, the event is ignored
In main.c
• glutDisplayFunc(mydisplay) identifies the function to
be executed
• Every GLUT program must have a display callback
Post redisplays
Many events may invoke the display callback
function
• Can lead to multiple executions of the display callback on a
single pass through the event loop
We can avoid this problem by instead using
glutPostRedisplay();
which sets a flag.
GLUT checks to see if the flag is set at the end of the
event loop
• If set then the display callback function is executed
Using the idle callback
The idle callback is executed whenever there are no events in the event queue
• glutIdleFunc(myidle)
• Useful for animations
void myidle() {
/* change something */
t += dt
glutPostRedisplay();
}
Void mydisplay() {
glClear();
/* draw something that depends on t */
glutSwapBuffers();
}
Using globals
The form of all GLUT callbacks is fixed
• void mydisplay()
• void mymouse(GLint button, GLint state, GLint
x, GLint y)
Must use globals to pass information to callbacks
float t; /*global */
void mydisplay()
{
/* draw something that depends on t
}
Assignment policy
How to submit
What to submit
On late submission
How to submit
Submit as a tar/zip file
• Unix:
> tar -cf username_projectNum_(440|640).tar
projectDir
> gzip username_projectNum_(440|640).tar
• Windows:
• Use a zip utility
Naming convention
• username_projectNum_(440|640).(tar.gz|zip)
Submit the tar/zip file to [email protected]
What to submit
Must contain
• Readme
• Source codes
• Output figures (if any)
Must NOT contain
• obj intermediate files
• obj data files
What to submit: Readme
% My name
% My email: [email protected]
% Project Num
% Part 1: description of this project
This project is to apply xxx algorithm to plot xxx, …
% Part 2: what I did and what I didn't do
I completed all/most/some functionalities required in this project.
The system is robust and the rendering is fairly efficient, …
I didn't do …. The reason is ….
% Part 3: What files contained, what’s the function of each file.
% Part 4: How to compile and how to run
The project is developed in windows system and tested in stimpy (strauss) unix
system
OpenGL: Setup in Windows
Go to the GLUT webpage
• www.xmission.com/~nate/glut.html
Follow the instructions in
• http://www.lighthouse3d.com/opengl/glut/
When creating the Visual C/C++
project, use the console based setup
Office Hours
Tuesday 7:00 – 9:00 pm
McKinly 051
Email –
[email protected]