Title: CENG477 Introduction to Computer Graphics
1CENG477 Introduction to Computer Graphics
- Introduction to OpenGL, GLUT and GLUI
2What is OpenGL?
- A software interface to graphics hardware
- (Low Level) Graphics rendering API
- high-quality color images composed of geometric
and image primitives - window system independent
- operating system independent
3OpenGL/GLUT/GLU/GLUI
- OpenGL is the core library that is platform
independent. - GLUT is an auxiliary library that handles window
creation, OS system calls (mouse buttons,
movement, keyboard, etc), callbacks. - GLU is an auxiliary library that handles a
variety of graphics accessory functions such as
setting up matrices for specific viewing
orientations and projections, etc. - GLUI is a GUI manager for GLUT.
4OpenGL Basics
- Rendering
- Converting geometric/mathematical object
descriptions into frame buffer values - OpenGL can render
- Geometric primitives
- Bitmaps and Images (Raster primitives)
Graphics Pipeline
5Graphics Pipeline
- OpenGL commands specify how each step is
performed - The graphics pipeline is modeled as a state
machine - Each pipeline step has parameters (attributes) to
be set
6OpenGL as a Renderer
- Geometric primitives
- points, lines and polygons
- Image Primitives
- images and bitmaps
- separate pipeline for images and geometry
- linked through texture mapping
- Rendering depends on state
- colors, materials, light sources, etc.
7Preliminaries
- Header Files
- include ltGL/gl.hgt
- include ltGL/glu.hgt
- include ltGL/glut.hgt
- include ltglui.hgt
8GLUT Basics
- Application Structure
- Configure and open window
- Initialize OpenGL state
- Register input callback functions
- render
- resize
- input keyboard, mouse, etc.
- Enter event processing loop
9Sample Program
include ltGL/glut.hgt include ltGL/gl.hgt void
main(int argc, char argv) int mode
GLUT_RGBGLUT_DOUBLE glutInitDisplayMode(
mode ) glutInitWindowSize( 500,500 )
glutCreateWindow( Simple ) init()
glutDisplayFunc( display )
glutKeyboardFunc( key ) glutMainLoop()
10Sample Program
include ltGL/glut.hgt include ltGL/gl.hgt void
main(int argc, char argv) int mode
GLUT_RGBGLUT_DOUBLE glutInitDisplayMode(
mode ) glutInitWindowSize( 500,500 )
glutCreateWindow( Simple ) init()
glutDisplayFunc( display )
glutKeyboardFunc( key ) glutMainLoop()
Specify the display Mode RGB or color Index,
single or double Buffer
11Sample Program
include ltGL/glut.hgt include ltGL/gl.hgt void
main(int argc, char argv) int mode
GLUT_RGBGLUT_DOUBLE glutInitDisplayMode(
mode ) glutInitWindowSize( 500,500 )
glutCreateWindow( Simple ) init()
glutDisplayFunc( display )
glutKeyboardFunc( key ) glutMainLoop()
Create a window Named simple with resolution
500 x 500
12Sample Program
include ltGL/glut.hgt include ltGL/gl.hgt void
main(int argc, char argv) int mode
GLUT_RGBGLUT_DOUBLE glutInitDisplayMode(
mode ) glutInitWindowSize( 500,500 )
glutCreateWindow( Simple ) init()
glutDisplayFunc( display )
glutKeyboardFunc( key ) glutMainLoop()
Your OpenGL initialization code (Optional)
13Sample Program
include ltGL/glut.hgt include ltGL/gl.hgt void
main(int argc, char argv) int mode
GLUT_RGBGLUT_DOUBLE glutInitDisplayMode(
mode ) glutInitWindowSize( 500,500 )
glutCreateWindow( Simple ) init()
glutDisplayFunc( display )
glutKeyboardFunc(key) glutMainLoop()
Register your call back functions
14glutMainLoop()
include ltGL/glut.hgt include ltGL/gl.hgt int
main(int argc, char argv) int mode
GLUT_RGBGLUT_DOUBLE glutInitDisplayMode(mod
e) glutInitWindowSize(500,500)
glutCreateWindow(Simple) init()
glutDisplayFunc(display) glutKeyboardFunc(ke
y) glutMainLoop()
The program goes into an infinite loop waiting
for events
15OpenGL Initialization
- Set up whatever state youre going to use
- void init( void )
-
- glViewport(0, 0, width, height)
- glMatrixMode(GL_PROJECTION)
- glLoadIdentity()
- glOrtho(-10, 10, -10, 10, -10, 20)
- glMatrixMode(GL_MODELVIEW)
- glLoadIdentity()
- /glEnable( GL_LIGHT0 )
- glEnable( GL_LIGHTING )
- glEnable( GL_DEPTH_TEST )/
-
16GLUT Callback functions
- Event-driven Programs that use windows
- Input/Output
- Wait until an event happens and then execute some
pre-defined functions according to the users
input - Events key press, mouse button press and
release, window resize, etc.
17GLUT Callback Functions
- Callback function Routine to call when an event
happens - Window resize or redraw
- User input (mouse, keyboard)
- Animation (render many frames)
- Register callbacks with GLUT
- glutDisplayFunc( my_display )
- glutIdleFunc( my_idle_func )
- glutKeyboardFunc( my_key_events )
- glutMouseFunc ( my_mouse )
18Event Queue
Keyboard
.
Event queue
Mouse
MainLoop()
Window
Keypress_callback() .
Mouse_callback() .
window_callback() .
19Rendering Callback
- Callback function where all our drawing is done
- glutDisplayFunc( my_display )
- void my_display (void )
-
- glClear( GL_COLOR_BUFFER_BIT )
- glBegin( GL_TRIANGLE )
- glVertex3fv( v0 )
- glVertex3fv( v1 )
- glVertex3fv( v2 )
- glEnd()
20Idle Callback
- Use for animation and continuous update
- glutIdleFunc( idle )
- void idle( void )
-
- t dt
- glutPostRedisplay()
-
21User Input Callbacks
- Process user input
- glutKeyboardFunc( my_key_events )
- void my_key_events (char key, int x, int y )
-
- switch ( key )
- case q case Q
- exit ( EXIT_SUCCESS)
- break
- case r case R
- rotate GL_TRUE
- break
-
22Mouse Callback
- Captures mouse press and release events
- glutMouseFunc( my_mouse )
- void myMouse(int button, int state, int x, int y)
-
- if (button GLUT_LEFT_BUTTON state
GLUT_DOWN) -
-
-
-
23Events in OpenGL
24OpenGL Geometric Primitives
- The geometry is specified by vertices.
- There are ten primitive types
25OpenGL Command Format
26Vertices and Primitives
- Primitives are specified using
- glBegin( primType )
-
- glEnd()
- primType determines how vertices are combined
- GLfloat red, green, blue
- Glfloat coords3
- glBegin( primType )
- for ( i 0 i lt nVerts i )
- glColor3f( red, green, blue )
- glVertex3fv( coords )
-
- glEnd()
27An Example
- void drawParallelogram( GLfloat color )
-
- glBegin( GL_QUADS )
- glColor3fv( color )
- glVertex2f( 0.0, 0.0 )
- glVertex2f( 1.0, 0.0 )
- glVertex2f( 1.5, 1.118 )
- glVertex2f( 0.5, 1.118 )
- glEnd()
-
28Vertices and Primitives
- Points, GL_POINTS
- individual points
29Vertices and Primitives
- Lines, GL_LINES
- pairs of vertices interpreted as individual line
segments
30Vertices and Primitives
- Line Strip, GL_LINE_STRIP
- series of connected line segments
31Vertices and Primitives
- Line Loop, GL_LINE_LOOP
- Line strip with a segment added between last and
first vertices
32Vertices and Primitives
- Polygon , GL_POLYGON
- boundary of a simple, convex polygon
33Vertices and Primitives
- Triangles , GL_TRIANGLES
- triples of vertices interpreted as triangles
34Vertices and Primitives
- Triangle Strip , GL_TRIANGLE_STRIP
- linked strip of triangles
v1
v0
v3
v2
v4
v5
v7
v6
35Vertices and Primitives
- Triangle Fan , GL_TRIANGLE_FAN
- linked fan of triangles
v2
v1
v3
v4
v0
v5
36Vertices and Primitives
- Quads , GL_QUADS
- quadruples of vertices interpreted as four-sided
polygons
37Vertices and Primitives
- Quad Strip , GL_QUAD_STRIP
- linked strip of quadrilaterals
v1
v0
v3
v2
v4
v5
v7
v6
38Vertices and Primitives
- Vertices may be specified in 2D, 3D, or 4D.
- 2D coordinates are promoted to 3D by assigning a
Z value of zero. - 4D homogeneous coordinates are reduced to 3D by
dividing x, y, and z by the w coordinate (if
non-zero).
39Vertices and Primitives
- Between glBegin/ glEnd, those opengl commands are
allowed - glVertex() set vertex coordinates
- glColor() set current color
- glIndex() set current color index
- glNormal() set normal vector coordinates
- glTexCoord() set texture coordinates
40Vertices and Primitives
- glMultiTexCoord() set texture coordinates for
multitexturing - glEdgeFlag() control drawing of edges
- glMaterial() set material properties
- glArrayElement() Extract array element data
- glCallList(), glCallLists() execute display list
41GLUI
- GLUI is a GLUT-based C user interface library
which provides controls such as - buttons,
- checkboxes,
- radio buttons,
- spinners, etc.
- It is window-system independent, relying on GLUT
to handle all system-dependent issues, such as
window and mouse management.
42GLUI Controls
43GLUI - Simple Programming Interface
- GLUI provides default values for many parameters
in the API and there are several ways to create a
control - GLUI glui
- ...
- glui-gtadd_checkbox("Click me") Adds a simple
checkbox with - the name "Click me"
- glui-gtadd_checkbox("Click me", state )
- The variable state will now be
-
automatically update to reflect the state of -
the checkbox (live variable). - glui-gtadd_checkbox( "Click me", state, 17,
callback_fn ) - Now we have a live variable, plus a callback
function - will be invoked (and passed the value '17')
whenever - the checkbox changes state.
44Usage for standalone GLUI windows
- Integrating GLUI with a new or existing GLUT
application is very - straightforward. The steps are
- Add the GLUI library to the link line (e.g.,
glui32.lib for Windows -lglui in
Linux). - Include the file "glui.h" in all sources that
will use the GLUI library. - Create your regular GLUT windows as usual. Make
sure to store the window id of your main graphics
window, so GLUI windows can later send it
redisplay events - int window_id glutCreateWindow( "Main gfx
window" ) - Register your GLUT callbacks as usual (except the
Idle callback, discussed below).
45Usage for standalone GLUI windows
- Register your GLUT idle callback (if any) with
GLUI_Master (a global object which is already
declared), to enable GLUI windows to take
advantage of idle events without interfering with
your application's idle events. If you do not
have an idle callback, pass in NULL. - GLUI_Master.set_glutIdleFunc( myGlutIdle )
- or
- GLUI_Master.set_glutIdleFunc( NULL )
- In your idle callback, explicitly set the current
GLUT window before rendering or posting a
redisplay event. Otherwise the redisplay may
accidently be sent to a GLUI window. - void myGlutIdle( void )
-
- glutSetWindow(main_window)
- glutPostRedisplay()
-
46Usage for standalone GLUI windows
- Create a new GLUI window using
- GLUI glui GLUI_Master.create_glui( "name",
flags, x, y ) - Note that flags, x, and y are optional
arguments. If they are not specified, default
values will be used. GLUI provides default values
for arguments whenever possible. - Add controls to the GLUI window. For example, we
can add a checkbox and a quit button with - glui-gtadd_checkbox( "Lighting", lighting )
- glui-gtadd_button( "Quit", QUIT_ID, callback_func
)
47Usage for standalone GLUI windows
- Let each GLUI window you've created know where
its main graphics window is - glui-gtset_main_gfx_window( window_id )
- Invoke the standard GLUT main event loop, just as
in any GLUT application - glutMainLoop()
- Refer GLUI Manual on the usage for GLUI
subwindows
48Whats Next
- Display Lists
- Viewing
- Lighting
- Texture Mapping
-
49References
- http//www.opengl.org/documentation/spec.html
- The OpenGL Programming Guide - The
Redbookhttp//www.opengl.org/documentation/red_bo
ok_1.0/ - http//www.cs.rit.edu/jdb/cg1/openGLIntro.pdf