glEnableVertexArrayAttrib抛出无效大小

问题描述

有两台都装有现代图形卡的计算机。两者都处理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返回错误:

Error but program work

,但是程序运行正常且没有崩溃)

在另一台计算机上(具有完全相同的代码),当调用glEnableVertexArrayAttrib(VAO,0)导致程序崩溃时,出现此错误

Error crash the program

我不知道为什么同时发生这两个错误,我的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则没有理由进行绑定。我怀疑您已经这样做了,但是其他会看到您的代码和“垃圾”绑定的人可能不知道这一点。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...