Unit2 Ch2 the OpenGL

146
1 Unit 2: Graphics Programming The OpenGL By Shubha Raj K.B.

Transcript of Unit2 Ch2 the OpenGL

Page 1: Unit2 Ch2 the OpenGL

1

Unit 2: Graphics Programming The OpenGL

ByShubha Raj K.B.

Page 2: Unit2 Ch2 the OpenGL

2Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Objectives

2.1 The Sierpinski Gasket2.2 Programming 2D Applications

• Co-ordinate systems2.3 The OpenGL API

• Graphics Functions• The Graphics pipelines and state machines

• The OpenGL Interface2.4 Primitives and Attributes

2.5 Color2.6 Viewing2.7 Control Functions2.8 The Gasket program2.9 Polygons and Recursion2.10 The 3d Gasket2.11 Plotting Implicit Functions

Page 3: Unit2 Ch2 the OpenGL

2.1 The Sierpinski Gasket

We start with 3 points in space if they are not collinear, they are the vertices of a unique triangle

1. Pick an initial point (x,y,z) at random inside the triangle

2. Select one of the 3 vertices at random3. Find the location halfway between the initial

point and the randomly selected vertex.4. Display this new point5. Replace the point at (x,y,z) with this new point6. Return to step 2

3Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 4: Unit2 Ch2 the OpenGL

main(){ initialize_the_system();

for (some_number_of_points) { pt=generate_a_point(); Display_the_point(pt); }Cleanup();}

4Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 5: Unit2 Ch2 the OpenGL

2.2 Programming 2D Applications

Use pen-plotter API.P=(x,y,0) or p=(x,y)OrP can be represented by column matrixglVertex*()*= ntv

5Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 6: Unit2 Ch2 the OpenGL

void display( void ){/* define a point data type */ typedef GLfloat point2[2]; point2 vertices[3]={{0.0,0.0},{250,400.0},{400.0,0.0}}; /* A triangle */ int i, j, k; int rand(); /* standard random number generator */ point2 p ={75,50.0}; /* An arbitrary initial point inside traingle */ /* compute and plots 5000 new points */ for( k=0; k<5000; k++) { j=rand()%3; /* pick a vertex at random */ /* Compute point halfway between selected vertex and old point */ p[0] = (p[0]+vertices[j][0])/2.0; p[1] = (p[1]+vertices[j][1])/2.0; /* plot new point */ glBegin(GL_POINTS); glVertex2fv(p); glEnd(); } glFlush(); /* clear buffers */ } 6

Page 7: Unit2 Ch2 the OpenGL

7Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.2.1 Co-ordinate Systems

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 • Device-independent graphics

World or object co-ordinates Device or Window or Screen co-ordinates

• GS rather than the user is responsible for mapping.

Page 8: Unit2 Ch2 the OpenGL

2.3 The OpenGL API

2.3.1 Graphics functions2.3.2. The Graphics pipelines and state machines

2.3.3 The OpenGL interface: gl,glu, glut

8Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 9: Unit2 Ch2 the OpenGL

9Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

The OpenGL API

•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 AGL for Macintosh

Page 10: Unit2 Ch2 the OpenGL

Graphics System as a Black box

• our basic model of a graphics package is a black box.• This term is used to denote a system whose

properties are described only by its inputs and outputs.

• Graphics system is a box whose inputs are function calls from an application program; measurements from input devices, such as the mouse and

keyboard and messages from os.• Outputs are primarily the graphics sent to output

devices• Example

Simplified view of inputs as function calls and outputs as primitives.

Page 11: Unit2 Ch2 the OpenGL

Graphics system as a black box

• function calls output

• Data Input

Application program

GraphicsSystem

Input/output devices

Page 12: Unit2 Ch2 the OpenGL

12Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.3.1 OpenGL Functions

7 different types of functions• Primitives (WHAT)

Points Line Segments Polygons

• Attributes (HOW)• Viewing (CAMERA)• Transformations• Control (GLUT)• Input (GLUT)• Query (Device independent programs- 2 color)

Page 13: Unit2 Ch2 the OpenGL

Primitive function

• Define the low level objects or atomic entities that our system can display.

• Depending on the API, the primitives can include points, line segments, polygons, pixels, text , and various type of curves and

surfaces.• Example glBegin(GL_POINTS); glVertex2f(100.0,200.0); glEnd();

glBegin(GL_LINES); glVertex2f(100.0,200.0); glVertex2f(300.0,400.0); glEnd();

Page 14: Unit2 Ch2 the OpenGL

Attribute function

•To perform operations ranging from choosing the color with which we display a line segment.

Eg glColor3f(1.0,0.0,0.0); glLineWidth(width);

•To picking a pattern with which to fill the inside of a polygon.

•To selecting a typesafe for the title on a graph.

Page 15: Unit2 Ch2 the OpenGL

Viewing and transformation

• The viewing functions allows us to specify various views,although APIs differ in the degree of flexibility they provide in choosing a view.

glViewport (xvmin, yvmin, vpWidth, vpHeight); gluOrtho2D (xwmin, xwmax, ywmin, ywmax);

• Transformation function that allows to carry out transformations of objects. such as rotation, translation and scaling.

glTranslatef (tx, ty, tz); glRotatef (theta, vx, vy, vz); glScalef (sx, sy, sz);

Page 16: Unit2 Ch2 the OpenGL

Input function• Allows us to deal with the diverse forms of input that characterize modern graphics systems.

void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y));

Control function• Enable us to communicate with the window system, to initialize our programs and to deal with any errors that take place during the execution of our programs. glutInitWindowSize(500,500);

Page 17: Unit2 Ch2 the OpenGL

Query function• How many color are supported or •The size of the display.•Camera parameters or • values in the frame buffer.

Page 18: Unit2 Ch2 the OpenGL

The graphics pipeline and state machine

•Entire graphics system is a state machine.•A black box that contains a finite state machine.

•This state machine has inputs that come from the application program.

•These inputs may change the state of the machine or can cause the machine to produce a visible output.

Page 19: Unit2 Ch2 the OpenGL

19Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.3.2 The Graphics Pipeline and State Machines

•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

Page 20: Unit2 Ch2 the OpenGL

From the Pesspective of API, Two types of graphics functions:

1. Those that define primitives that flow through a

pipeline inside the state machine • glVertex- first type

2. Those that either changes the state inside the machine or return state information.

• In openGL most parameters are persistent.• Their values remain unchanged until we explicitly

change them through functions that alter the state.• For example, once we set a color, that color remains the current

color until it is changed through a color-altering function

Page 21: Unit2 Ch2 the OpenGL

21Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Lack of Object Orientation

•OpenGL is not object oriented so that there are multiple functions for a given logical function­glVertex3f ­glVertex2i ­glVertex3dv

•Underlying storage mode is the same•Easy to create overloaded functions in C++ but issue is efficiency

Page 22: Unit2 Ch2 the OpenGL

2.3.3 OpenGL interface

•Three libraries GL library GLU(OpenGL Utility libarary) GLUT(openGL Utility Toolkit)GL

functions in the GL library have names that begin with the letters gl and are stored in a library usually referred to as GL

Page 23: Unit2 Ch2 the OpenGL

•GLU This library uses only GL functions but contains

code for creating common objects and simplifying viewing.

Functions in the GLU library begin with the letter glu.

GLUTTo interface with the window system and to get

input from external devices into our programs, we need at least one more library.

Page 24: Unit2 Ch2 the OpenGL

• GLX : OpenGL Extension for the X Window System” For the X window system, this library is called GLX

WGLfor windows, it is wgl

WGL or Wiggle is the windowing system interface to the Microsoft Windows implementation of the OpenGL specification .

• AGL for the macintosh it is agl or(Apple graphics library).

• Rather than using a different library for each system,we use a readily available library called the openGL utility Toolkit(GLUT).

• GLUT provides minimum functionality that should be expected in any modern windowing system.

Page 25: Unit2 Ch2 the OpenGL

•Glut uses GLX and the X libraries.•GL_FILL and GL_POINTS are defined in the header file(.h)

•#include<GL/glut.h>• or•#include<GLUT/glut.h>• Is sufficient to read in glut.h,gl.h,glu.h

Page 26: Unit2 Ch2 the OpenGL

Library organization for an x-windows system environment

26Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 27: Unit2 Ch2 the OpenGL

27Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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,….

Page 28: Unit2 Ch2 the OpenGL

2.4 PRIMITIVES AND ATTRIBUTES

Page 29: Unit2 Ch2 the OpenGL

• OpenGL supports two classes of primitives: Geometric primitives Image (or) raster primitivesGeometric primitives• Include points, line segments, polygons, curves

and surfaces.• These primitives pass through a geometric

pipeline. • where they are subject to a series of geometric operations that

determine • whether a primitive is visible or not

• Where on the display it appears if it is visible.

Page 30: Unit2 Ch2 the OpenGL

Primitives and Attributes

•Minimal set•Other set•OpenGL supports 2 classes of primitives

Geometric primitives Image or Raster primitives

30Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 31: Unit2 Ch2 the OpenGL

31Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

OpenGL Primitives

GL_QUAD_STRIPGL_QUAD_STRIP

GL_POLYGONGL_POLYGON

GL_TRIANGLE_STRIPGL_TRIANGLE_STRIP GL_TRIANGLE_FANGL_TRIANGLE_FAN

GL_POINTSGL_POINTS

GL_LINESGL_LINES

GL_LINE_LOOPGL_LINE_LOOP

GL_LINE_STRIPGL_LINE_STRIP

GL_TRIANGLESGL_TRIANGLES

Page 32: Unit2 Ch2 the OpenGL

2.4.1. Polygon basics

•Line segments and polylines•Methods of displaying a polygon•Simple polygon/Nonsimple•Convex/NonConvexity

32Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 33: Unit2 Ch2 the OpenGL

2.4.2 Polygon types in OpenGL

Polygons, Triangles and quadrilaterals, strips and fans

•GL_POLYGON•GL_TRIANGLES•GL_QUADS•GL_TRIANGLE_STRIP•GL_QUAD_STRIP•GL_TRIANGLE_FAN

33Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 34: Unit2 Ch2 the OpenGL

• Geometric Primitives can be used as building blocks for other geometric objects.

• Raster primitives such as arrays of pixels pass through a separate parallel pipeline.

• The basic OpenGL geometric primitives are specified by sets of vertices.

glBegin(type); glVertex*(…); . . glVertex*(…);glEnd();

Page 35: Unit2 Ch2 the OpenGL

Simplified OpenGL Pipeline

35Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 36: Unit2 Ch2 the OpenGL

• The value of type specifies how OpenGL assembles the vertices to define geometric objects.

• Other code and OpenGL function calls can occur between glBegin and glEnd.

• Major difference between the geometric types Whether or not they have interiors.All the basic types are defined by sets of

vertices.

Page 37: Unit2 Ch2 the OpenGL

LINE SEGMENTS•Finite sections of lines between two vertices called line segments.

USES• Use line segments to define approximations to curves.

• you can use a sequence of line segments to connect data values for a graph.

• You can also use line segments for the edges of closed objects, such as polygon that have interiors.

Page 38: Unit2 Ch2 the OpenGL

The primitive and their type specification include the following:

• Points(GL_POINTS): Each vertex is displayed at a size of at least one pixel.

• Line segments(GL_LINES): Successive pairs of vertices to be interpreted as the

endpoints of individual segments.• Polylines(GL_LINE_STRIP,GL_LINE_LOOP):

GL_LINE_STRIP If successive vertices are to be connected, we can use

the line strip or polyline form.GL_LINE_LOOP will draw a line segment from the final vertex to the

first, thus creating a closed path.

Page 39: Unit2 Ch2 the OpenGL
Page 40: Unit2 Ch2 the OpenGL

Polygon Basics

•Polygon –has a border and has a well defined interior.

It can be described by line loop.

•Polygons play a special role in CG.•The performance of graphics systems is characterized by the

number of polygons per second that can be rendered.

Page 41: Unit2 Ch2 the OpenGL

Polygon rendering• Render only its edges.• Render its interior with a solid color or a

pattern.• we can render or not render the edges

Page 42: Unit2 Ch2 the OpenGL

Filled objects

Page 43: Unit2 Ch2 the OpenGL

Methods of displaying a polygon

Page 44: Unit2 Ch2 the OpenGL

•Three properties will ensure that a polygon will be displayed correctly.

• It must be simple,convex and flat.Simple

in 2D ,as long as no two edges of a polygon cross each other,we have a simple polygon.

Well defined interiors.

Page 45: Unit2 Ch2 the OpenGL

Convex

• An object is convex if all points on the line segment between any two points inside the object or on its boundary are inside the object.

• p1 and p2 are arbitrary points inside a polygon and the entire line segment connecting them is inside the polygon.

• Convex objects include triangle, tetrahedra, rectangles, circles, spheres, parallepipeds.

Page 46: Unit2 Ch2 the OpenGL

• 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

Page 47: Unit2 Ch2 the OpenGL

47Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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 can check if above true OpenGL will produce output if these conditions are violated

but it may not be what is desired

• Triangles satisfy all conditions

nonsimple polygon nonconvex polygon

Page 48: Unit2 Ch2 the OpenGL

• a) Simple polygon• B) Nonsimple polygon

Page 49: Unit2 Ch2 the OpenGL

• Convexity

Page 50: Unit2 Ch2 the OpenGL

Convex objects

Page 51: Unit2 Ch2 the OpenGL

Polygon types in OpenGL

• Polygons(GL_POLYGON): successive vertices define line segments and a line

segment connects the final vertex to the first. use the function glPolygonMode to tell the

renderer to generate only the edges or just points for the vertices, instead of fill.

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

• Triangle and quadrilaterals (GL_TRIANGLES,GL_QUADS):

Successive groups of three and four vertices are interpreted as triangles and quadrilaterals.

Page 52: Unit2 Ch2 the OpenGL

• Strips and Fans(GL_TRIANGLE_STRIP, GL_QUAD_STRIP, GL_TRIANGLE_FAN)

groups of triangles or quadrilaterals that share vertices and edges.

Triangle strip Each additional vertex is combined with the previous two

vertices to define a new triangle.Quadstrip Combine two new vertices with the previous two vertices to

define a new quadrilateral.Triangle fan Triangle fan is based on the one fixed point. The next two

points determine the first triangle, and subsequent triangles are formed from one new point, the previous point and the first point.

Page 53: Unit2 Ch2 the OpenGL

Polygon types

Page 54: Unit2 Ch2 the OpenGL
Page 55: Unit2 Ch2 the OpenGL

2.4.3 Approximating a sphere

• Fans and strips allow us to approximate many curved surfaces.

• Ex: For sphere use a set of polygons defined by lines of longitude and latitude.

Page 56: Unit2 Ch2 the OpenGL

2.4.4 TEXT

• There are two forms of text: Stroke Raster

Stroke text• is constructed as are other geometric objects• Advantage

It can be defined to have all the detail of any other object.

It can be manipulated by our standard transformations.

Using transformation we can make a stroke character bigger or rotate

Page 57: Unit2 Ch2 the OpenGL

Stroke text

• Defining a full 128 or 256 character stroke font can be complex.

• It takes significant memory and processing time.

• standard postscript fonts

Page 58: Unit2 Ch2 the OpenGL

Raster text• simple and fast.• Characters are defined as rectangles of bit called bit blocks.

• Each block defines a single character by the pattern of 0 and 1 bits in the block.

• Bit-block-transfer A raster character can be placed in the frame

buffer rapidly by a bit-block-transfer(bitblt) operation,which moves the block of bits using a single call.

Page 59: Unit2 Ch2 the OpenGL

• a)Raster text b) Raster character replication

Page 60: Unit2 Ch2 the OpenGL

Replicating• you can increase the size of raster characters by replicating or duplicating pixels, a process that gives larger characters a blocky appearance.

• GLUT library provides a few predefined bitmap and stroke character sets .

• glutBitmapCharacter(GLUT_BITMAP_8_BY_13, c) Where c is the number of the ASCII character

that we wish to be placed on the display

Page 61: Unit2 Ch2 the OpenGL

2.4.5 Curved objects

•Two approaches We can use the primitives that we have to

approximate curves and surfaces.• a circle with a regular polygon with n sides

mathematical definitions of curved objects • supported by GLU library• quadric surfaces, parametric polynomial curves and

surfaces

Page 62: Unit2 Ch2 the OpenGL

2.4.5 Curved objects

1. Use the primitives that we have to approximate curves and surfaces

• Ex: Circle Sphere (Triangles and Quadrilaterals)

• Tessellation We approximate a curves surfaces by a mesh of

convex polygons- Tessellation which can occur either at the

• rendering stage or • within the user programs

2. Start with the mathematical definitions of curved objects

62Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 63: Unit2 Ch2 the OpenGL

2.4.6 Attributes

•Color•Thinkness of a line•Pattern used to fill a polygon

63Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 64: Unit2 Ch2 the OpenGL

Attributes

An Attributes is any property that determines how a geometric primitive is to be rendered

point (color, size), line (color,thickness, type), polygon (pattern types, etc).

text (height, width, font, style (bold, italic, underlined)) immediate mode primitives are not stored in the display system but rather

passed through the system for possible rendering as soon as they are defined.

no memory once erased from the display,it is lost. display list keep objects in memory so that these objects can be

redisplayed.

Page 65: Unit2 Ch2 the OpenGL

65Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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• Display vertices

Page 66: Unit2 Ch2 the OpenGL

2.5 COLOR

•A visible color can be characterized by a function C() that occupies wavelengths from about 350 to 780nm.

•Tristimulus values Our Brain receive three values.Color theory

If two colors produce the same tristimulus values,then they are visually indistinguishable.

Page 67: Unit2 Ch2 the OpenGL

•Additive color model Primary colors add together to give the

perceived color. The primaries are red,green,blue(RGB) Example of additive color include

• CRT, projectors

•Subractive color modelPrimaries are complementary colors: Cyan,

magenta, yellow(CMY)Example: commercial printing and painting

Page 68: Unit2 Ch2 the OpenGL

Additive color Subtractive color

68Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 69: Unit2 Ch2 the OpenGL

Color formation

• Additive color Subtractive color

Page 70: Unit2 Ch2 the OpenGL

Color solid

Page 71: Unit2 Ch2 the OpenGL

Color solid

•Draw Solid using a coordinate system corresponding to the three primaries.

•Principal diagonal of the cube connects the origin(black) with white.

•All colors along this line have shades of gray.

Page 72: Unit2 Ch2 the OpenGL

2.5.1 RGB Color

Page 73: Unit2 Ch2 the OpenGL

• There are separate buffers for red,green, and blue images.

• Each pixel has separate red, green and blue components that correspond to locations in memory.

• Each pixel consist of 24 bits(3 bytes). 1 byte for each red, green and blue.

• There are 224 possible colors-referred to as 16M colors.

Page 74: Unit2 Ch2 the OpenGL

• Color components between 0.0 and 1.0, where 1.0 denotes the maximun(saturated value).

glColor3f(1.0,0.0,0.0);

RGBA SYSTEM A-alpha The alpha value will be treated by OpenGL as either

an opacity or transparency.A=0.0 - Fully transparent

A=1.0 - Fully opaque

Page 75: Unit2 Ch2 the OpenGL

•Must clear the window whenever we want to draw a new frame.

•glClearColor(1.0,1.0,1.0,1.0); defines an RGB color clearing color that is white.

Page 76: Unit2 Ch2 the OpenGL

2.5.2 Indexed Color• Early graphics systems had frame buffers that were

limited in depth.

• Each pixel was 8 bits deep.

• Smaller group of pixel-assign to R,G,B.

• It gives less no of color.• Indexed color provide solution that allowed applications to

display a wide range of color.

• Images are called indexed color because the actual image color data for each pixel is the index into this palette .

• Analogy with an artist who paints in oil.

Page 77: Unit2 Ch2 the OpenGL

• 256 entries in the table constitute the user’s color palette.

• fig:color lookup table

Page 78: Unit2 Ch2 the OpenGL

Fig:Indexed color

Page 79: Unit2 Ch2 the OpenGL

• Suppose that our frame has k bits per pixel. • Each pixel value or index is an integer between 0 and

2k-1.• We can display colors with precision of m bits.

we can choose from 2m reds,2m greens and 2m blues.

• We can produce any of 23m colors on the display, but the frame buffer can specify only 2k of them.

• We handle the specification through a user defined color lookup table that is of size 2k *3m.

• The user program fills the 2k entries of the table with the desired colors ,

using m bits for each of red ,green and blue.• The first RGB color in the table is index 0, the second RGB

color is index 1, etc. There can be at most only 256 colors in the palette.

Page 80: Unit2 Ch2 the OpenGL

• If we are in color index mode, the present color is selected by a function such

as glIndexi(element);That selects a particular color out of the table.

•GLUT allows us to set the entries in a color table for each window through

the following function: glutSetColor(int color,GLfloat red,GLfloat

green,GLfloat blue)

Page 81: Unit2 Ch2 the OpenGL

• Advantage Less memory Fewer other hardware components.

• 8-bit indexed images are still widely used to save

bandwidth and storage space.

• When early computer screens were commonly limited to 256 colors,

indexed color methods were essential.

Page 82: Unit2 Ch2 the OpenGL

2.5.3 Setting of color attributes

•clear color glClearColor(1.0, 1.0, 1.0, 1.0);

• rendering color for points – set to REDglColor3f(1.0, 0.0, 0.0);

•set point size – let us use 2 pixels sizeglPointSize(2.0);

•These attributes will be valid for all the time if not changed explicitly.

Page 83: Unit2 Ch2 the OpenGL

2.6 VIEWING

Page 84: Unit2 Ch2 the OpenGL

•Camera forms an image by exposing a film.

• The computer system forms an image by carrying out a sequence of operations in its

pipeline.

•The application program specifies parameters for object and the camera.

Page 85: Unit2 Ch2 the OpenGL

2.6.1 Orthographic view

• Place the camera infinitely far from objects.

• Image plane is fixed, move camera far from this plane.

• All projectors become parallel and the center of projection is replaced by direction of

projection.

Page 86: Unit2 Ch2 the OpenGL

•Projectors that are parallel to the positive z-axis and the projection plane at z=0.

•Projectors are perpendicular or orthogonal to the projection plane.

•Slide the projection plane along the z-axis without changing where the projectors intersect the plane.

Page 87: Unit2 Ch2 the OpenGL

Orthographic Projection

Projectors are orthogonal to projection surface

Page 88: Unit2 Ch2 the OpenGL

•For orthographic viewing, special orthographic camera resides in the

projection plane.

•There is reference point in the projection plane from which we can make measurements of a view volume and a direction of projection.

•Reference point -origin. camera points in the negative z-direction.

Page 89: Unit2 Ch2 the OpenGL

The default camera and an orthographic view volume

Page 90: Unit2 Ch2 the OpenGL

Viewing volume

Page 91: Unit2 Ch2 the OpenGL

• It takes a point(x,y,z) and projects it into the point(x,y,0).

• In openGL, an orthographic projection with a right parallelepiped viewing volume is specified via the following

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, Gldouble near,GLdouble far);

• All parameters are distances measured from the camera.

Page 92: Unit2 Ch2 the OpenGL

•The orthographic projection “sees” only those objects in the volume specified by viewing volume.

• If we do not specify a viewing volume, openGL uses its default, 2 x 2 x 2 cube, with

the origin in the center.

• In 2D plane, the bottom-left corner is at (-1.0,-1.0) and upper corner is at(1.0,1.0).

Page 93: Unit2 Ch2 the OpenGL

2.6.2 2D viewing• void gluOrtho2D (GLdouble left, Gldouble right, GLdouble bottom, GLdouble top)• Near and far set to -1.0 and 1.0 respectively.

• Take a rectangular area of our two dimensional world and transferring its contents to the display.

• The area of the world that we image is known as viewing rectangle or clipping rectangle.

• Objects inside the rectangle are in the image. objects outside are clipped out.

Page 94: Unit2 Ch2 the OpenGL

2D viewing

• a) objects before clipping.

• b) objects after clipping

Page 95: Unit2 Ch2 the OpenGL

95Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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

Page 96: Unit2 Ch2 the OpenGL

Matrics

•Two things to specify: Physical location of camera in the scene

(MODELVIEW matrix in OpenGL).

Projection properties of the camera (PROJECTION matrix in OpenGL):

96Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 97: Unit2 Ch2 the OpenGL

97Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.6.3 Matrix Modes• In OpenGL, 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­glMatrixMode (GL_PROJECTION)­glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); ­glMatrixMode (GL_MODELVIEW)

Page 98: Unit2 Ch2 the OpenGL

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far);

Perspective projection

Page 99: Unit2 Ch2 the OpenGL

Orthographic projection

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, GLdouble near, GLdouble far);

Page 100: Unit2 Ch2 the OpenGL

2.7 CONTROL FUNCTION

Page 101: Unit2 Ch2 the OpenGL

2.71. Interaction with the window system

•GLUT is a library of function that provides a simple interface between systems.

Window or screen window denote a rectangular area of our display.

•Window has height and width it displays the contents of the frame buffer. Positions in the window measured in terms

pixels.

Page 102: Unit2 Ch2 the OpenGL

• The window in which the graphics system output appears is one of the windows managed by the window

system.• In science and engg-

Lower left corner is the origin.• All raster system-

Top left corner is origin.• OpenGL-

Bottom left corner is origin.• Screen resolution-1280 x1024• Frame buffer must have resolution equal to screen

size.

Page 103: Unit2 Ch2 the OpenGL

2.7.2 Aspect ratio and viewports

• The aspect ratio of a rectangle is the ratio of the rectangle’s width to its height.

• If different in glOrtho and glutInitWindowSize undesirable side effects

• If they differ, objects are distorted on the screen.

• To avoid this distortion if we ensure that the clipping rectangle and display window have the

same aspect ratio.

Page 104: Unit2 Ch2 the OpenGL

Aspect ratio mismatch

• a) viewing • rectangle• b)display• window

Page 105: Unit2 Ch2 the OpenGL

105Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Viewports

•Do not have use the entire window for the image: glViewport(x,y,w,h)

•Values in pixels (screen coordinates)

Page 106: Unit2 Ch2 the OpenGL

• Interaction between windowing system and OpenGL is initialized by the following function.

glutInit(int *argc,char **argv) Argument is same as main.

• Open OpenGL window using GLUT functionglutCreateWindow(char *title)

Where the Title at the top of the window is given by string title.

• Use following GLUT functions before window creation to specify these parameters.

• glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);

• glutInitWindowSize(640,480);• glutInitWindowPosition(0,0);

• Specifies a 480 x 640 window in the top-left corner of the display.

Page 107: Unit2 Ch2 the OpenGL

107Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

A Simple Program

Generate a square on a solid background

Page 108: Unit2 Ch2 the OpenGL

108Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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){

glutCreateWindow("simple"); glutDisplayFunc(mydisplay); glutMainLoop();

}

Page 109: Unit2 Ch2 the OpenGL

109Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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

Page 110: Unit2 Ch2 the OpenGL

110Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

main.c

#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

Page 111: Unit2 Ch2 the OpenGL

111Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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 coloropaque window

fill/draw with white

viewing volume

Page 112: Unit2 Ch2 the OpenGL

112Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.7.4 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

Page 113: Unit2 Ch2 the OpenGL

113Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

simple.c revisited

• In this version, we shall see the same output

but we have defined all the relevant state values through function calls

• using the default values

• In particular, we set Colors Viewing conditions Window properties

Page 114: Unit2 Ch2 the OpenGL

114Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

GLUT functions

•glutInit allows application to get command line arguments and initializes system

•gluInitDisplayMode requests properties for the window (the rendering context)

RGB color Single buffering Properties logically ORed together

•glutWindowSize in pixels•glutWindowPosition from top-left corner of display•glutCreateWindow create window with title “simple”•glutDisplayFunc display callback•glutMainLoop enter infinite event loop

Page 115: Unit2 Ch2 the OpenGL

115Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Coordinate Systems• The units in glVertex are determined by the

application and are called object or problem coordinates

• The viewing specifications are also in object coordinates and

it is the size of the viewing volume that determines what will appear in the image

• Internally, OpenGL will convert to camera (eye) coordinates and later to screen coordinates

• OpenGL also uses some internal representations that usually are not visible to the application

Page 116: Unit2 Ch2 the OpenGL

2.8 THA GASKET PROGRAM

void myinit(void){/* attributes */ glClearColor(1.0, 1.0, 1.0, 1.0); /* white background */ glColor3f(0.0, 0.0, 1.0); /* draw in red */

/* set up viewing *//* 500 x 500 window with origin lower left */

glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 500.0, 0.0, 500.0); glMatrixMode(GL_MODELVIEW);}

116Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 117: Unit2 Ch2 the OpenGL

void display( void ){ /* define a point data type */ typedef GLfloat point2[2]; point2 vertices[3]={{0.0,0.0},{250,400.0},{400.0,0.0}}; /* A triangle */ int i, j, k; int rand(); /* standard random number generator */ point2 p ={75,50.0}; /* An arbitrary initial point inside traingle */ glClear(GL_COLOR_BUFFER_BIT); /*clear the window */ /* compute and plots 5000 new points */ for( k=0; k<1000; k++) { j=rand()%3; /* pick a vertex at random */ /* Compute point halfway between selected vertex and old point */ p[0] = (p[0]+vertices[j][0])/2.0; p[1] = (p[1]+vertices[j][1])/2.0; /* plot new point */ glBegin(GL_POINTS); glVertex2fv(p); glEnd(); } glFlush(); /* clear buffers */ }

117Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 118: Unit2 Ch2 the OpenGL

118Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.9 Polygon and RecursionSierpinski Gasket (2D)

• Start with a triangle

• Connect bisectors of sides and remove central triangle

Fig: Bisecting the sides of a triangle• Repeat

Page 119: Unit2 Ch2 the OpenGL

119Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Example

• subdivisions

Page 120: Unit2 Ch2 the OpenGL

120Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

The gasket as a fractal

•Consider the filled area (black) and the perimeter (the length of all the lines around the filled triangles)

•As we continue subdividing the area goes to zero but the perimeter goes to infinity

•This is not an ordinary geometric object It is neither two- nor three-dimensional

• It is a fractal (fractional dimension) object

Page 121: Unit2 Ch2 the OpenGL

121Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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 */

Page 122: Unit2 Ch2 the OpenGL

122Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Draw one triangle

void triangle( GLfloat *a, GLfloat *b, GLfloat *c)

/* display one triangle */{ glVertex2fv(a); glVertex2fv(b); glVertex2fv(c);}

Page 123: Unit2 Ch2 the OpenGL

123Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Triangle Subdivisionvoid divide_triangle(GLfloat *a, GLfloat *b, GLfloat *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 */}

Page 124: Unit2 Ch2 the OpenGL

124Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

display and init Functionsvoid display(){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); divide_triangle(v[0], v[1], v[2], n); glEnd(); glFlush();}

void myinit(){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-2.0, 2.0, -2.0, 2.0); glMatrixMode(GL_MODELVIEW); glClearColor (1.0, 1.0, 1.0,1.0) glColor3f(0.0,0.0,0.0);}

Page 125: Unit2 Ch2 the OpenGL

125Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

main Function

int main(int argc, char **argv){ n=4; glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow(“2D Gasket"); glutDisplayFunc(display); myinit();

glutMainLoop();}

Page 126: Unit2 Ch2 the OpenGL

126Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Efficiency Note

•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

Page 127: Unit2 Ch2 the OpenGL

127Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Objectives

•Develop a more sophisticated three-dimensional example

Sierpinski gasket: a fractal

• Introduce hidden-surface removal

Page 128: Unit2 Ch2 the OpenGL

128Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.10 Three-dimensional Applications

• In OpenGL, two-dimensional applications are a special case of three-dimensional

graphics

•Going to 3D Not much changes Use glVertex3*( ) Have to worry about the order in which

polygons are drawn or use hidden-surface removal

Polygons should be simple, convex, flat

Page 129: Unit2 Ch2 the OpenGL

129Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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

Page 130: Unit2 Ch2 the OpenGL

130Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.10.1 Use of 3D points

•We can easily make the program three-dimensional by using GLfloat v[3][3]glVertex3fglOrtho•But that would not be very interesting• Instead, we can start with a tetrahedron

Page 131: Unit2 Ch2 the OpenGL

131Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.10.2. Use of Polygons in 3D

•We can subdivide each of the four faces

•Appears as if we remove a solid tetrahedron from the center leaving four smaller tetrahedra

Page 132: Unit2 Ch2 the OpenGL

132Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

triangle code

void triangle( GLfloat *a, GLfloat *b, GLfloat *c)

{ glVertex3fv(a); glVertex3fv(b); glVertex3fv(c);}

Page 133: Unit2 Ch2 the OpenGL

133Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

subdivision code

void divide_triangle(GLfloat *a, GLfloat *b, GLfloat *c, int m)

{ GLfloat v1[3], v2[3], v3[3]; int j; if(m>0) { for(j=0; j<3; j++) v1[j]=(a[j]+b[j])/2; for(j=0; j<3; j++) v2[j]=(a[j]+c[j])/2; for(j=0; j<3; j++) v3[j]=(b[j]+c[j])/2; divide_triangle(a, v1, v2, m-1); divide_triangle(c, v2, v3, m-1); divide_triangle(b, v3, v1, m-1); } else(triangle(a,b,c));}

Page 134: Unit2 Ch2 the OpenGL

134Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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);}

Page 135: Unit2 Ch2 the OpenGL

135Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Almost Correct

• Because the triangles are drawn in the order they are defined in the program,

the front triangles are not always rendered in front of triangles behind them

get this

want this

Page 136: Unit2 Ch2 the OpenGL

136Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

2.10.3 Hidden-Surface Removal

• We want to see only those surfaces in front of other surfaces

• OpenGL uses a hidden-surface method called the z-buffer algorithm that

saves depth information as objects are rendered so that only the front objects appear in the image

Page 137: Unit2 Ch2 the OpenGL

137Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Using the z-buffer algorithm

• The algorithm uses an extra buffer, the z-buffer, to store depth information as geometry travels down the

pipeline• It must be

Requested in main •glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)

Enabled in init or in main•glEnable(GL_DEPTH_TEST)

Cleared in the display callback•glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

Page 138: Unit2 Ch2 the OpenGL

138Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Surface vs Volume Subdvision

• In our example, we divided the surface of each face

• We could also divide the volume using the same midpoints

• The midpoints define four smaller tetrahedrons,

one for each vertex• Keeping only these tetrahedrons removes a volume in the middle

• See text for code

Page 139: Unit2 Ch2 the OpenGL

139Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Volume Subdivision

Page 140: Unit2 Ch2 the OpenGL

140Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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

Page 141: Unit2 Ch2 the OpenGL

141Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

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

Page 142: Unit2 Ch2 the OpenGL

MATRIX MODE• Using glMatrixMode function you chose which matrix you want

to change.

• OpenGL works with 3 matrices: GL_MODELVIEW: this one is used to move vertex to model space. By default, the matrix mode is GL_MODELVIEW, which assumes everything you

draw will be in one 3Dspace.

• GL_PROJECTION: this one is used to convert 3D coordinate to 2D coordinate for final pixel

position. • A computer monitor is a 2D surface. We need to transform 3D

scene into 2D image in order to display it. GL_PROJECTION matrix is for this projection transformation

• GL_TEXTURE: this one is used to alter texture coordinates.

Page 143: Unit2 Ch2 the OpenGL

Matrix mode

• Pipeline graphics system depends on multiplying together or Concatenating a number of

transformation matrices to achieve the desired image of a primitive• Two important matrices:

Model-view Projection matrix Which are initially set to identity matrix.

The usual sequence is to modify the initial identity matrix by applying sequence of transformations.

Select the matrix to which the operations apply by first setting the matrix mode, a variable that is set to one type of matrix that is also part of the state.

Page 144: Unit2 Ch2 the OpenGL

Concept behind this code??Unit4 and 5

• Once you set the matrix mode, each subsequent operation is applied to that particular matrix mode and below it .

• glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1, 1, -1, 1, -1.0, 1.0); glTranslate( 100, 100, 100 ); glRotate( 45, 1, 0, 0 );

• GL_PROJECTION_MATRIX = IDENTITY * ORTHOGRAPHIC_MATRIX * TRANSLATION_MATRIX * ROTATION_MATRIX.

Page 145: Unit2 Ch2 the OpenGL

2.11 Plotting Implicit Functions• The problem we are discussing here is

How to display data defined by an Implicit function of the form g(x, y)=0

Where the function g is known analytically such as• Equation for a unit circle centered at the origin• g(x, y)= x2-y2-1=0

Display of Explicit functions of the form• Y=h(x) is straightforward because we can evaluate y for a set

of values of x and then write a simple program to display these (x, y) pairs connected by line segments.

• Marching Squares Solve the problem for sampled data by a technique

called marching Squares

145Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009

Page 146: Unit2 Ch2 the OpenGL

Summary of UNIT2• GKS

2D, Pen-Plotter Model GKS-3D

• PHIGS and PHIGS+ 3D, Synthetic-Camera Model

• OpenGL (Silicon Graphics Inc) From GL, Synthetic Camera Model with a Pipeline architecture GL was designed specifically for high-speed real-time rendering.

• Recently Sun Microsystems recently released their Java bindings for openGL Many Java programmer use the JOGL bindings

• In chapter 10, discuss about scene Graphs, Which provide a much higher-level, OO interface to Graphics Hardware Most scene graph APIs are built on top of openGL.

• OpenGL (Scientific and engineering applications are written in openGL)• DirectX??

(Windows), Device-dependent features-from graphics Cards Do not have the portability GAME world

• Modeling-rendering Paradigm Focus on Modeling in UNIT2

146Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009