each geometric primitive intersected only once (no mailboxing required)
scaling
rotation
translation

flat
Gouraud
Phong
Phong Lighting Model
ambient
+diffuse
+specular
z-Buffer
GL_ARB_compatibility
CoreProfile: only non-deprecated features (We focus on core profile!)CompatibilityProfile: all features ever in OpenGL
| GPU, OS | old OpenGL immediate mode |
new OpenGL vertex buffer objects |
|---|---|---|
| NVIDIA GeForce 9400M, Mac OS X | 12 | 56 |
| NVIDIA GeForce GT 120, Mac OS X | 27 | 216 |
| NVIDIA GeForce GTX 285, Windows 7 | 10 | 315 |
| ATI Radeon HD 5680, Mac OS X | 20 | 592 |
| NVIDIA GeForce GTX 580, Linux | 7 | 600 |
Rendering performance in million triangles per second,
measured on a model with 400k triangles
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_FAN
GL_TRIANGLE_STRIP
// buffer indices
GLuint vao, vbo, nbo, ibo;
//mesh data
GLfloat positions[3*n_vertices];
GLfloat normals[3*n_vertices];
GLuint indices[3*n_triangles];
// generate vertex array object
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// vertex positions -> attribute 0
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 3*n_vertices*sizeof(GLfloat), positions, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// normal vectors -> attribute 1
glGenBuffers(1, &nbo);
glBindBuffer(GL_ARRAY_BUFFER, nbo);
glBufferData(GL_ARRAY_BUFFER, 3*n_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
// triangle indices
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*n_triangles*sizeof(GLuint), indices, GL_STATIC_DRAW);
// activate VAO (this activates all VBOs and attrib pointers)
glBindVertexArray(vao);
// draw triangles
glDrawElements(GL_TRIANGLES, 3*n_triangles, GL_UNSIGNED_INT, NULL);
// delete vertex buffer objects
glDeleteBuffers(1, &vbo);
glDeleteBuffers(1, &nbo);
glDeleteBuffers(1, &ibo);
// delete vertex array object
glDeleteVertexArrays(1, &vao);