Transcript
Page 1: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

State Management and Drawing Geometry Objects

(OpenGL Book Ch 2)

Page 2: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Objective

• Clear the window to an arbitrary color

• Force any pending drawing to complete

• Draw with any geometric primitive

• Turn states on and off and query state variables

• Control the display of those primitives

• Specify normal vectors

• Use vertex arrays

• Save and restore state variables

Page 3: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Clearing the Window

glClearColor(0.0, 0.0, 0.0, 0.0);

glClearDepth(1.0);

glClear(GL_COLOR_BUFFER_BIT |

GL_DEPTH_BUFFER_BIT);

// or run more slowly with,

// glClear(GL_COLOR_BUFFER_BIT);

// glClear(GL_DEPTH_BUFFER_BIT);

Page 4: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Specifying a Color

• Pseudocodeset_current_color(red);

draw_object(A);

draw_object(B);

set_current_color(green); // wasted

set_current_color(blue);

draw_object(C);

• glColor3f(1.0, 0.0, 0.0);

Page 5: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Forcing Completion of Drawing

• glFlush();– Forces previously issued OpenGL commands to b

egin execution.

• glFinish();– Forces all previously issued OpenGL command s t

o complete. This command doesn’t return until all effects from previous commands are fully realized.

Page 6: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

What are Points, Lines, and Polygon?

• Points– represented by a vertex

• Lines– refer to line segments

• Polygons– must be simple, convex, and planar

• Rectangles– glRectf(x1, y1, x2, y2);– glRectfv(*pt1, *pt2);

Page 7: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Curves and Curved Surface

Approximating Curves

Page 8: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Specifying Vertices

glVertex2s(2, 3);

glVertex3d(0.0, 0.0, 3.14);

glVertex4f(2.4, 1.0, -2.2, 2.0);

GLdouble v[3] = {1.0, 9.0, 8.0};

glVertex3dv(v);

Page 9: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Drawing Geometric Primitives

glBegin(GL_POLYGON);

glVertex2f(0.0, 0.0);

glVertex2f(4.0, 3.0);

glVertex2f(6.0, 1.5);

glVertex2f(4.0, 0.0);

glEnd();

Page 10: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

OpenGL Geometric Primitives

• GL_POINTS• GL_LINES• GL_LINE_STRIP• GL_LINE_LOOP• GL_TRIANGLES• GL_TRIANGLE_STRIP• GL_TRIANGLE_FAN• GL_QUADS• GL_QUAD_STRIP• GL_POLYGON

Page 11: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Geometric Primitive Types

Page 12: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Valid Commands between glBegin(), glEnd()

• glVertex*()• glColor*(), glIndex*()• glNormal*()• glTexCoord*()• glEdgeFlag*()• glMaterial*()• glArrayElement()• glEvalCoord*(), glEvalPoint*()• glCallList(), glCallLists()• and any C or C++ codes

Page 13: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Basic State Management

• glEnable(GL_DEPTH_TEST);• glDisable(GL_FOG)• if (glIsEnabled(GL_FOG)) ...• glGetBooleanv();• glGetIntegerv();• glGetFloatv();• glGetDoublev(GL_CURRENT_COLOR,x);• glGetPointerv();

Page 14: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Point and Line Details

glPointSize(2.0);

glLineWidth(2.0);

glLineStipple(1,0xAAAA);

glLineStipple(2,0xAAAA);

glEnable(GL_LINE_STIPPLE);

Page 15: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Stippled Lines

Page 16: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Polygon Details

• Drawing polygons as points, outlines, or solids

glPolygonMode(GL_FRONT, GL_FILL);

glPolygonMode(GL_BACK, GL_LINE);

glPolygonMode(GL_FRONT_AND_BACK, G

L_POINT);

Page 17: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Reversing and Culling Polygon Faces

glFrontFace(GL_CCW);

glFrontFace(GL_CW);

glCullFace(GL_BACK);

glCullFace(GL_FRONT);

glCullFace(GL_FRONT_AND_BACK);

Page 18: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Stippling Polygons

glEnable(GL_POLYGON_STIPPLE);

// Define stipple pattern fly here...

glPolygonStipple(fly);

Page 19: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Marking Polygon Boundary Edges

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_POLYGON);

glEdgeFlag(GL_TRUE);

glVertex3fv(V0);

glEdgeFlag(GL_FALSE);

glVertex3fv(V1);

glEdgeFlag(GL_TRUE);

glVertex3fv(V2);

glEnd();

Page 20: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Normal Vectors

glBegin (GL_POLYGON);

glNormal3fv(n0);

glVertex3fv(v0);

glNormal3fv(n1);

glVertex3fv(v1); glVertex3fv(v2);

glEnd();

• Provide Unit Normals! glEnable(GL_NORMALIZE) can be expensive

Page 21: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Example: Drawing a unit cubeStatic GLfloat vdata[8][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},{1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},{1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}}; //global!!Static GLint allIndx[6][4]= { {4,5,6,7},{1,2,6,5},{0,1,5,4}, {0,3,2,1},{0,4,5,4},{2,3,7,6}};for (i=0; i<6; i++){

glBegin(GL_QUADS);glVertex3fv(&vdata[allIndx[i][0]][0]);glVertex3fv(&vdata[allIndx[i][1]][0]);glVertex3fv(&vdata[allIndx[i][2]][0]);glVertex3fv(&vdata[allIndx[i][3]][0]);

glEnd();}

0

7

3 2

1

5

6

4

X

Y

Z

Page 22: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Vertex Arrays

• To reduce the number of function calls

– Six sides; eight shared vertices

Step 1: Enabling arrays

Step 2: Specifying data for the arrays

Step 3: Dereferencing and rendering

Page 23: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Step 1: Enabling Arrays

glEnableClientState(GL_NORMAL_ARRAY);

glEnableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_COLOR_ARRAY);

glEnableClientState(GL_INDEX_ARRAY);

glEnableClientState(GL_EDGE_FLAG_ARRAY);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glDisableClientState(GL_NORMAL_ARRAY);

Page 24: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Step 2: Specifying Data for the Arrays

• glVertexPointer(size, type, stride, pointer)

• glColorPointer(size, type, stride, pointer)

• glIndexPointer(type, stride, pointer)

• glNormalPointer(type, stride, pointer)

• glTexCoordPointer(size, type, stride, pointer)

• glEdgeFlagPointer(stride, pointer)

Page 25: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Step 2: Specifying Data for the Arrays

• glVertexPointer(size, type, stride, ptr)

static GLfloat v[] = {

0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,1.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0), 0.0,1.0,1.0 };

glVertexPointer(3, GL_FLOAT, 0, v);

Page 26: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Stride

static GLfloat intertwined [ ] = {

1.0, 0.2, 1.0, 100.0, 100.0, 0.0,

/* ………………………………*/

0.2, 0.2, 1.0, 200.0, 100.0, 0.0 };

glColorPointer(3, GL_FLOAT, 6*sizeof(GLfloat), intertwined);

glVertexPointer(3, GL_FLOAT, 6*sizeof(GLfloat), &intertwined[3]);

Page 27: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Step 3: Dereferencing and Rendering

Alternative 1:dereferencing a single array element

glVertexPointer(3, GL_FLOAT, 0, v);glBegin(GL_QUADS);

glArrayElement(4);glArrayElement(5);glArrayElement(6);glArrayElement(7);…

glEnd();

0

7

3 2

1

5

6

4

X

Y

Z

Page 28: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Dereferencing a List of Array Elements

glVertexPointer(3, GL_FLOAT, 0, v);Static GLint allIndx[24]={4,5,6,7, 1,2,6,5, 0,1,5,4,

0,3,2,1, 0,4,5,4, 2,3,7,6};

Alternative 2:glBegin(GL_QUADS); for(int i = 0; i < 24; i++)

glArrayElement(allIndx[i]);glEnd();

Alternative 3: Better still …glDrawElements(GL_QUADS,24,GL_UNSIGNED_INT,allIndx);

Page 29: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Hints for Building Polygonal Models of Surfaces

• Keep polygon orientations consistent.– all clockwise or all counterclockwise

• Watch out for non-triangular polygons.

• Trade-off between speed and quality.

• Avoid T- intersections

• There are more… Read the book.

Page 30: State Management and Drawing Geometry Objects (OpenGL Book Ch 2)

Next …

Vectors, Matrices and Homogeneous coordinate system

Transformations


Recommended