Open gl

samaram20 4,100 views 40 slides Jan 09, 2013
Slide 1
Slide 1 of 40
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40

About This Presentation

Open gl


Slide Content

Introduction to
OpenGL Programming

What is OpenGL
OpenGL is a software API to graphics hardware.
designed as a streamlined, hardware-independent
interface to be implemented on many different hardware
platforms
Intuitive, procedural interface with c binding
No windowing commands !
No high-level commands for describing models of three-
dimensional objects
The OpenGL Utility Library (GLU) provides many of the
modeling features, such as quadric surfaces and NURBS
curves and surfaces

SGI and GL
Silicon Graphics (SGI) revolutionized the
graphics workstation by implementing the
pipeline in hardware (1982)
To access the system, application
programmers used a library called GL
With GL, it was relatively simple to program
three dimensional interactive applications

OpenGL
The success of GL lead to OpenGL (1992), a
platform-independent API that was
Easy to use
Close enough to the hardware to get excellent
performance
Focus on rendering
Omitted windowing and input to avoid window
system dependencies

OpenGL Evolution
Controlled by an Architectural Review Board
(ARB)
Members include SGI, Microsoft, Nvidia, HP,
3DLabs, IBM,…….
Relatively stable (present version 2.0)
Evolution reflects new hardware capabilities
3D texture mapping and texture objects
Vertex and fragment programs
Allows for platform specific features through
extensions

OpenGL Libraries
OpenGL core library
OpenGL32 on Windows
GL on most unix/linux systems (libGL.a)
OpenGL Utility Library (GLU)
Provides functionality in OpenGL core but avoids
having to rewrite code
Links with window system
GLX for X window systems, WGL for Windows
Cross-platform GUI libraries: GLUT, SDL, FLTK, QT,

Windowing with OpenGL
OpenGL is independent of any specific
window system
OpenGL can be used with different window
systems
X windows (GLX)
MFC
…
GLUT provide a portable API for creating
window and interacting with I/O devices

GLUT
OpenGL Utility Toolkit (GLUT)
Provides functionality common to all window systems
Open a window
Get input from mouse and keyboard
Menus
Event-driven
Code is portable but GLUT lacks the functionality of a
good toolkit for a specific platform
No slide bars, buttons, …

Software Organization
GLUT
GLU
OpenGL
GLX, AGL
or WGL
X, Win32, Mac O/S
software and/or hardware
application program
OpenGL Motif
widget or similar

OpenGL Architecture
Immediate Mode
Display
List
Polynomial
Evaluator
Per Vertex
Operations &
Primitive
Assembly
Rasterization
Per Fragment
Operations
Texture
Memory
CPU
Pixel
Operations
Frame
Buffer
geometry
pipeline

OpenGL as a state machine
GL State Variables- can be set and queried by OpenGL. Remains
unchanged until the next change.
Projection and viewing matrix
Color and material properties
Lights and shading
Line and polygon drawing modes
…
OpenGL functions are of two types
Primitive generating
Can cause output if primitive is visible
How vertices are processed and appearance of primitive are controlled by the
state
State changing
Transformation functions
Attribute functions

OpenGL Syntax
Functions have prefix gl and initial capital letters for each word

glClearColor(), glEnable(), glPushMatrix() …
glu for GLU functions

gluLookAt(), gluPerspective() …
Constants begin with GL_, use all capital letters
GL_COLOR_BUFFER_BIT, GL_PROJECTION, GL_MODELVIEW …
Extra letters in some commands indicate the number and type of
variables

glColor3f(), glVertex3f() …
OpenGL data types

GLfloat, GLdouble, GLint, GLenum, …
Underlying storage mode is the same
Easy to create overloaded functions in C++ but issue is efficiency

OpenGL function format
glVertex3f(x,y,z)
belongs to GL library
function name
x,y,z are floats
glVertex3fv(p)
p is a pointer to an array
dimensions

OpenGL #defines
Most constants are defined in the include files
gl.h, glu.h and glut.h
Note #include <GL/glut.h> should
automatically include the others
Examples
glBegin(GL_POLYGON)
glClear(GL_COLOR_BUFFER_BIT)
include files also define OpenGL data types:
GLfloat, GLdouble,….

GLUT
Developed by Mark Kilgard
Hides the complexities of differing window
system APIs
Default user interface for class projects
Glut routines have prefix glut
glutCreateWindow() …
Has very limited GUI interface
Glui is the C++ extension of glut

Glut Routines
Initialization: glutInit() processes (and removes) command-line
arguments that may be of interest to glut and the window system and
does general initialization of Glut and OpenGL
Must be called before any other glut routines
Display Mode: The next procedure, glutInitDisplayMode(),
performs initializations informing OpenGL how to set up the frame
buffer.
Display Mode Meaning
GLUT_RGB Use RGB colors
GLUT_RGBA Use RGB plus alpha (for transparency)
GLUT_INDEX Use indexed colors (not recommended)
GLUT_DOUBLE Use double buffering (recommended)
GLUT_SINGLE Use single buffering (not recommended)
GLUT_DEPTH Use depth-buffer (for hidden surface removal.)

Glut Routines
Window Setup
glutInitWindowSize(int width, int height)
glutInitWindowPosition(int x, int y)
glutCreateWindow(char* title)

A Simple Program
Generate a square on a solid background

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){
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
init();
glutMainLoop();
}

Closer Look at the main()
#include <GL/glut.h>
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);

init();

glutMainLoop();
}
includes gl.h
define window properties
set OpenGL state
enter event loop
display callback

init.c
void init()
{
glClearColor (0.0, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
}
black clear color
opaque window
fill/draw with white
viewing volume

Event Handling
Virtually all interactive graphics programs are even
driven
GLUT uses callbacks to handle events
Windows system invokes a particular procedure when an
event of particular type occurs.
MOST IMPORTANT: display event
Signaled when window first displays and whenever portions
of the window reveals from blocking window
glutDisplayFunc(void (* func)(void)) registers
the display callback function
Running the program: glutMainLoop()
Main event loop. Never exit()

More Callbacks
glutReshapeFunc(void (* func)(int w, int h)) indicates
what action should be taken when the window is resized.
glutKeyboardFunc(void (*func)(unsigned char key, int
x, int y)) and glutMouseFunc(void (*func)(int button,
int state, int x, int y)) allow you to link a keyboard key or a
mouse button with a routine that's invoked when the key or mouse
button is pressed or released.
glutMotionFunc(void (*func)(int x, int y)) registers a
routine to call back when the mouse is moved while a mouse button is
also pressed.
glutIdleFunc(void (*func)(void)) registers a function that's to
be executed if no other events are pending - for example, when the
event loop would otherwise be idle

Compilation on Windows
See class web site on how to set up a project
with OpenGL
Visual C++
Get glut.h, glut32.lib and glut32.dll from web
Create a console application
Add opengl32.lib, glut32.lib, glut32.lib to project
settings (under link tab)

Simple Animation
Animation
Redraw + swap buffers
What looks like if using single buffer
Example program
More on the glut documentation
Chapter 2 of textbook
OpenGL redbook
Links in the class resources page

OpenGL Drawing
We have learned how to create a window
Steps in the display function
Clear the window
Set drawing attributes
Send drawing commands
Swap the buffers
OpenGL coordinate system has different origin from
the window system
Uses lower left corner instead of upper left corner as origin

Clear the Window
glClear(GL_COLOR_BUFFER_BIT)
clears the frame buffer by overwriting it with the
background color.
Background color is a state set by
glClearColor(GLfloat r, GLfloat g,
GLfloat b, GLfloat a) in the init().

Drawing Attributes: Color

glColor3f(GLfloat r, GLfloat g, GLfloat b) sets the
drawing color
glColor3d(), glColor3ui() can also be used
Remember OpenGL is a state machine
Once set, the attribute applies to all subsequent defined
objects until it is set to some other value
glColor3fv() takes a flat array as input
There are more drawing attributes than color
Point size: glPointSize()
Line width: glLinewidth()
Dash or dotted line: glLineStipple()
Polygon pattern: glPolygonStipple()
…

Drawing Commands
Simple Objects glRectf()
Complex Objects
Use construct
glBegin(mode) and
glEnd() and a list of
vertices in between
glBegin(mode)
glVertex(v0);
glVertex(v1);
...
glEnd();
Some other commands can
also be used between
glBegin() and glEnd(), e.g.
glColor3f().
Example

Projection and Viewport

Orthographic projection
Orthographic View
glOrtho(left,
right, bottom,
top, front, back)
Specifies the
coordinates of 3D
region to be projected
into the image space.
Any drawing outside the
region will be
automatically clipped
away.
z=0

Viewports
Do not have use the entire window for the
image: glViewport(x,y,w,h)
Values in pixels (screen coordinates)

Window to Viewport mapping
Aspect Ratio: Height/Width
If the aspect ratio of the window
Is different from that of the
viewport, the picture will be
distorted.

Sierpinski Gasket (2D)
Start with a triangle
Connect bisectors of sides and remove central
triangle
Repeat

Example
Five subdivisions

Gasket Program
#include <GL/glut.h>
/* initial triangle */
GLfloat v[3][2]={{-1.0, -0.58},
{1.0, -0.58}, {0.0, 1.15}};
int n; /* number of recursive steps */
void triangle( GLfloat *a, G Lfloat *b, GLfloat *c)
/* display one triangle */
{
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
}

Triangle Subdivision
void divide_triangle(GLfloat *a, GLfloat *b, G Lfloat *c, int
m)
{
/* triangle subdivision using vertex numbers */
point2 v0, v1, v2;
int j;
if(m>0)
{
for(j=0; j<2; j++) v0[j]=(a[j]+b[j])/2;
for(j=0; j<2; j++) v1[j]=(a[j]+c[j])/2;
for(j=0; j<2; j++) v2[j]=(b[j]+c[j])/2;
divide_triangle(a, v0, v1, m-1);
divide_triangle(c, v1, v2, m-1);
divide_triangle(b, v2, v0, m-1);
}
else(triangle(a,b,c));
/* draw triangle at end of recursion */
}

Gasket Display Functions
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
divide_triangle(v[0], v[1], v[2], n);
glEnd();
glFlush();
}
•By having the glBegin and glEnd in the display callback rather
than in the function triangle and using GL_TRIANGLES rather
than GL_POLYGON in glBegin, we call glBegin and glEnd
only once for the entire gasket rather than once for each triangle

Example: 3D Gasket
after 5 iterations

Tetrahedron Code
void tetrahedron( int m)
{
glColor3f(1.0,0.0,0.0);
divide_triangle(v[0], v[1], v[2], m);
glColor3f(0.0,1.0,0.0);
divide_triangle(v[3], v[2], v[1], m);
glColor3f(0.0,0.0,1.0);
divide_triangle(v[0], v[3], v[1], m);
glColor3f(0.0,0.0,0.0);
divide_triangle(v[0], v[2], v[3], m);
}