I did some 4 more tests.
Configuration: Windows XP SP3 32-bit, GeForce GT 430, Drivers 266.58.
Test 1) GL 1.x context, Display Lists: 64 fps
Test 2) GL 1.x context, VBO : 45 fps
Test 3) GL 1.x context, VBO + shaders: 22 fps
Test 4) GL 3.2 context, VBO + shaders: 22 fps
Vertex Attributes are used in tests 3 and 4.
Shaders code:
// Vertex shader
#version 150 core
in vec3 in_vertex;
out vec3 out_color;
uniform mat4 modelViewProjectionMatrix;
void main(void)
{
gl_Position = modelViewProjectionMatrix * vec4(in_vertex, 1.0);
out_color = vec3(1.0, 0.0, 0.0);
}
// Fragment shader
#version 150 core
in vec3 out_color;
out vec4 out_fragcolor;
void main(void)
{
out_fragcolor = vec4(out_color, 1.0);
}
The GL 1.x context is created with wglCreateContext(HDC). The 3.2 context is created with the ARB extension.
Here is a GL trace of 1 single frame of my application when running under a GL 3.2 core profile context:
| SwapBuffers(1A011B83)
| glViewport(0, 0, 751, 704)
| glScissor(0, 0, 751, 704)
| glEnable(GL_SCISSOR_TEST)
| glColorMask(TRUE, TRUE, TRUE, TRUE)
| glClearColor(0.200000, 0.200000, 0.400000, 1.000000)
| glClearDepth(1.000000)
| glDepthMask(TRUE)
| glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT)
| glEnable(GL_DEPTH_TEST)
| glDisable(GL_SCISSOR_TEST)
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
| glColorMask(TRUE, TRUE, TRUE, TRUE)
| glUseProgram(3)
| glUniformMatrix4fv(0, 1, FALSE, 0607CDA0)
| glBindBuffer(GL_ARRAY_BUFFER, 1)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 2)
| glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 4)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 3)
| glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 6)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 5)
| glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 8)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 7)
| glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 10)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 9)
| glDrawElements(GL_TRIANGLES, 54, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 12)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 11)
| glDrawElements(GL_TRIANGLES, 54, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 14)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 13)
| glDrawElements(GL_TRIANGLES, 60, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ARRAY_BUFFER, 16)
| glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 0, 00000000)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 15)
| glDrawElements(GL_TRIANGLES, 60, GL_UNSIGNED_INT, 00000000)
| glBindBuffer(GL_ARRAY_BUFFER, 0)
| glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
| glUseProgram(0)
| glGetError()
| glDisable(GL_DEPTH_TEST)
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
| glColorMask(TRUE, TRUE, TRUE, TRUE)
| glViewport(0, 0, 800, 600)
| glGetError()
| SwapBuffers(1A011B83)
Note that the framework that I am using unbinds vertex and element buffers after the fact (glBindBuffer(GL_ARRAY_BUFFER, 0) and glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)). I wonder if this could be the cause of the slowdown, but I would be very surprised if it was.
Any ideas?
Cheers,
Fred