Title: State Management and Drawing Geometry Objects
1- State Management and Drawing Geometry Objects
- (OpenGL Book Ch 2)
2Objective
- 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
3Clearing 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)
4Specifying a Color
- Pseudocode
- set_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)
5Forcing Completion of Drawing
- glFlush()
- Forces previously issued OpenGL commands to begin
execution. - glFinish()
- Forces all previously issued OpenGL command s to
complete. This command doesnt return until all
effects from previous commands are fully realized.
6glutReshapeFunc(reshape)
- Example code
- void reshape (int w, int h)
- glViewport (0, 0, w, h)
- glMatixMode (GL_PROJECTION)
- glLoadIdentity()
- glOrtho2D(0, w, 0, h)
7What 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)
8Curves and Curved Surface
Approximating Curves
9Specifying Vertices
- glVertex2s(2, 3)
- glVertex3d(0.0, 0.0, 3.14)
- glVertex4f(2.4, 1.0, -2.2, 2.0)
- GLdouble v3 1.0, 9.0, 8.0
- glVertex3dv(v)
10Drawing 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()
11OpenGL 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
12Geometric Primitive Types
13Valid Commands between glBegin(), glEnd()
- glVertex()
- glColor(), glIndex()
- glNormal()
- glTexCoord()
- glEdgeFlag()
- glMaterial()
- glArrayElement()
- glEvalCoord(), glEvalPoint()
- glCallList(), glCallLists()
- and any C or C codes
14Basic State Management
- glEnable(GL_DEPTH_TEST)
- glDisable(GL_FOG)
- if (glIsEnabled(GL_FOG)) ...
- glGetBooleanv()
- glGetIntegerv()
- glGetFloatv()
- glGetDoublev(GL_CURRENT_COLOR,x)
- glGetPointerv()
15Point and Line Details
- glPointSize(2.0)
- glLineWidth(2.0)
- glLineStipple(1,0xAAAA)
- glLineStipple(2,0xAAAA)
- glEnable(GL_LINE_STIPPLE)
16Stippled Lines
17Polygon Details
- Drawing polygons as points, outlines, or solids
- glPolygonMode(GL_FRONT, GL_FILL)
- glPolygonMode(GL_BACK, GL_LINE)
- glPolygonMode(GL_FRONT_AND_BACK, GL_POINT)
18Reversing and Culling Polygon Faces
- glFrontFace(GL_CCW)
- glFrontFace(GL_CW)
- glCullFace(GL_BACK)
- glCullFace(GL_FRONT)
- glCullFace(GL_FRONT_AND_BACK)
19Stippling Polygons
- glEnable(GL_POLYGON_STIPPLE)
- // Define stipple pattern fly here...
- glPolygonStipple(fly)
20Marking 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()
21Normal Vectors
- glBegin (GL_POLYGON)
- glNormal3fv(n0)
- glVertex3fv(v0)
- glNormal3fv(n1)
- glVertex3fv(v1) glVertex3fv(v2)
- glEnd()
- Provide Unit Normals!
- glEnable(GL_NORMALIZE) can be expensive
22Example Drawing a unit cube
- Static GLfloat vdata83
- 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 allIndx64
- 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 (i0 ilt6 i)
- glBegin(GL_QUADS)
- glVertex3fv(vdataallIndxi00)
- glVertex3fv(vdataallIndxi10)
- glVertex3fv(vdataallIndxi20)
- glVertex3fv(vdataallIndxi30)
- glEnd()
23Vertex 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
24Step 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)
25Step 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)
26Step 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)
27Stride
- 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, 6sizeof(GLfloat),
intertwined) - glVertexPointer(3, GL_FLOAT, 6sizeof(GLfloat),
intertwined3)
28Step 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()
29Dereferencing a List of Array Elements
- glVertexPointer(3, GL_FLOAT, 0, v)
- Static GLint allIndx244,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 lt 24 i)
- glArrayElement(allIndxi)
- glEnd()
- Alternative 3 Better still
- glDrawElements(GL_QUADS,24,GL_UNSIGNED_INT,allIndx
)
30Hints 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.
31- Next
- Vectors, Matrices and Homogeneous coordinate
system - Transformations