问题描述
有两台都装有现代图形卡的计算机。两者都处理OpenGL 4.6。我得到了这段代码:
GLuint VAO;
glGenVertexArrays(1,&VAO);
glBindVertexArray(VAO);
//Setting up the VAO Attribute format
glVertexArrayAttribFormat(VAO,3 * sizeof(float),GL_FLOAT,GL_FALSE,0);
glEnableVertexArrayAttrib(VAO,0);
由于某种原因,此代码可以在我的一台计算机上正常工作(我的三角形已正确打印)(但是OpenGL返回错误:,但是程序运行正常且没有崩溃)
在另一台计算机上(具有完全相同的代码),当调用glEnableVertexArrayAttrib(VAO,0)导致程序崩溃时,出现此错误。
我不知道为什么同时发生这两个错误,我的VAO在两台计算机上都生成良好。我在调用此代码之前检查了OpenGL上下文,没关系。
如果需要,我可以共享GLFW和Glew Init代码,以及我的着色器生成代码(都不会引发任何错误,并且它已经在我完成的其他一些测试代码中使用了)>
解决方法
您的大小确实不正确,不是以字节为单位。大小表示每个顶点的元素数,例如vec3
对应于3:
glVertexArrayAttribFormat(VAO,3,GL_FLOAT,GL_FALSE,0);
为什么它可以在一台PC上工作,请习惯它。 GPU驱动程序中的OpenGL实现通常是非常神奇和宽容的,直到没有实现为止。
以字节为单位的实际大小会在relativeoffset参数和glVertexArrayVertexBuffer
中起作用,同时还要指定offset和stride。
考虑将glCreateVertexArrays
与直接状态访问功能一起使用。原因是glGenVertexArrays
仅保留VAO对象,但不创建它(在某些驱动程序上会创建)。只有第一个glBindVertexArray(VAO);
会创建这样的对象。这很危险,因为任何使用DSA的呼叫都可能在绑定之前失败,并且如果您首先使用DSA则没有理由进行绑定。我怀疑您已经这样做了,但是其他会看到您的代码和“垃圾”绑定的人可能不知道这一点。