Search code examples
c++openglglfwglew

glEnableVertexArrayAttrib throw invalide size


Got 2 computers with both having modern graphic card. Both handle OpenGL 4.6. I got this code :

GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

//Setting up the VAO Attribute format
glVertexArrayAttribFormat(VAO, 0, 3 * sizeof(float), GL_FLOAT, GL_FALSE, 0);
glEnableVertexArrayAttrib(VAO, 0);

For some reason, this code work well in one of my computer (my triangle is printed correctly) (however OpenGL return error : Error but program work but the program is running normally without crashing)

On my other computer (which got the exact same code) I get this error Error crash the program when glEnableVertexArrayAttrib(VAO,0) is called and my program crash.

I have no idea of why both error are occuring, my VAO is well generated in both computer. I checked for OpenGL context before calling this code and it is ok.

I can share, if needed, the GLFW and Glew Init code and also my shader generation code (both don't raise any error, and it have been used in some other test code I have done without any problem)


Solution

  • Your size is indeed incorrect, it is not in bytes. The size denotes number of elements per vertex, e.g. vec3 corresponds to 3: glVertexArrayAttribFormat(VAO, 0, 3 , GL_FLOAT, GL_FALSE, 0);

    As why it works on one PC, well, get used to it. OpenGL implementations in GPU drivers are usually quite magical and forgiving until they are not.

    The actual sizes in bytes come to play in relativeoffset argument and also in glVertexArrayVertexBuffer while specifying also the offset and stride.

    Consider using glCreateVertexArrays with direct state access functions. The reason is glGenVertexArrays only reserves a VAO object, but does not create it (on some drivers it does). Only the first glBindVertexArray(VAO); will create such object. This is dangerous since any calls using DSA might fail before the bind and there is no reason to bind if you use DSA in the first place. I suspect you are doing it already, but other people who will see your code and the "wasteful" bind might not known this.