introduction to opengl joseph kider university of pennsylvania cis 565 – fall 2011 (source:...
Post on 20-Dec-2015
221 views
TRANSCRIPT
![Page 1: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/1.jpg)
Introduction to OpenGL
Joseph Kider
University of Pennsylvania
CIS 565 – Fall 2011(Source: Patrick Cozzi)
![Page 2: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/2.jpg)
Administrivia
Assignment 2 handed outUpgrade your video card drivers [NVIDIA | ATI]
![Page 3: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/3.jpg)
Agenda
Review Monday’s GLSL material OpenGL
Shaders and uniformsVertex arrays and buffersMultithreading
Review Assignment 1
![Page 4: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/4.jpg)
GLSL Review
Rewrite with one if and one compareif (dist < wPrime)
{
if (dist < closestDistance)
{
closestDistance = dist;
}
}
![Page 5: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/5.jpg)
GLSL Review
Implement this conciselybool PointInsideAxisAlignedBoundingBox(vec3 p, vec3 b0, vec3 b1)
{
// ...
}
b1
b0
p
Does your code also work for vec2?
![Page 6: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/6.jpg)
GLSL Review
What is the difference between a fixed function and programmable stage?
Vertex shader What is its input? Output?
Fragment shader What is its input? Output? [true | false] Fragment shaders allow you to change
the xy position [true | false] A best practice is to roll your own
functions instead of calling library functions In general, build vs buy
![Page 7: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/7.jpg)
OpenGL
Is a C-based API Is cross platform Is run by the ARB: Architecture Review
Board Hides the device driver details OpenGL vs Direct3D
Not going there – at least not on record
![Page 8: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/8.jpg)
OpenGL
We are using GL 3.3 core profileNo fixed function vertex and fragment shadingNo legacy API calls:
glBegin() glRotatef() glTexEnvf() AlphaFunc() …
Why was the alpha test remove?
Recall the fixed function light map
![Page 9: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/9.jpg)
OpenGL
GPU
Device Driver
OpenGL API
Application
Software stack:
![Page 10: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/10.jpg)
OpenGL
Major objects:
Shader Programs
Textures
Framebuffers Vertex Arrays
Shader Objects
Vertex Buffers
Fixed Function State
Index Buffers
Pixel Buffers
Samplers
We are not covering everything. Just surveying the most relevant parts for writing GLSL shaders
![Page 11: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/11.jpg)
Shaders
Shader object: an individual vertex, fragment, etc. shaderAre provided shader source code as a stringAre compiled
Shader program: Multiple shader objects linked together
![Page 12: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/12.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object:
![Page 13: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/13.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object:
v is an opaque object• What is it under the hood?• How would you design this in C++?
OpenGL functions start with gl. Why? How would you design this in C++?
![Page 14: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/14.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object: Provide the shader’ssource code
Where should thesource come from?
Why can we pass more than one string?
![Page 15: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/15.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object:Compile, but what does the driver really do?
![Page 16: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/16.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object:
Good developers check for error. Again, how would you design this in C++?
Calling glGet* has performance implications. Why?
![Page 17: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/17.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object:
Good developers also cleanup resources
![Page 18: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/18.jpg)
Shader Objects
const char *source = // ...
GLint sourceLength = // ...
GLuint v = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(v, 1, &source, &sourceLength);
glCompileShader(v);
GLint compiled;
glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
// success: compiled == GL_TRUE
// ...
glDeleteShader(v);
Compile a shader object: This process is just like compiling an OpenCL kernel. We will see later this semester
![Page 19: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/19.jpg)
Shader Programs
GLuint v = glCreateShader(GL_VERTEX_SHADER);
GLuint f = glCreateShader(GL_FRAGMENT_SHADER);
// ...
GLuint p = glCreateProgram();
glAttachShader(p, v);
glAttachShader(p, f);
glLinkProgram(p);
GLint linked;
glGetShaderiv(p, GL_LINK_STATUS, &linked);
// success: linked == GL_TRUE
// ...
glDeleteProgram(v);
Link a shader program:
![Page 20: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/20.jpg)
Shader Programs
GLuint v = glCreateShader(GL_VERTEX_SHADER);
GLuint f = glCreateShader(GL_FRAGMENT_SHADER);
// ...
GLuint p = glCreateProgram();
glAttachShader(p, v);
glAttachShader(p, f);
glLinkProgram(p);
GLint linked;
glGetShaderiv(p, GL_LINK_STATUS, &linked);
// success: linked == GL_TRUE
// ...
glDeleteProgram(v);
Link a shader program:A program needs at least a vertex and fragment shader
![Page 21: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/21.jpg)
Shader Programs
GLuint v = glCreateShader(GL_VERTEX_SHADER);
GLuint f = glCreateShader(GL_FRAGMENT_SHADER);
// ...
GLuint p = glCreateProgram();
glAttachShader(p, v);
glAttachShader(p, f);
glLinkProgram(p);
GLint linked;
glGetShaderiv(p, GL_LINK_STATUS, &linked);
// success: linked == GL_TRUE
// ...
glDeleteProgram(v);
Link a shader program:
![Page 22: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/22.jpg)
Shader Programs
GLuint v = glCreateShader(GL_VERTEX_SHADER);
GLuint f = glCreateShader(GL_FRAGMENT_SHADER);
// ...
GLuint p = glCreateProgram();
glAttachShader(p, v);
glAttachShader(p, f);
glLinkProgram(p);
GLint linked;
glGetShaderiv(p, GL_LINK_STATUS, &linked);
// success: linked == GL_TRUE
// ...
glDeleteProgram(v);
Link a shader program:
Be a good developer again
![Page 23: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/23.jpg)
Using Shader Programs
GLuint p = glCreateProgram();
// ...
glUseProgram(p);
glDraw*(); // * because there are lots of draw functions
Part of the current state• How do you draw different objects with different shaders?• What is the cost of using multiple shaders?• How do you reduce the cost?
• Hint: write more CPU code – really.
![Page 24: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/24.jpg)
Using Shader Programs
GLuint p = glCreateProgram();
// ...
glUseProgram(p);
glDraw*(); // * because there are lots of draw functions
![Page 25: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/25.jpg)
Uniforms
GLuint p = glCreateProgram();
// ...
glLinkProgram(p);
GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”);
GLuint l = glGetUniformLocation(p, “u_lightMap”);
glUseProgram(p);
mat4 matrix = // ...
glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]);
glUniform1i(l, 0);
![Page 26: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/26.jpg)
Uniforms
GLuint p = glCreateProgram();
// ...
glLinkProgram(p);
GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”);
GLuint l = glGetUniformLocation(p, “u_lightMap”);
glUseProgram(p);
mat4 matrix = // ...
glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]);
glUniform1i(l, 0);
Each active uniform has an integer index location.
![Page 27: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/27.jpg)
Uniforms
GLuint p = glCreateProgram();
// ...
glLinkProgram(p);
GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”);
GLuint l = glGetUniformLocation(p, “u_lightMap”);
glUseProgram(p);
mat4 matrix = // ...
glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]);
glUniform1i(l, 0);
mat4 is part of the C++ GLM library
GLM: http://www.g-truc.net/project-0016.html#menu
![Page 28: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/28.jpg)
Uniforms
GLuint p = glCreateProgram();
// ...
glLinkProgram(p);
GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”);
GLuint l = glGetUniformLocation(p, “u_lightMap”);
glUseProgram(p);
mat4 matrix = // ...
glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]);
glUniform1i(l, 0);
Uniforms can be changed as often as needed, but are constant during a draw call
Not transposing the matrix
glUniform* for all sorts of datatypes
![Page 29: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/29.jpg)
Uniforms
GLuint p = glCreateProgram();
// ...
glLinkProgram(p);
GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”);
GLuint l = glGetUniformLocation(p, “u_lightMap”);
glUseProgram(p);
mat4 matrix = // ...
glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]);
glUniform1i(l, 0);
Why not glUniform*(p, …)?
![Page 30: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/30.jpg)
Drawing
How do we transfer vertices from system memory to video memory?
How do we issue draw calls?
![Page 31: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/31.jpg)
Drawing
It doesn’t matter if we’re using:
Efficiently transferring data between the CPU and GPU is critical for performance.
![Page 32: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/32.jpg)
Drawing
Image from http://arstechnica.com/hardware/news/2009/10/day-of-nvidia-chipset-reckoning-arrives.ars
Typical pre-Nahalem Intel System
Separate system and video memory
Need to transfer vertices from one to the other quickly
• 4 GB/s reads and writes• Theoretical 128M 32 byte vertices/second
![Page 33: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/33.jpg)
Drawing How good is 128M vertices/second?
Image from http://graphics.cs.uni-sb.de/MassiveRT/boeing777.html
Boeing 777 model: ~350 million polygons
![Page 34: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/34.jpg)
Drawing How good is 128M vertices/second?
Image from http://www.vision.ee.ethz.ch/~pmueller/wiki/CityEngine/Documents
Procedurally generated model of Pompeii: ~1.4 billion polygons
![Page 35: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/35.jpg)
Drawing
OpenGL has evolved since 1992 (GL 1.0) Immediate modeDisplay listsClient-side vertex arraysVertex buffer objects (VBOs)
![Page 36: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/36.jpg)
Drawing: Immediate Mode
GLfloat v0[3] = { 0.0f, 0.0f, 0.0f };
// ...
glBegin(GL_TRIANGLES);
glVertex3fv(v0);
glVertex3fv(v1);
glVertex3fv(v2);
glVertex3fv(v3);
glVertex3fv(v4);
glVertex3fv(v5);
glEnd();
Pro: really simple What’s the con?
![Page 37: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/37.jpg)
Drawing: Display Lists
GLuint dl = glGenLists(1);
glNewList(dl, GL_COMPILE);
glBegin(GL_TRIANGLES);
// ...
glEnd();
glEndList();
// ...
glCallList(dl);
// ...
glDeleteLists(dl, 1);
![Page 38: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/38.jpg)
Drawing: Display Lists
GLuint dl = glGenLists(1);
glNewList(dl, GL_COMPILE);
glBegin(GL_TRIANGLES);
// ...
glEnd();
glEndList();
// ...
glCallList(dl);
// ...
glDeleteLists(dl, 1);
Create one display list, just like glCreateShader creates a shader
![Page 39: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/39.jpg)
Drawing: Display Lists
GLuint dl = glGenLists(1);
glNewList(dl, GL_COMPILE);
glBegin(GL_TRIANGLES);
// ...
glEnd();
glEndList();
// ...
glCallList(dl);
// ...
glDeleteLists(dl, 1);
OpenGL commands between glNewList and glEndList are not executed immediately. Instead, they are compiled into the display list.
![Page 40: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/40.jpg)
Drawing: Display Lists
GLuint dl = glGenLists(1);
glNewList(dl, GL_COMPILE);
glBegin(GL_TRIANGLES);
// ...
glEnd();
glEndList();
// ...
glCallList(dl);
// ...
glDeleteLists(dl, 1);
A single function call executes the display list.You can execute the same display list many times.
Pros Little function call overhead Optimized compiling: stored in
video memory, perhaps vertex cache optimized, etc.
Cons Compiling is slow. How do
you support dynamic data? Usability: what is compiled
into a display list and what isn’t?
![Page 41: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/41.jpg)
Drawing: Display Lists
GLuint dl = glGenLists(1);
glNewList(dl, GL_COMPILE);
glBegin(GL_TRIANGLES);
// ...
glEnd();
glEndList();
// ...
glCallList(dl);
// ...
glDeleteLists(dl, 1); You guys are good developers
![Page 42: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/42.jpg)
Drawing: Client-side Vertex Arrays
Point GL to an array in system memory
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);
![Page 43: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/43.jpg)
Drawing: Client-side Vertex Arrays
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);
Store vertices in an array
![Page 44: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/44.jpg)
Drawing: Client-side Vertex Arrays
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);
Ugh, tell GL we have vertices (positions, actually)• Managing global state is painful
![Page 45: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/45.jpg)
Drawing: Client-side Vertex Arrays
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);
Pointer to our vertices
![Page 46: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/46.jpg)
Drawing: Client-side Vertex Arrays
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);Stride, in bytes, between vertices. 0 means tightly packed.
![Page 47: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/47.jpg)
Drawing: Client-side Vertex Arrays
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);Each vertex has 3 floating point components
![Page 48: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/48.jpg)
Drawing: Client-side Vertex Arrays
GLfloat vertices[] = {...}; // 2 triangles = 6 vertices = 18 floats
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLES, 0, 18);
glDisableClientState(GL_VERTEX_ARRAY);
Draw in a single GL call
Pro: little function call overhead Con: bus traffic
![Page 49: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/49.jpg)
Drawing: Vertex Buffer Objects
VBO: Vertex Buffer Object Like client-side vertex arrays, but:
Stored in driver-controlled memory, not an array in your application
Provide hints to the driver about how you will use the buffer
VBOs are the only way to store vertices in GL 3.3 core profile. The others are deprecated
We can use textures, but let’s not jump ahead
![Page 50: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/50.jpg)
Drawing: Vertex Buffer Objects
GLuint vbo;
GLfloat* vertices = new GLfloat[3 * numberOfVertices];
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER_ARB, vbo);
glBufferData(GL_ARRAY_BUFFER_ARB, numberOfBytes, vertices, GL_STATIC_DRAW_ARB);
// Also check out glBufferSubData
delete [] vertices;
glDeleteBuffers(1, &vbo);
![Page 51: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/51.jpg)
Drawing: Vertex Buffer Objects
GLuint vbo;
GLfloat* vertices = new GLfloat[3 * numberOfVertices];
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER_ARB, vbo);
glBufferData(GL_ARRAY_BUFFER_ARB, numberOfBytes, vertices, GL_STATIC_DRAW_ARB);
// Also check out glBufferSubData
delete [] vertices;
glDeleteBuffers(1, &vbo);
![Page 52: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/52.jpg)
Drawing: Vertex Buffer Objects
GLuint vbo;
GLfloat* vertices = new GLfloat[3 * numberOfVertices];
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER_ARB, vbo);
glBufferData(GL_ARRAY_BUFFER_ARB, numberOfBytes, vertices, GL_STATIC_DRAW_ARB);
// Also check out glBufferSubData
delete [] vertices;
glDeleteBuffers(1, &vbo);
![Page 53: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/53.jpg)
Drawing: Vertex Buffer Objects
GLuint vbo;
GLfloat* vertices = new GLfloat[3 * numberOfVertices];
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER_ARB, vbo);
glBufferData(GL_ARRAY_BUFFER_ARB, numberOfBytes, vertices, GL_STATIC_DRAW_ARB);
// Also check out glBufferSubData
delete [] vertices;
glDeleteBuffers(1, &vbo); Copy from application to driver-controlled memory. GL_STATIC_DRAW should imply video memory.
![Page 54: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/54.jpg)
Drawing: Vertex Buffer Objects
GLuint vbo;
GLfloat* vertices = new GLfloat[3 * numberOfVertices];
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER_ARB, vbo);
glBufferData(GL_ARRAY_BUFFER_ARB, numberOfBytes, vertices, GL_STATIC_DRAW_ARB);
// Also check out glBufferSubData
delete [] vertices;
glDeleteBuffers(1, &vbo); Does glBufferData block? Does glBufferSubData block?
![Page 55: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/55.jpg)
Drawing: Vertex Buffer Objects
Usage HintStatic: 1-to-n update-to-draw ratioDynamic: n-to-m update to draw (n < m)Stream: 1-to-1 update to draw
It’s a hint. Do drivers take it into consideration?
![Page 56: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/56.jpg)
Drawing: Vertex Buffer Objects
Image from http://developer.nvidia.com/object/using_VBOs.html
Map a pointer to driver-controlled memory• Also map just a subset of the buffer
![Page 57: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/57.jpg)
Drawing: Vertex Buffer Objects
Image from: http://upgifting.com/tmnt-pizza-poster
Immediate Mode
VBOs
In general:
Say no to drugstoo, please.
![Page 58: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/58.jpg)
Vertex Array Objects
VBOs are just buffersRaw bytesVAOs: Vertex Array Objects
Interpret VBOs as actual vertices Used when issuing glDraw* You are not responsible for the implementation
details
![Page 59: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/59.jpg)
VBO Layouts
Images courtesy of A K Peters, Ltd. www.virtualglobebook.com
Separate Buffers
Non-interleaved Buffer
Interleaved Buffer
![Page 60: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/60.jpg)
VBO Layouts: Tradeoffs
Separate Buffers Flexibility, e.g.:
Combination of static and dynamic buffers Multiple objects share the same buffer
Non-interleaved Buffer How is the memory coherence?
Interleaved Buffer Faster for static buffers
Proportional to the number of attributes
Hybrid?
![Page 61: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/61.jpg)
Vertex Throughput: VBO Layouts
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
64k triangles per batch and n 4-float texture coordinates
![Page 62: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/62.jpg)
Vertex Throughput: VBO Layouts
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
64k triangles per batch and n 4-float texture coordinates
![Page 63: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/63.jpg)
Vertex Throughput: Batching
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
![Page 64: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/64.jpg)
Vertex Throughput: Batching
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
Making lots of glDraw* calls is slow. Why?
![Page 65: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/65.jpg)
Vertex Throughput Tips
Optimize for the Vertex Caches Use smaller vertices
Use less precision, e.g., half instead of floatCompress, then decompress in vertex shaderPack, then unpack in vertex shaderDerive attributes or components from other
attributesHow many components do you need to store a
normal?
![Page 66: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/66.jpg)
Vertex Throughput Tips
Know your architecture!
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
![Page 67: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/67.jpg)
Vertex Throughput Tips
Know your architecture!
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
GL_SHORT faster on NVIDIA… …slower on ATI
![Page 68: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/68.jpg)
Vertex Throughput Tips
Know your architecture!
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
![Page 69: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/69.jpg)
Vertex Throughput Tips
Know your architecture!
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
GL_SHORT normals faster than GL_FLOAT on NVIDIA But not ATI Still true today?
![Page 70: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/70.jpg)
Vertex Throughput Tips
Know your architecture!
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
GL_BYTE normals use less memory than GL_SHORT or GL_FLOAT but are slower Why? Still true today?
![Page 71: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/71.jpg)
Vertex Throughput Tips
Know your architecture!
Image from http://www.sci.utah.edu/~csilva/papers/thesis/louis-bavoil-ms-thesis.pdf
![Page 72: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/72.jpg)
Vertex Throughput Tips
Know your architecture!
Do you believe me yet?
![Page 73: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/73.jpg)
Multithreaded Rendering Quake 4 CPU usage
41% - driver49% - engine
Split render work into two threads:
Image from http://mrelusive.com/publications/presentations/2008_gdc/GDC%2008%20Threading%20QUAKE%204%20and%20ETQW%20Final.pdf
![Page 74: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/74.jpg)
Multithreaded Rendering Tradeoffs
Throughput vs latencyMemory usage – double buffering
Cache pollution
SynchronizationSingle core machines
DOOM III era
![Page 75: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/75.jpg)
Multithreaded OpenGL Drivers
Image from http://developer.apple.com/library/mac/#technotes/tn2006/tn2085.html
Driver CPU overhead is moved to a separate core
Application remains unchanged
What happens when you call glGet*?
![Page 76: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/76.jpg)
Not Covered Today
Textures Framebuffers State management …
Useful for GPGPU – and graphics, obviously
![Page 77: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/77.jpg)
Class Poll
Multithreaded graphics engine design class? More graphics-related classes? Itching to get to GPGPU and GPU computing?
![Page 78: Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)](https://reader035.vdocuments.mx/reader035/viewer/2022062714/56649d455503460f94a22617/html5/thumbnails/78.jpg)
OpenGL Resources
OpenGL/GLSL Quick Reference Card http://www.khronos.org/files/opengl-quick-reference-card.pdf
OpenGL Spec http://www.opengl.org/registry/doc/glspec33.core.20100311.pdf
OpenGL Forums http://www.opengl.org/discussion_boards/