Opengl Intrdouction
Opengl Intrdouction
Introduction to OpenGL
Outline
• What is OpenGL
• OpenGL Rendering Pipeline
• OpenGL Utility Toolkits
• OpenGL Coding Framework
• OpenGL API
Graphics System
Function
calls Output
User
User Graphics
Graphics I/O
I/O
Program
Program System
System Device
Device
Data Input
Graphics API
What is OpenGL
• OpenGl stands for (Open Graphics
Library)
• IS A software interface to graphics hardware
• A 3D graphics rendering API (>120 functions)
• Hardware independent
• Very fast (a standard to be accelerated)
• Portable
http://www.opengl.org
A History of OpenGL
• Was SGI’s Iris GL – “Open”GL
• “Open” standard allowing for wide range
hardware platforms
• OpenGL v1.0 (1992)
• OpenGL v1.1 (1995)
• OpenGL v1.4 (latest)
• Governed by OpenGL Architecture Review
Board (ARB)
Rendering
Rendering Frame
Buffer
Image Primitives
+ =
OpenGL Architecture
OpenGL is Not a Language
It is a Graphics Rendering API
• Link GL library
– Link opengl32.lib (PC), or -lgl (UNIX)
• Link GLU library
– Link glu32.lib (PC), or -lglu (UNIX)
• Link GLUT library
– Link glut32.lib (PC), or -lglut (UNIX)
OpenGL Data Types
To make it easier to convert OpenGL
code from one platform to another,
OpenGL defines its own data types
that map to normal C data types
glColor3f(…)
gl library Root command, # of arguments, type of arguments
• Callback Function
Routine to call when something happens
- window resize, redraw, user input, etc
……
}
Rendering Callback
It’s here that does all of your OpenGL rendering
void display( void )
{
typedef GLfloat point2[2];
point2 vertices[3]={{0.0, 0.0}, {250.0, 500.0}, {500.0, 0.0}};
int i, j, k; int rand();
glClear(GL_COLOR_BUFFER_BIT);
for( k=0; k<5000; k++)
……
}
Window Resize Callback
It’s called when the window is resized or moved
• glEnd (void)
marks the end of a vertex-data list
• glVertex*(…)
specifies vertex for describing a geometric object
Specifying Geometric Primitives
glBegin( type );
glVertex*(…);
……
glVertex*(…);
glEnd();
• How to draw…
– Attributes
• colors, lighting, shading, texturing, etc.
Attributes
• An attribute is any property that determines
how a geometric primitives is to be rendered
Red
Green
Blue
How Many Colors?
For example:
4-bit color
24 = 16 colors
8-bit color
28 = 256 colors
24-bit color
24
How Much Memory?
Buffer size = width * height *color depth
For example:
If width = 640, height = 480, color depth = 24
bits Buffer size = 640 * 480 * 24 = 921,600
bytes
If width = 640, height = 480, color depth = 32
bits Buffer size = 640 * 480 * 32 = 1,228,800
bytes
Alpha Component
Alpha value
A value indicating the pixels opacity
Zero usually represents totally transparent and the
maximum value represents completely opaque
Alpha buffer
Hold the alpha value for every pixel
Alpha values are commonly represented in 8 bits, in
which case transparent to opaque ranges from 0 to 255
RGB Color Commands
• glColor*(…)
specifies vertex colors
• glClearColor(r, g, b, a)
sets current color for cleaning color buffer
• glutInitDisplayMode(mode)
specify either an RGBA window (GLUT_RGBA
), or a color indexed window (GLUT_INDEX )
Example
glutInitDisplayMode (GLUT_RGBA);
glClearColor(1.0, 1.0, 1.0, 1.0);
void drawLine (GLfloat *color)
{
glColor3fv ( color );
glBegin(GL_LINE);
glVertex2f ( 0.0,
0.0 );
glVertex2f ( 1.0, 0.0 );
glEnd();
Indexed Color
• Historically, color-index mode was
important because it required less
memory
• Use Color-map (lookup table)
• With color-index mode, each pixel with
same index stored in its bit-planes
shares the same color-map location
Color Lookup Table
Index Red Green Blue
0 0 0 0
1 120 123 187
…
253 … … …
254
255
8 bits 8 bits 8 bits
RGBA vs. Color Index Mode
Color index model
Index R G B
0 0 0 0
1 120 123 187
2
… … …
…
254
255
RGBA model
Color Index Commands
• glIndex*(…)
specifies vertex colors
• glClearIndex(Glfloat index)
sets current color for cleaning color buffer.
Red
Blue
Red
Blue
World Transformation
World Coordinates World -> Viewport
Viewport Clipping
Viewport Coordinates Screen Coordinates
Rasterization
Scan Converting Triangles
Camera Analogy
The graphics transformation process is
analogous to taking a photograph with a
camera
- Position camera
- Place objects
- Adjust camera
- Produce photograph
Transformations and Camera Analogy
• Viewing transformation
– Positioning and aiming camera in the world.
• Modeling transformation
– Positioning and moving the model.
• Projection transformation
– Adjusting the lens of the camera.
• Viewport transformation
– Enlarging or reducing the physical photograph.
OpenGL Transformation Pipeline
Transformations in OpenGL
• Transformations are specified by matrix
operations. Desired transformation can
be obtained by a sequence of simple
transformations that can be concatenated
together.
• Transformation matrix is usually represented
by 4x4 matrix (homogeneous coordinates).
• Provides matrix stacks for each type
of supported matrix to store matrices.
Programming Transformations
• In OpenGL, the transformation matrices are
part of the state, they must be defined prior to
any vertices to which they are to apply.
• In modeling, we often have objects specified in
their own coordinate systems and must use
transformations to bring the objects into the
scene.
• OpenGL provides matrix stacks for each type of
supported matrix (model-view, projection,
texture) to store matrices.
Steps in Programming
• Define matrices:
– Viewing/modeling, projection, viewport …
• Manage the matrices
– Including matrix stack
• Composite transformations
Transformation Matrix Operation
• Current Transformation Matrix (CTM)
– The matrix that is applied to any vertex that is
defined subsequent to its setting.
• If change the CTM, we change the state
of the system.
• CTM is a 4 x 4 matrix that can be altered
by a set of functions.
Current Transformation Matrix
The CTM can be set/reset/modify (by
post- multiplication) by a matrix
Ex:
C <= M // set to matrix M
C <= CT // post-multiply by T
C <= CS // post-multiply by S
C <= CR // post-multiply by R
Current Transformation Matrix
• Each transformation actually creates a new
matrix that multiplies the CTM; the result,
which becomes the new CTM.
• CTM contains the cumulative product
of multiplying transformation matrices.
Ex:
If C <= M; C <= CT; C <= CR; C
<= CS
Then C=MTRS
Viewing-Modeling Transformation
• If given an object, and I want to render it from a
viewpoint, what information do I have to have?
– Viewing position
– Which way I am looking at
– Which way is “up”
…..
Viewing Position
y
y R, T
x
x
• Translation
• Rotation
z Camera
Where I am and Looking at
y y
Loot at
View-up vector
(atx, aty, atz)
(upx, upy, upz)
x x
Model
z z
Eyepoint
(eyex, eyey, eyez)
Define Coordinate System
+Y
In the default
position, the
camera is at the
origin, looking
down the +X
negative z-axis
+Z
If we use OpenGL
• Look-At Function
gluLookAt (eyex, eyey, eyez, atx, aty, atz, upx, upy, upz )
Define a viewing matrix and multiplies it to the
right of the current matrix.
Ways to Specify Transformations
• In OpenGL, we usually have two styles
of specifying transformations:
– Specify matrices ( glLoadMatrix,
glMultMatrix )
– Specify operations ( glRotate, glTranslate )
Specifying Matrix
• Specify current matrix mode
• Modify current matrix
• Load current matrix
• Multiple current matrix
Specifying Matrix (1)
• Specify current matrix mode
glMatrixMode (mode)
Specified what transformation matrix is modified.
mode:
GL_MODELVIEW
GL_PROJECTION
Specifying Matrix (2)
• Modify current matrix
glLoadMatrix{fd} ( Type *m )
Set the 16 values of current matrix to those
specified by m.
glLoadIdentity ( void )
Set the currently modifiable matrix to the 4x4
identity matrix.
Specifying Matrix (4)
• Modify current matrix
glMultMatrix{fd} ( Type *m )
Multiple the matrix specified by the 16 values
pointed by m by the current matrix, and stores the
result as current matrix.
1 0 0 dx
Translation: 0 1 0 d y
T d, d , d
x y z
0 0 1 dz
0 0 0 1
sx 0 0 0
0
0
Scale: sy 0
S s , s , s 0
x y z
0 0
0 sz 1
0
0
Recall
1 0 0 0
0
Rx (
0 cos
Rotation Rx ( ) )
0 sin sin 0
1
0
0cos 0
Rotation Ry ( ) Ry( )
0 sin 0 0 0
0
1
cos
cos
0 sin0
sin 0
1 cos
Rotation Rz )
sin 0
( Rz ( ) 0
0 0
0 00 1
0
Specifying Operations (1)
• Translation
Question:
Rotate a object for a 45.0-degree about the line
through the origin and the point (1.0, 2.0, 3.0) with
a fixed point of (4.0, 5.0, 6.0).
Rotation About an Arbitrary Point
glMatrixMode (GL_MODEVIEW);
glLoadIdentity ();
glTranslatef (4.0, 5.0, 6.0);
glRotatef (45.0, 1.0, 2.0, 3.0);
glTranslatef (-40.0, -5.0, -6.0);
Order of Transformations
• The transformation matrices appear in reverse
order to that in which the transformations are
applied.
• In OpenGL, the transformation specified
most recently is the one applied first.
Order of Transformations
• In each step:
C <= I
C <= CT(4.0, 5.0, 6.0)
C <= CR(45, 1.0, 2.0, 3.0)
C < = CT(-4.0, -5.0, -6.0)
• Finally
C = T(4.0, 5.0, 6.0) CR(45, 1.0, 2.0, 3.0) CT(-4.0, -5.0, -6.0)
Write it
Read it
Matrix Multiplication is Not Commutative
glPushMatrix ( void )
Pushes all matrices in the current stack down one
level. The topmost matrix is copied, so its contents
are duplicated in both the top and second-from-the
top matrix.
glPopMatrix ( void )
Pops the top matrix off the stack, destroying the
contents of the popped matrix. What was the
second-from-the top matrix becomes the top
matrix.
(50, 50)
Positive
(0, 0) X
Y Positive
Clipped out
top
left
right
Bottom
Near-plane Far-plane
glMatrixMode(GL_PROJECTION)
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW)
;
Perspective Projection Volume
y
aspect ratio = w/h
w h
z
fovy
x Far-plane: zNear
Near-plane: zNear
Viewing volume
Perspective Projection Commands
Viewpoint
Hidden-Surface Removal
glEnable(GL_DEPTH_TEST)
glDisable(GL_DEPTH_TEST)
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RBG|GLUT_DEPTH);
You can also clear the depth buffer (as we did for color buffer)
glClear(GL_DEPTH_BUFFER_BIT)
Clear z (depth) buffer
Viewing a 3D world
View up
ViewRight
Aspect Ratio ViewUp
View right
Viewpoint
• Viewpoint
– The region within the window that will be
used for drawing the clipping area
– By default, it is set to the entire rectangle of
the window that is opened
– Measured in the window coordinates,
which reflect the position of pixels on the
screen related to the lower-left corner of
the window
Viewpoint Transformation
h
w h
A viewpoint is A viewpoint is
defined as half the defined as the same
size of the window size as the window
Aspect Ratio
• The Aspect Ratio of a rectangle is the
ratio of the rectangle’s width to its height:
e.g. Aspect Ratio = width/height
Ispecular
f (dl ) [ kd Ll L N k s L l R V
lights1
I light k a La
ns ]
d s
l
0
Shading
• Flat Shading
– Calculate one lighting calculation (pick a vertex)
per triangle
– Color the entire triangle the same color
• Gouraud Shading
– Calculate three lighting calculations (the vertices)
per triangle
– Linearly interpolate the colors as you scan
convert
• Phong Shading
– While do scan convert, linearly interpolate the
normals.
– With the interpolated normal at each pixel,
calculate the lighting at each pixel
Lighting in OpenGL
• OpenGL supports the four types of light
sources.
• OpenGL allows at least eight light
sources set in a program.
• We must specify and enable individually
(as exactly required by the Phong
model)
Steps of Specifying Lighting
• Define normal vectors for each vertex of
every object.
• Create, position, and enable one or more
light sources.
• Select a lighting model.
• Define material properties for the objects in
the scene.
• Don’t forget to Enable/disable lighting.
Creating Light Sources
• Define light properties
– color, position, and direction
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
Creating Light Sources
• Position
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
Creating Light Sources
• Controlling a Light’s Position and Direction
• Two-sided Lighting
glLightModelfi (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
Defining Material Properties
• OpenGL supports the setting of material properties
of objects in the scene
– Ambient
– Diffuse
– Specular
– Shininess
glBegin(GL_QUAN) {
glTexCoord2f (0, 0); glVertex2f (0, 0, 5);
glTexCoord2f (1, 0); glVertex2f (10, 0, 5);
glTexCoord2f (1, 1); glVertex2f (10, 10, 5);
glTexCoord2f (0, 1); glVertex2f (0, 10, 5);
}
Remember to Enable Texture
glEnable (GL_TEXTURE_2D)
glDisable (GL_TEXTURE_2D)
Object in environment
Intermediate surface
Projected object
Environmental Mapping
• Then, we need to map the texture values
on the intermediate surface to the desired
surface.
n
n
n
Now It’s Your Turn
• Find a good reference/book
• Play with an example
• Make your own code