UNIT - I Part II
UNIT - I Part II
OpenGL
Theory :-
Video games outsource real-time rendering calculations to the GPU over OpenGL. The
rendered results are not sent back to main memory, but to the frame buffer of video memory
instead. The display controller will then send this data to the display device.
Design
The OpenGL specification describes an abstract API for drawing 2D and 3D graphics.
Although it is possible for the API to be implemented entirely in software, it is designed to be
implemented mostly or entirely in hardware.
The API is defined as a set of functions which may be called by the client program,
alongside a set of named integer constants (for example, the constant GL_TEXTURE_2D,
which corresponds to the decimal number 3553). Although the function definitions are
superficially similar to those of the programming language C, they are language-independent.
As such, OpenGL has many language bindings, some of the most noteworthy being the Java
Subject Name: Computer Graphics Class Name: SE (CSE)
Script binding WebGL (API, based on OpenGL ES 2.0, for 3D rendering from within a web
browser); the C bindings WGL, GLX and CGL; the C binding provided by iOS; and
the Java and C bindings provided by Android.
Associated Libraries
The earliest versions of OpenGL were released with a companion library called
the OpenGL Utility Library (GLU). It provided simple, useful features which were unlikely to
be supported in contemporary hardware, such as tessellating, and
generating mipmaps and primitive shapes. The GLU specification was last updated in 1998 and
depends on OpenGL features which are now deprecated.
produce an OpenGL-capable window. The first such library was OpenGL Utility
Toolkit (GLUT), later superseded by freeglut. GLFW is a newer alternative.
These toolkits are designed to create and manage OpenGL windows, and manage input,
but little beyond that.
GLFW – A cross-platform windowing and keyboard-mouse-joystick handler; is more
game-oriented
freeglut – A cross-platform windowing and keyboard-mouse handler; its API is a
superset of the GLUT API, and it is more stable and up to date than GLUT
OpenGL Utility Toolkit (GLUT) – An old windowing handler, no longer maintained.
Several "multimedia libraries" can create OpenGL windows, in addition to input, sound
and other tasks useful for game-like applications
Acknowledgements
Much of the organization and content of this presentation came from the following sources:
Mark Segal and Kurt Akeley's white paper on OpenGL, David Quarrie's OpenGL overview, and
SGI's OpenGL data sheet.
Table of Contents
Introduction
OpenGL Pipeline
Vertices and Primitives
Clipping and Projection
Rasterization
Texturing and Fog
Framebuffer
Per-fragment Operations
Miscellaneous
Evaluators
Display Lists
Feedback and Selection
OpenGL State
Summary
References and Related Links
Introduction
OpenGL is a hardware-independent, operating system independent, vendor neutral graphics API
specification. Many vendors provide implementations of this specification for a variety of
hardware platforms. Bindings exist primarily for the C programming language, but bindings are
also available for Fortran and Ada.
OpenGL has been designed using a client/server paradigm, allowing the client application and
the graphics server controlling the display hardware to exist on the same or separate machines.
The network is transparent to the application.
The OpenGL Utility Library (GLU), which contains several routines that use lower-level
OpenGL commands to perform such tasks as setting up matrices for specific viewing
orientations and projections, performing tessellation, and rendering surfaces.
The OpenGL Extension to the X Window System (GLX) provides a means of creating an
OpenGL context and associating it with an X Window System window.
The OpenGL Programming Guide Auxiliary Library provides routines for initializing and
opening windows, handling X events and dealing with common complex shapes, such as
cubes, spheres, and cylinders.
OpenGL is defined and released by the OpenGL Architecture Review Board (ARB). The ARB
consists of representatives from industry, including DEC, E&S, H-P, IBM, Intel, Intergraph,
Microsoft, SGI, and Sun. The ARB oversees the administration of the OpenGL Specification and
Conformance Test Suite.
OpenGL Pipeline
The OpenGL architecture is structured as a state-based pipeline. Below is a simplified diagram
of this pipeline. Commands enter the pipeline from the left.
Commands may either be accumulated in display lists, or processed immediately through the
pipeline. Display lists allow for greater optimization and command reuse, but not all commands
can be put in display lists.
The first stage in the pipeline is the evaluator. This stage effectively takes any polynomial
evaluator commands and evaluates them into their corresponding vertex and attribute commands.
The second stage is the per-vertex operations, including transformations, lighting, primitive
assembly, clipping, projection, and viewport mapping.
The third stage is rasterization. This stage produces fragments, which are series of framebuffer
addresses and values, from the viewport-mapped primitives as well as bitmaps and pixel
rectangles.
The fourth stage is the per-fragment operations. Before fragments go to the framebuffer, they
may be subjected to a series of conditional tests and modifications, such as blending or z-
buffering.
Parts of the framebuffer may be fed back into the pipeline as pixel rectangles. Texture memory
may be used in the rasterization process when texture mapping is enabled.
Line Loop same as above, with a segment added between last and first vertices
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).
https://web.cs.wpi.edu/~matt/courses/cs563/talks/OpenGL_Presentation/OpenGL_Presentation.html#Per-fragment Operations 4/8
9/18/22, 5:07 AM Overview of OpenGL
Optional vertex attributes are picked up from state if not specified per-vertex. The normal is a 3D
vector perpendicular to the surface being described, and is used during lighting calculations. The
color may be an RGBA value, or a Color Index, depending on the visual type of the window.
Texture coordinates determine the mapping of a texture onto the vertex, and may be specified
with 1, 2, 3, or 4 parameters. Edge flags are used to specify if the vertex is on a boundary of a
surface. Material properties specify such things as reflectance, ambience, etc, and are used for
lighting calculations.
These vertex and attribute commands, as well as many other OpenGL commands, accept
arguments either explicitely or through pointers. They also accept a variety of data types as
arguments, such as ints, floats, doubles, bytes, unsigned ints and bytes, etc.
Commands not associated with primitives are not allowed within Begin/End blocks. This allows
increased optimization of primitive processing.
The model-view matrix, texture matrix, and projection matrix each affect the vertex and its
attributes, and may be easily manipulated via transformations such as rotation, scaling, and
translation.
Lighting parameters, such as material properties, light source properties, and lighting model
parameters affect lighting on a per-vertex basis.
Points are either clipped in our out, depending on whether they fall inside or outside the half-
space defined by the clip planes. Lines and polygons, however, may either be 100% clipped,
100% unclipped, or they may fall partially within the clip space. In this latter case, new vertices
are automatically place on the clip boundary between pre-existing vertices. Vertex attributes are
interpolated.
After clipping, vertices are transformed by the projection matrix (either perspective or
orthagonal), and then clipped to the frustum (view space), following the same process as above.
Finally, the vertices are mapped to the viewport (screen space).
Rasterization
Rasterization converts the above viewport-mapped primitives into fragments. Fragments consist
of pixel location in framebuffer, color, texture coordinates, and depth (z buffer). Depending on
the shading mode, vertex attributes are either interpolated across the primitive to all fragments
(smooth shading), or all fragments are assigned the same values based on one vertex's attributes
(flat shading).
Rasterization is affected by the point and line widths, the line stipple sequence, and the polygon
stipple pattern. Antialiasing may be enabled or disabled for each primitive type. If enabled, the
alpha color value (if in RGBA mode) or color index (if in CI mode) are modified to reflect sub-
pixel coverage.
Pixel rectangles and bitmaps are also rasterized, but they bypass the lighting and geometrical
transformations. They are groups of values heading for the framebuffer. They can be scaled,
offset, and mapped via lookup tables. The rasterization process produces a rectangle of
fragments at a location controlled by the current raster position state variable. The size may be
affected by the pixel zoom setting.
Bitmaps are similar to pixel rectangles, but the data is binary, only producing fragments when
on. This is useful for drawing text in 3D space as part of a scene.
The texture being mapped may be filtered by a variety of texture filters, each a trade-off of
quality versus computational cost. Mipmaps may be specified, allowing smaller representations
of the texture to be used when the projected size of the primitive is small.
After texturing, a fog function may be applied to the fragments. This is a blend of the fragment's
color with a constant, user-specifiable fog color. The blend is based on the distance of the viewer
from the fragment, and may either be linear (depth curing) or exponential (atmospheric affects).
Framebuffer
Fragments produced by rasterization go to the framebuffer where they may be displayed. The
framebuffer is a rectangular array of n bitplanes. The bitplanes are organized into several logical
buffers -- Color, Depth, Stencil, and Accumulation.
The depth buffer contains the fragment's depth info, typically used for z-buffering hidden surface
removal.
The stencil buffer can be associated with fragments that pass the conditional tests described
below and make it into the framebuffer. It can be useful for multiple-pass algorithms.
The accumulation buffer is also used for multiple-pass algorithms. It can average the values
stored in the color buffer. Full-screen antialiasing can be achieved by jittering the viewpoint.
Depth of Field can be achieved by jittering the view angle. Motion blur can be achieved by
stepping the scene in time.
buffers may vary, but must meet the minimum requirement of OpenGL. Each buffer may be
individually cleared to a specified value.
Per-fragment Operations
Before being placed into the framebuffer, each fragment may be subjected to a series of tests and
modifications, each of which may be individually enabled, disabled, and controlled. These
include stencil test, depth test, and blending.
The stencil test compares the value in the stencil buffer associated with the fragment with a
reference value. If successful, the stencil value may be updated and the fragment proceeds to the
next test. If it fails, the fragment is discarded, and the stencil value may be updated with another
value.
The depth test is similar. It compares the fragment's depth with that currently in the depth buffer.
If successful, the depth buffer is updated and the fragment proceeds to the next test. Otherwise,
the fragment is discarded and the depth buffer is unchanged.
Blending mixes the fragment's color with the color already in the color buffer based on some
blend function. This is used for antialiasing and transparency.
Miscellaneous
Evaluators
Evaluators allow the specification of polynomial functions of 1 or 2 variables which may be used
to determine a primitive's vertex coordinates, normal coordinates, texture coordinates, and/or
color. A polynomial map based on a Bezier basis may be specified for any of these attributes
individually.
Evaluators may either be used within primitives (generating individual vertices) or outside of
primitives (generating entire primitives).
Display Lists
Display lists encapsulate a group of commands so that they may be later issued as many times as
desired simply by calling the list by name. This allows increased optimization, server-side
command caching, and simplified user programming. Display lists may be redefined, but may
not be edited. They can be nested, however.
In feedback mode, primitives are intercepted after processing but before rasterization. It returns
info about the primitives, such as vertex coordinates, texture coordinates, and color. This is
useful for rendering to vector devices, such as pen plotters.
In selection mode, OpenGL returns a "hit" whenever a clipped primitive lies within the view
frustum. This can be useful for picking primitives via the cursor.
OpenGL State
Nearly all of OpenGL state may be queried. Most attributes may be pushed and popped from
stacks to quickly go back and forth between state configurations.
Summary
OpenGL is a fully functional primitive-level API that allows the programmer to efficiently
address and take advantage of graphics hardware. Many high-level libraries and applications
make use of OpenGL due to its performance, ease of programming, extensibility, and widespread
support.
Introduction to OpenGL
Week 1
David Breen
Department of Computer Science
Drexel University
2
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Image Formation
Revisited
• Can we mimic the synthetic camera model to
design graphics hardware and software?
• Application Programmer Interface (API)
– Need only specify
• Objects
• Materials
• Viewer
• Lights
• But how is the API implemented?
3
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Physical Approaches
• Ray tracing: follow rays of light from center
of projection until they either are absorbed by
objects or go off to infinity
– Can handle global effects
• Multiple reflections
• Translucent objects
– Slow
– Need whole data base
• Radiosity: Energy based
approach
– Very slow 4
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Practical Approach
• Process objects one at a time in the order
they are generated by the application
– Can consider only local lighting
• Pipeline architecture
application display
program
• All steps can be implemented in hardware on
the graphics card
5
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
The Programmer’s
Interface
6
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
API Contents
• Functions that specify what we need to
form an image
– Objects
– Viewer
– Light Source(s)
– Materials
• Other information
– Input from devices such as mouse and
keyboard
– Capabilities of system
7
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Object Specification
• Most APIs support a limited set of primitives
including
– Points (1D object)
– Line segments (2D objects)
– Polygons (3D objects)
– Some curves and surfaces
• Quadrics
• Parametric polynomial
• All are defined through locations in space or
vertices
8
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Example
type of object
location of vertex
glBegin(GL_POLYGON)
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
glEnd( );
9
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Camera Specification
• Six degrees of freedom
– Position of center of lens
– Orientation
• Lens
• Film size
• Orientation of film plane
10
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Lights and Materials
• Types of lights
– Point sources vs distributed sources
– Spot lights
– Near and far sources
– Color properties
• Material properties
– Absorption: color properties
– Scattering
• Diffuse
• Specular
11
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Following the Pipeline:
Transformations
• Much of the work in the pipeline is in
converting object representations from
one coordinate system to another
– World coordinates
– Camera coordinates
– Screen coordinates
• Every change of coordinates is
equivalent to a matrix transformation
12
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Clipping
• Just as a real camera cannot “see” the
whole world, the virtual camera can only
see part of the world space
– Objects that are not within this volume are
said to be clipped out of the scene
13
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Projection
• Must carry out the process that
combines the 3D viewer with the 3D
objects to produce the 2D image
– Perspective projections: all projectors meet
at the center of projection
– Parallel projection: projectors are parallel,
center of projection is replaced by a
direction of projection
14
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Rasterization
• If an object is visible in the image, the
appropriate pixels in the frame buffer must be
assigned colors
– Vertices assembled into objects
– Effects of lights and materials must be determined
– Polygons filled with interior colors/shades
– Must have also determine which objects are in
front (hidden surface removal)
15
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Programming with OpenGL
Part 1: Background
David Breen
Department of Computer Science
Drexel University
Objectives
• Development of the OpenGL API
• OpenGL Architecture
– OpenGL as a state machine
• Functions
– Types
– Formats
• Simple program
17
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Early History of APIs
• IFIPS (1973) formed two committees to come
up with a standard graphics API
– Graphical Kernel System (GKS)
• 2D but contained good workstation model
– Core
• Both 2D and 3D
– GKS adopted as IS0 and later ANSI standard
(1980s)
• GKS not easily extended to 3D (GKS-3D)
• Far behind hardware development
18
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
PHIGS and X
• Programmers Hierarchical Graphics System
(PHIGS)
– Arose from CAD community
– Database model with retained graphics
(structures)
• X Window System
– DEC/MIT effort
– Client-server architecture with graphics
• PEX combined the two
– Not easy to use (all the defects of each)
19
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
SGI and GL
• Silicon Graphics (SGI) revolutionized the
graphics workstation by implementing the
pipeline in hardware (1982)
• To use the system, application programmers
used a library called GL
• With GL, it was relatively simple to program
three dimensional interactive applications
20
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL
• GL’s success 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
21
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL Evolution
• Controlled by an Architectural Review Board
(ARB)
– Members include SGI, Microsoft, Nvidia, HP,
3DLabs, IBM, ATI, Apple, Intel, …….
– Relatively stable (present version 2.1)
• Evolution reflects new hardware capabilities
– 3D texture mapping and texture objects
– Vertex programs
– Programmable shaders
– Allows for platform specific features through
extensions
22
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL Libraries
• OpenGL core library
– OpenGL32 on Windows
– GL on most unix/linux systems
• 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
– AGL for Macintosh
23
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
GLUT
• OpenGL Utility Library (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
• Slide bars
24
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Software Organization
application program
OpenGL Motif
widget or similar GLUT
GLX, AGL
or WGL GLU
25
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL Architecture
Immediate Mode Geometric
pipeline
Per Vertex
Polynomial Operations &
Evaluator Primitive
Assembly
Texture
Memory
Pixel
Operations
26
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL Functions
• Primitives
– Points
– Line Segments
– Polygons
• Attributes
• Transformations
– Viewing
– Modeling
• Control
• Input (GLUT)
27
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL State
• OpenGL is a state machine
• 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
28
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Lack of Object
Orientation
• OpenGL is not object oriented so that
there are multiple functions for a given
logical function, e.g. glVertex3f,
glVertex2i, glVertex3dv,…..
• Underlying storage mode is the same
• Easy to create overloaded functions in
C++ but issue is efficiency
29
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL function format
function name
glVertex3f(x,y,z)
glVertex3fv(p)
p is a pointer to an array
30
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL #defines
• Most constants are defined in the include files
gl.h, glu.h and glut.h
– Note #include <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,….
31
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
A Simple Program
Generate a square on a solid background
32
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
simple.c
#include <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){
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
} 33
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Event Loop
• Note that the program defines a display
callback function named mydisplay
– Every glut program must have a display callback
– The display callback is executed whenever
OpenGL decides the display must be refreshed,
for example when the window is opened
– The main function ends with the program entering
an event loop
34
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Defaults
• simple.c is too simple
• Makes heavy use of state variable
default values for
– Viewing
– Colors
– Window parameters
• Next version will make the defaults
more explicit
35
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Notes on compilation
• Unix/linux
– Include files usually in …/include/GL
– Compile with –lglut –lglu –lgl loader flags
– May have to add –L flag for X libraries
– Mesa implementation included with most
linux distributions
36
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Notes on compilation
• On tux
– #include <GL/glut.h>
– g++ *.cpp -L/usr/X11R6/lib -lGL -lglut -lGLU
37
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Compilation on Windows
• 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)
• Borland C similar
• Cygwin (linux under Windows)
– Can use gcc and similar makefile to linux
– Use –lopengl32 –lglu32 –lglut32 flags
38
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Programming with OpenGL
Part 2: Complete Programs
David Breen
Department of Computer Science
Drexel University
Objectives
• Refine the first program
– Alter the default values
– Introduce a standard program structure
• Simple viewing
– Two-dimensional viewing as a special
case of three-dimensional viewing
• Fundamental OpenGL primitives
• Attributes
40
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Program Structure
• Most OpenGL programs have a similar structure that
consists of the following functions
– main():
• defines the callback functions
• opens one or more windows with the required properties
• enters event loop (last executable statement)
– init(): sets the state variables
• viewing
• Attributes
– callbacks
• Display function
• Input and window functions
41
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Simple.c revisited
• In this version, we will see the same
output but have defined all the relevant
state values through function calls with
the default values
• In particular, we set
– Colors
– Viewing conditions
– Window properties
42
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
main.c
#include <GL/glut.h> includes gl.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); define window properties
init(); display callback
glutMainLoop(); set OpenGL state
}
44
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
init.c
47
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Orthographic Viewing
In the default orthographic view, points are
projected along the z axis onto the plane z=0
z=0
z=0
48
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Transformations and
Viewing
• In OpenGL, the projection is carried out by a
projection matrix (transformation)
• There is only one set of transformation functions so
we must set the matrix mode first
glMatrixMode (GL_PROJECTION)
• Transformation functions are incremental so we start
with an identity matrix and alter it with a projection
matrix that gives the view volume
glLoadIdentity ();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
49
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Two- and three-dimensional
viewing
• In glOrtho(left, right, bottom, top,
near, far) the near and far distances are
measured from the camera
• Two-dimensional vertex commands place all
vertices in the plane z=0
• If the application is in two dimensions, we can use
the function
gluOrtho2D(left, right,bottom,top)
• In two dimensions, the view or clipping volume
becomes a clipping window
50
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
mydisplay.c
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();
}
51
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
OpenGL Primitives
GL_POINTS GL_POLYGON
GL_LINES GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_QUAD_STRIP
GL_TRIANGLE_STRIP GL_TRIANGLE_FAN
52
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Polygon Issues
• OpenGL will only display polygons correctly that
are
– Simple: edges cannot cross
– Convex: All points on line segment between
two points in a polygon are also in the polygon
– Flat: all vertices are in the same plane
• User program must check if above true
• Triangles satisfy all conditions
54
GLUT Bitmap Text
• glutBitmapCharacter(void *font, int char)
– Displays char at current raster position
• glRasterPos[23][sifd](TYPE x, TYPE y,
TYPE z)
– Sets raster position by transforming world
coordinate point into screen coordinates
• Current raster position is automatically
incremented after char is displayed
• Example (10 pt times roman)
– glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,
‘a’)
55
GLUT Stroke Text
• glutStrokeCharacter(void *font, int char)
– Displays char at current world location
mapped to screen
• Stroke text is geometry that is modified by
modeling transformations
• Each character is approximately 100 x 100
in world coordinates
• Example (roman)
– glutStrokeCharacter(GLUT_STROKE_ROMAN, ‘a’)
56
Attributes
• Attributes are part of the OpenGL state
and determine the appearance of objects
– Color (points, lines, polygons)
– Size and width (points, lines)
– Stipple pattern (lines, polygons)
– Polygon mode
• Display as filled: solid color or stipple pattern
• Display edges
58
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
RGB color
• Each color component stored separately in
the frame buffer
• Usually 8 bits per component in buffer
• Note in glColor3f the color values range
from 0.0 (none) to 1.0 (all), while in
glColor3ub the values range from 0 to 255
59
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Indexed Color
• Colors are indices into tables of RGB
values
• Requires less memory
– indices usually 8 bits
– not as important now
• Memory inexpensive
• Need more colors for shading
60
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Color and State
• The color as set by glColor becomes part of the state
and will be used until changed
– Colors and other attributes are not part of the object
but are assigned when the object is rendered
• We can create conceptual vertex colors by code such
as
glColor
glVertex
glColor
glVertex
61
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Smooth Color
• Default is smooth shading
– OpenGL interpolates vertex colors across visible
polygons
• Alternative is flat shading
– Color of first vertex
determines fill color
• glShadeModel
(GL_SMOOTH)
or GL_FLAT
62
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002
Viewports
• Do not have to use the entire window
for the image: glViewport(x,y,w,h)
• Values in pixels (screen coordinates)
63
Angel: Interactive Computer Graphics 3E © Addison-Wesley 2002