I was running visual studio's CPU profiling tool when I noticed that of my RenderScene call, my skybox was taking up 30% of the frame time.
This is particularly weird, as as you can see the Object3D::draw call is much less, and I have just one Skybox and 35 Object3Ds.
I went in further and found that glBindVertexArray was taking all of the time. What could be causing this? The VAO in question is defined here:
glGenVertexArrays(1, &thisVAO);
glBindVertexArray(thisVAO);
//Setup the Vertex buffer
glGenBuffers(1, &vertsVBO);
glBindBuffer(GL_ARRAY_BUFFER, vertsVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*36, skyboxVertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0);
glEnableVertexAttribArray(0);
and the Skybox Draw call here:
//Shader uniform setting....
glUseProgram(thisConfig.skyboxShaders->getProgramID());
// ... set view and projection matrix
thisConfig.skyboxShaders->setMats(rs->angle, thisConfig.currLighting->persp);
thisConfig.skyboxShaders->setClipPlane(rs->clipPlane, rs->useClipPlane);
//Actually draw the skybox
glBindVertexArray(thisVAO);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
glDrawArrays(GL_TRIANGLES, 0, 36);
Here is visual studio's take on the draw call:
VAOs for Object3D have 5 VBOs and an elements buffer, as opposed to skybox's one VBO, and skyboxVerticies has 96 entries in it for 36 verticies. Most meshes for object3Ds are 1000+ verticies plus, and the Terrain has 48,000. Anything obvious I am missing? The vertex co-ordinates are very large, would that affect the call time for glBindVertexArray()?
Edit : skybox shader
#version 330 core
layout (location = 0) in vec3 aPos;
out of TexCoords;
uniform mat4 projection;
uniform mat4 view;
uniform vec4 clipPlane; // The Plane Clipping
uniform int usePlane; // PLane bool
void main ()
{
TexCoords = aPos;
gl_Position = view * vec4 (aPos, 1.0);
}
Edit : Changing the order has changed things completely, It appears the first glBindVertexArray() per frame has significant overhead (30% of each frame), regardless of shader or vertex array size. Why is this? How can I fix it?