Data Communication

Computer
Graphics
Lecture 34
OpenGL
Programming II
Taqdees A. Siddiqi
[email protected]
We will start with a
simple program; source
code is provided in
notes; here we will
discuss it to get a better
understanding of
OpenGL programming.
This program first sets
perspective projection
matrix and then renders
a triangle in the “idle”
function.
glMatrixMode
glMatrixMode
function
specifies which matrix is
the current matrix.
void glMatrixMode(
GLenum mode);
The matrix stack that is
the target for resulting
matrix operations. The
mode parameter can:
Value
GL_MODELVIEW
GL_PROJECTION
GL_TEXTURE
Meaning
Applies subsequent
matrix
Applies subsequent
matrix operations
to the projection
matrix stack.
Applies subsequent
matrix operations
to the texture
matrix stack.
glMatrixMode
function
sets the current matrix
mode.
The following function
retrieves
information
related to glMatrixMode:
Following are the error codes
generated and conditions.
Error code
GL_INVALID_EN
UM
GL_INVALID_OPE
RATION
Condition
mode was not an
accepted value
glMatrixMode was
called between a
call to glBegin and
the corresponding
call to glEnd
glLoadIdentity
void glLoadIdentity(void);
glLoadIdentity function
replaces
the
current
matrix with the identity
matrix. It is semantically
equivalent
to
calling
glLoadMatrix with the
identity matrix.
The following is the
error code and its
condition.
Error code
Condition
GL_INVALID_OPE glLoadIdentity was
RATION
called between a
call to glBegin and
the corresponding
call to glEnd.
glTranslated,
glTranslatef
glTranslated and glTranslatef
functions multiply the current
matrix by a translation matrix.
void glTranslated( GLdouble,
GLdouble y, GLdouble z);
void glTranslatef( GLfloat x,
GLfloat y, GLfloat z );
glTranslate
function
produces the translation
specified by (x, y, z). The
translation vector is used
to
compute
a
4x4
translation matrix:
The current matrix is
multiplied by translation
matrix, with the
replacing
the
matrix.
M•T
product
current
If the matrix mode is either
GL_MODELVIEW
or
GL_PROJECTION,
all
objects
drawn
after
glTranslate is called are
translated.
Use
glPushMatrix
and
glPopMatrix to save and
restore the untranslated
coordinate system.
The following is
error
code
and
condition.
Error code
the
its
Condition
GL_INVALID_O glTranslate was
PERATION
called between a
call to glBegin and
the corresponding
call to glEnd.
gluPerspective
The gluPerspective is the
function of gl utility library.
This function sets up a
perspective projection matrix.
void gluPerspective(
GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar);
The field of view angle, in
degrees, in the y-direction.
The
aspect
ratio
that
determines the field of
view in the x-direction. The
aspect ratio is the ratio of
x (width) to y (height).
The distance from the
viewer
to
the
near
clipping plane (always
positive).
The distance from the
viewer to the far clipping
plane (always positive).
The
gluPerspective
function
specifies
a
viewing frustum into the
world coordinate system.
In general, the aspect
ratio in gluPerspective
should match the aspect
ratio of the associated
viewport.
For
example,
aspect = 2.0 means the
viewer's angle of view is
twice as wide in x as it is
in y. If the viewport is
twice as wide as it is tall,
it displays the image
without distortion.
The matrix generated by
gluPerspective is multiplied
by the current matrix, just
as if glMultMatrix were
called.
To
load
the
perspective matrix onto the
current
matrix
stack
instead, precede the call to
gluPerspective with a call
to glLoadIdentity.
glRotated,
glRotatef
The glRotated and glRotatef
functions multiply the current
matrix by a rotation matrix.
void glRotated(
GLdouble angle,
GLdouble x, GLdouble y,
GLdouble z);
void glRotatef(
GLfloat angle, GLfloat x,
GLfloat y, GLfloat z);
The glRotate function
computes a matrix that
performs
a
counterclockwise
rotation
of
angle degrees about the
vector from the origin
through the point.
The current matrix is
multiplied by rotation
matrix, with the product
replacing
the
current
matrix.
M•R
The following is the error
code and its condition.
Error code
Condition
GL_INVALID_OP glRotate was called
ERATION
between a call to
glBegin and the
corresponding call
to glEnd.
glClearColor
The
glClearColor
function
specifies clear values for the
color buffers.
void glClearColor(
GLclampf red,
GLclampf green,
GLclampf blue,
GLclampf alpha);
The glClearColor function
specifies the red, green,
blue, and alpha values
used by glClear to clear
the color buffers. Values
specified by glClearColor
are clamped to the range
[0,1].
The following is the error
code generated and its
condition.
Error code
GL_INVALID_O
PERATION
Condition
glClearColor was
called between a
call to glBegin and
the corresponding
call to glEnd.
glColor
There are variety of color
functions some of them given
below, however complete list is
provided in the notes.
glColor3b, glColor3d, glColor3f,
glColor3i, glColor3s, glColor3ub,
glColor3ui, glColor3us,
glColor4b, glColor4d.
void glColor3b( GLbyte red,
GLbyte green, GLbyte blue);
void glColor3f( GLfloat red,
GLfloat green, GLfloat blue);
A new alpha value for the
current color. Included only
in
the
four-argument
glColor4 function.
OpenGL stores both a
current
single-valued
color index and a current
four-valued RGBA color.
The glColor function sets
a new four-valued RGBA
color.
There are two major
variants to glColor:
 glColor3
 glColor4
The glColor3b, glColor4b,
glColor3s,
glColor4s,
glColor3i,
and
glColor4i
functions take three or four
signed byte, short, or long
integers
as
arguments.
When you append v to the
name, the color functions
can take a pointer to an
array of such values.
Current color values stored
in floating-point format,
with unspecified mantissa
and exponent sizes.
Unsigned
integer
color
components are linearly
mapped to floating-point
values such that the largest
value maps to 1.0 and zero
maps to 0.0
Signed
integer
color
components are linearly
mapped to floating-point
values such that the
most positive value maps
to 1.0 and the most
negative value maps to
0.0.
Neither
floating-point
nor signed integer values
are clamped to the range
[0,1] before updating
the current color.
However,
color
components are clamped
to this range before
interpolation.
You can update the
current color at any time.
In particular, you can
call glColor between a
call to glBegin and the
corresponding
call
to
glEnd.
glClear
The glClear function clears
buffers to preset values.
void glClear(GLbitfield mask);
Bitwise OR operators of
masks that indicate the
buffers to be cleared. The
four masks are as follows.
Mask
Buffer to be Cleared
GL_COLOR_BUF The buffers currently
FER_BIT
enabled for color
writing.
GL_DEPTH_BUF The depth buffer.
FER_BIT
GL_ACCUM_BUF The accumulation
FER_BIT
buffer.
GL_STENCIL_BU The stencil buffer.
FFER_BIT
The glClear function sets
the bitplane area of the
window
to
values
previously selected by
glClearColor,
glClearIndex,
glClearDepth,
glClearStencil,
and
glClearAccum.
You can clear multiple
color
buffers
simultaneously
using
glDrawBuffer.
The
glClear
function
ignores
the
alpha
function, blend function,
logical
operation,
stenciling,
texture
mapping,
and
zbuffering.
The glClear function takes a
single argument (mask)
that is the bitwise OR of
several values indicating
which buffer is to be
cleared.
If a buffer is not present, a
glClear call directed at that
buffer has no effect.
Following are the error
codes
generated
and
their conditions.
Error code
Condition
GL_INVALID_ Any bit other than
VALUE
the four defined bits
was set in mask.
Error code
Condition
GL_INVALID_ glClear was called
OPERATION
between a call to
glBegin and the
corresponding call to
glEnd.
glBegin, glEnd
The
glBegin
and
glEnd
functions delimit the vertices
of a primitive or a group of like
primitives.
void glBegin( GLenum mode);
void glEnd( void);
The
following
are
accepted
symbolic
constants
and
their
meanings:
GL_POINTS: treats each
vertex as a single point.
Vertex n: defines point n.
N points are drawn.
GL_LINES treats each pair of
vertices as an independent
line segment. Vertices 2n-1
and 2n define line n. N/2 lines
are drawn.
GL_LINE_STRIP
draws
a
connected
group
of
line
segments from the first vertex
to the last. Vertices n and n+1
define line n. N-1 lines are
drawn.
GL_LINE_LOOP draws a
connected group of line
segments from the first
vertex to the last, then
back to the first. Vertices
n and n+1 define line n.
The last line, however, is
defined by vertices N and
1. N lines are drawn.
GL_TRIANGLES
treats
each triplet of vertices as
an independent triangle.
Vertices 3n-2, 3n-1, and
3n define triangle n. N/3
triangles are drawn.
GL_TRIANGLE_STRIP draws
a
connected
group
of
triangles. One triangle is
defined for each vertex
presented after the first
two vertices. For odd n,
vertices n, n + 1, and n + 2
define triangle n. For even
n, vertices n + 1, n, and n +
2 define triangle n. N-2
triangles are drawn.
GL_TRIANGLE_FAN
draws a connected group
of triangles. One triangle
is
defined
for
each
vertex presented after
the first two vertices.
Vertices 1, n + 1, and n
+ 2 define triangle n. N-2
triangles are drawn.
GL_QUADS treats each
group of four vertices as
an
independent
quadrilateral.
Vertices
4n-3, 4n-2, 4n-1, and 4n
define quadrilateral n.
N/4 quadrilaterals are
drawn.
GL_QUAD_STRIP draws a
connected
group
of
quadrilaterals.
One
quadrilateral is defined for
each
pair
of
vertices
presented after the first
pair. Vertices 2n-1, 2n, 2n
+ 1, and 2n + 2 define
quadrilateral
n.
N
quadrilaterals are drawn.
GL_POLYGON draws a
single, convex polygon.
Vertices 1 through N
define this polygon.
The glBegin and glEnd
functions
delimit
the
vertices
that
define
a
primitive or a group of like
primitives.
Taking n as an integer
count starting at one, and
N as the total number of
vertices
specified,
the
interpretations
are
as
follows:
You can use only a subset
of
OpenGL
functions
between glBegin and glEnd.
The functions you can use
are:
glVertex
glColor
glIndex
glNormal
glMaterial
You can also use glCallList
or glCallLists to execute
display lists that include
only
the
preceding
functions. If any other
OpenGL function is called
between glBegin and glEnd,
the error flag is set and the
function is ignored.
Regardless of the value
chosen for mode in glBegin,
there is no limit to the
number of vertices you can
define between glBegin and
glEnd.
Lines,
triangles,
quadrilaterals,
and
polygons
that
are
incompletely specified are
not drawn.
The
minimum
specification of vertices
for each primitive is:
Minimum number Type of primitive
of vertices
1
Point
2
3
4
Line
Triangle
Quadrilateral
3
Polygon
Modes that require a
certain
multiple
of
vertices are GL_LINES
(2), GL_TRIANGLES (3),
GL_QUADS
(4),
and
GL_QUAD_STRIP (2).
The following are the error
generated and their conditions.
Error code
GL_INVALI
D_ENUM
GL_INVALI
D_OPERATI
ON
codes
Condition
mode was set to an
unaccepted value.
A function other than
glVertex, glColor, glIndex,
glNormal, glTexCoord,
glEvalCoord, glEvalPoint,
glMaterial, glEdgeFlag,
glCallList, or glCallLists was
called between glBegin and
the corresponding glEnd.
The following are the error
generated and their conditions.
Error code
GL_INVALID_O
PERATION
codes
Condition
The function glEnd
was called before
the corresponding
glBegin was
called, or
glBegin was called
within a
glBegin/glEnd
sequence.
glVertex
There are variety of vertex
functions some of them given
below, however complete list
is provided in the notes.
glVertex2d, glVertex2f,
glVertex2i, glVertex2s,
glVertex3d, glVertex3f,
glVertex3i, glVertex3s,
glVertex4d.
void glVertex3f(
GLfloat x,
GLfloat y,
GLfloat z);
Consult notes to see for
the other functions of
the same nature.
The
glVertex
function
commands are used within
glBegin/glEnd
pairs
to
specify point, line, and
polygon
vertices.
The
current color, normal, and
texture
coordinates
are
associated with the vertex
when glVertex is called.
When only x and y are
specified, z defaults to 0.0
and w defaults to 1.0.
When x, y, and z are
specified, w defaults to 1.0.
Invoking glVertex outside
of a glBegin/glEnd pair
results
in
undefined
behavior.
Computer
Graphics
Lecture 34