Efficient drawing with OpenGL
Efficient drawing with OpenGL
Efficient drawing with OpenGL
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