OpenGL and GLUT Basics
Outline
• OpenGL & GLUT basics
– Grpahics Pipeline
– 2-D drawing
– User interaction
2
Graphics Pipeline
3
OpenGL – What is It?
• 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
4
Event-driven GLUT program structure
1. Configure and open window
2. Initialize OpenGL state, program variables
3. Register callback functions
• Display (where rendering occurs)
• Resize
• User input: keyboard, mouse clicks,
motion, etc.
4. Enter event processing loop
5
Call Back Function
• A callback function is a function passed
into another function as an argument,
which is then invoked inside the
outer function to complete some kind of
routine or action.
• In C, a callback function is a function that
is called through a function pointer
6
Simple OpenGL program
#include <stdio.h>
#include <GL/glut.h>
void main(int argc, char** argv)
{
glutInit(&argc, argv); // configure and open window
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(100, 100);
glutCreateWindow(“hello”);
init(); // set OpenGL states, variables
glutDisplayFunc(display); // register callback
routines
glutKeyboardFunc(keyboard);
glutMainLoop(); // enter event-driven loop
}
7
Configure and open window
• glutInit: Pass command-line flags on to GLUT
• glutInitDisplayMode: OR together bit masks to
set modes on pixel type
• glutInitWindowSize, glutCreateWindow: Set
drawing window attributes, then make it
8
Initialize OpenGL state
• init(): Set OpenGL state, program variables
– Use GL types/typedefs GLfloat, GLint, GL_TRUE,
GL_FALSE, etc. for
cross-platform compatibility
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, right, 0, top);
}
sets “units” of subsequent draw commands
9
OpenGL screen coordinates
• Bottom left corner is origin
• gluOrtho2D() sets the units of the screen
coordinate system
•gluOrtho2D(0, w, 0, h) means the
coordinates are in units of pixels
•gluOrtho2D(0, 1, 0, 1) means the
coordinates are in units of “fractions of window
size” (regardless of actual window size)
• glOrtho2D(L,R,B,T);
10
• glutInitWindowSize sets the size of the
window.
• Use glViewport to specify the window
region in window coordinates to be drawn
to.
• gluOrtho2D specifies the coordinates to be
used with the viewport which defaults to
the window size. 11
• So, if you want create a 400 x 400 window
and only want to draw to the rectangle(50,
50, 350, 350) within the window, then use
glViewport(50, 50, 350, 350). You would
then use gluOrtho2D to set your GL
coordinates wthin the viewport. So, if you
used gluOrtho2D(-1.0, 1.0, -1.0, 1.0) then
visible GL coordinates would range from -
1.0 to 1.0 in the x direction, from -1.0 to
1.0 in the y direction.
12
Example: Specifying the center of a
square
13
Example: Specifying the center of a
square
14
A complete OpenGL program
#include <stdio.h>
#include <GL/glut.h>
void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (640, 480);
glutInitWindowPosition (100, 150);
glutCreateWindow ("my first attempt");
glutDisplayFunc(myDisplay);
myInit ();
glutMainLoop();
}
15
A complete OpenGL program (cont.)
void myDisplay(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 0.0, 0.0);
glPointSize(4.0);
glBegin(GL_POINTS);
glVertex2i(100, 50);
glVertex2i(100, 130);
glVertex2i(150, 130);
glEnd();
glFlush ();
}
16
A complete OpenGL program (cont.)
void myInit (void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(4.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
17
Rendering Steps
In function registered with glutDisplayFunc():
1. Clear window
• glClear(GL_COLOR_BUFFER_BIT);
2. Draw shapes
• Set colors, patterns, point/line sizes
• Specify type of geometric primitive(s) and list
vertices
3. Swap buffers if display mode is GLUT_DOUBLE
4. Force all operations to complete with glFlush()
18
Single- vs. double-buffering
• Single-buffering: Draw directly to screen
buffer
• Double-buffering: Draw to offscreen
buffer, then make that the screen buffer
when done
• For animation, double-buffering is better
because it eliminates flickering
19
OpenGL Geometric Primitives
20
Windows Config: glut
• Unzip glut-3.7.6-bin.zip and you will get
• 1. glut.h
• 2. glut32.dll
• 3. glut32.lib
21
Windows Config: glut
• Visual Studio 2010
• Windows (7/8)
• ====================
• On 32bit versions of windows:
– copy glut.h in include/GL folder to C:\Program Files\Microsoft
SDKs\Windows\v7.0A\Include\gl
– copy glut32.lib in lib folder to C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
– copy glut32.dll to C:\windows\system32
• On 64bit versions of windows:
– copy glut.h in include/GL folder to C:\Program Files(x86)\Microsoft
SDKs\Windows\v7.0A\Include\gl
– copy glut32.lib in lib folder to C:\Program Files(x86)\Microsoft SDKs\Windows\v7.0A\Lib
– copy glut32.dll to C:\windows\SysWOW64
22
Windows Config: glut
• Visual Studio 2012
• Windows (7/8)
• ====================
• On 32bit versions of windows:
– copy glut.h in include/GL folder to C:\Program Files\Microsoft Visual Studio
11.0\VC\include\gl
– copy glut32.lib in lib folder to C:\Program Files\Microsoft Visual Studio
11.0\VC\lib
– copy glut32.dll to C:\windows\system32
• On 64bit versions of windows:
– copy glut.h in include/GL folder to C:\Program Files (x86)\Microsoft Visual Studio
11.0\VC\include\gl
– copy glut32.lib in lib folder to C:\Program Files (x86)\Microsoft Visual Studio
11.0\VC\lib\amd64
– copy glut32.lib in lib folder to C:\Program Files (x86)\Microsoft Visual Studio
11.0\VC\lib
– copy glut32.dll to C:\windows\SysWOW64
23
Windows Config: glut
• CodeBlocks 16.01MinGw
[https://sourceforge.net/projects/codeblocks/files/Binaries/16.01/Windows/codeblocks
-16.01mingw-setup.exe/download]
• Windows (7/8/10)
• ====================
• On 32bit versions of windows:
– copy glut.h in include/GL folder to C:\Program
Files(x86)\CodeBlocks\MinGW\include\GL
– copy glut32.lib in lib folder to C:\Program Files (x86)\CodeBlocks\MinGW\lib
– copy glut32.dll to C:\windows\system32
• New Project-> Glut Project
• Select Glut Location
– C:\Program Files (x86)\CodeBlocks\MinGW
24
Windows Config: glut
• New Project-> Glut Project
• Select Glut Location
– C:\Program Files (x86)\CodeBlocks\MinGW
25