21.08.2013 Views

Efficient drawing with OpenGL

Efficient drawing with OpenGL

Efficient drawing with OpenGL

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

High Performance Computing Techniques in 3d Graphics<br />

Instructor: Pourya Shirazian


How to choose best method when <strong>drawing</strong><br />

geometries in <strong>OpenGL</strong>?<br />

Available methods<br />

Costs and Complexity<br />

High Performance Computing Techniques - Pourya Shirazian<br />

2


Immediate Mode<br />

Display Lists<br />

Vertex Arrays (Client Memory)<br />

Vertex Buffer Objects (VBO) (Server Memory)<br />

High Performance Computing Techniques - Pourya Shirazian<br />

3


Primitives being drawn as they are defined:<br />

glBegin(GL_TRIANGLES);<br />

glVertex3fv(v0);<br />

glVertex3fv(v1);<br />

glVertex3fv(v2);<br />

glEnd();<br />

V0<br />

High Performance Computing Techniques - Pourya Shirazian 4<br />

V1<br />

V2


V4<br />

V7<br />

Shared vertices should be repeated<br />

V3<br />

V0<br />

V5<br />

V2<br />

V1<br />

Each Vertex is shared between 3 quads/<br />

glBegin(GL_QUADS);<br />

glVertex3fv(v0); glVertex3fv(v1);<br />

glVertex3fv(v2); glVertex3fv(v3);<br />

glVertex3fv(v0); glVertex3fv(v3);<br />

glVertex3fv(v7); glVertex3fv(v4);<br />

glVertex3fv(v0); glVertex3fv(v4);<br />

glVertex3fv(v5); glVertex3fv(v1);<br />

// draw other 3 faces<br />

…<br />

glEnd();<br />

High Performance Computing Techniques - Pourya Shirazian 5


A List of commands stored for later execution<br />

Lists reside on server (static object)<br />

Client Server<br />

index = glGenLists(1);<br />

glNewList(index, GL_COMPILE);<br />

glBegin(GL_TRIANGLES);<br />

glVertex3fv(v0);<br />

glVertex3fv(v1);<br />

glVertex3fv(v2);<br />

glEnd();<br />

glEndList();<br />

List 1<br />

List 2<br />

List n<br />

High Performance Computing Techniques - Pourya Shirazian 6


Not all <strong>OpenGL</strong> commands can be used:<br />

No Client Commands:<br />

No result returnable funcs:<br />

glFlush<br />

glFinish<br />

glRenderMode<br />

glEnableClientState<br />

glVertexPointer<br />

glIsEnabled<br />

glGet<br />

glReadPixels<br />

glFeedbackBuffer<br />

High Performance Computing Techniques - Pourya Shirazian 7


Build Once, Draw Many Times <br />

List 1<br />

List 2<br />

List 3<br />

glCallList(1);<br />

glListBase(index);<br />

glCallLists(3, GL_INT, {1,2,3});<br />

High Performance Computing Techniques - Pourya Shirazian 8<br />

V0<br />

V1<br />

V2


Benefits:<br />

▪ Lists are on the server side no data transfer overhead<br />

Disadvantages:<br />

▪ Once a list is compiled its data cannot be modified<br />

High Performance Computing Techniques - Pourya Shirazian 9


glEnableClientState, glDisableClientState<br />

Are used to enable and disable 6 type of arrays:<br />

1. Vertices glVertexPointer<br />

2. Normals glNormalPointer<br />

3. Colors glColorPointer<br />

4. Indices glIndexPointer<br />

5. Textures glTexCoordPointer<br />

6. EdgeFlags glEdgeFlagPointer<br />

High Performance Computing Techniques - Pourya Shirazian 10


All objects are on the client application<br />

memory and the server will be given access.<br />

EdgeFlags: used to show if a vertex is on the<br />

boundary edge or not.<br />

Only edges <strong>with</strong> set edgeflag will be visible<br />

<strong>with</strong> glPolygonMode(GL_LINES);<br />

High Performance Computing Techniques - Pourya Shirazian 11


Draw Mesh:<br />

1. glColorPointer(3, GL_FLOAT, 0, mesh.vColor);<br />

2. glEnableClientState(GL_COLOR_ARRAY);<br />

3. glNormalPointer(GL_FLOAT, 0, mesh.vNorm);<br />

4. glEnableClientState(GL_NORMAL_ARRAY);<br />

5. glVertexPointer(3, GL_FLOAT, 0, mesh.vPos);<br />

6. glEnableClientState(GL_VERTEX_ARRAY);<br />

7. glDrawElements(GL_TRIANGLES, (GLsizei)mesh.ctTriangles * 3,<br />

GL_UNSIGNED_SHORT, mesh.triangles);<br />

8. glDisableClientState(GL_COLOR_ARRAY);<br />

9. glDisableClientState(GL_NORMAL_ARRAY);<br />

10. glDisableClientState(GL_VERTEX_ARRAY);<br />

High Performance Computing Techniques - Pourya Shirazian 12


Benefits:<br />

▪ Reduces number of functions calls for <strong>drawing</strong><br />

primitives<br />

▪ Reduces redundant usage of shared vertices<br />

Disadvantages<br />

▪ Functions are called on the client side<br />

▪ Memory should be resent to server upon each call<br />

High Performance Computing Techniques - Pourya Shirazian 13


Store VERTEX VBO, Store PIXELPBO<br />

Hybrid of Vertex Arrays and DisplayLists<br />

Buffer Objects for vertex attribute in high<br />

performance memory<br />

Buffer Objects are server side<br />

3 Kinds of memory usages: System, AGP,<br />

Video Memory<br />

High Performance Computing Techniques - Pourya Shirazian 14


Buffer Objects can be mapped to client<br />

memory space for modification<br />

Buffer Objects can be accessed by multiple<br />

clients using identifiers.<br />

High Performance Computing Techniques - Pourya Shirazian 15


glGenBuffer: Generates a new buffer<br />

▪ void glGenBuffersARB(GLsizei n, GLuint* ids)<br />

▪ Param 1: Number of buffers to generate<br />

▪ Param 2: Array to store buffer ids<br />

glBindBuffer<br />

▪ void glBindBufferARB(GLenum target, GLuint id)<br />

▪ Param 1: target is vertex or index<br />

▪ GL_ARRAY_BUFFER_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB<br />

High Performance Computing Techniques - Pourya Shirazian 16


glBufferData<br />

▪ void glBufferDataARB(GLenum target, GLsizei size,<br />

const void* data, GLenum usage)<br />

▪ target: GL_ARRAY_BUFFER_ARB ,<br />

GL_ELEMENT_ARRAY_BUFFER_ARB<br />

▪ size: Number of bytes to transfer<br />

▪ data: pointer to buffer data<br />

▪ usage: static, dynamic, stream and read, copy or draw<br />

High Performance Computing Techniques - Pourya Shirazian 17


GL_STATIC_DRAW_ARB<br />

GL_STATIC_READ_ARB<br />

GL_STATIC_COPY_ARB<br />

GL_DYNAMIC_DRAW_ARB<br />

GL_DYNAMIC_READ_ARB<br />

GL_DYNAMIC_COPY_ARB<br />

GL_STREAM_DRAW_ARB<br />

GL_STREAM_READ_ARB<br />

GL_STREAM_COPY_ARB<br />

High Performance Computing Techniques - Pourya Shirazian 18


Static/Dynamic Draw/Read/Copy<br />

Static: Does not change Draw: Application GL<br />

VBO<br />

Dynamic: Changes Read: GL Application<br />

PBO<br />

Copy: GL GL<br />

FBO<br />

High Performance Computing Techniques - Pourya Shirazian 19


Map memory to client address space:<br />

▪ void* glMapBufferARB(GLenum target, GLenum access)<br />

▪ target: GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER<br />

▪ access: READ, WRITE, READ/WRITE<br />

▪ Returns NULL on failure.<br />

Unmap memory after making changes<br />

▪ GLboolean glUnmapBufferARB(GLenum target)<br />

High Performance Computing Techniques - Pourya Shirazian 20


Benefits:<br />

▪ Unlike display lists memory can be read and mapped on<br />

client address space for modifications.<br />

▪ Memory objects can be shared among many clients<br />

using identifiers.<br />

High Performance Computing Techniques - Pourya Shirazian 21

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!