Introduction To OpenGL
Introduction To OpenGL
Introduction To OpenGL
application program
OpenGL Motif
widget or similar GLUT
GLX, AGL
or WGL GLU
glVertex3f(x,y,z)
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);
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 xiaolin@cis.udel.edu
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: myemail@udel.edu
% Project Num