glEnableVertexArrayAttrib 抛出无效大小
glEnableVertexArrayAttrib throw invalide size
有 2 台电脑都配备了现代显卡。两者都处理 OpenGL 4.6。我得到了这个代码:
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);
出于某种原因,此代码在我的一台计算机上运行良好(我的三角形打印正确)(但是 OpenGL return 错误: 但程序正常 运行没有崩溃)
在我的另一台计算机(具有完全相同的代码)上,当调用 glEnableVertexArrayAttrib(VAO,0) 并且我的程序崩溃时出现此错误 。
我不知道为什么会出现这两个错误,我的 VAO 在两台计算机上都生成良好。我在调用此代码之前检查了 OpenGL 上下文,没问题。
如果需要,我可以分享 GLFW 和 Glew Init 代码以及我的着色器生成代码(两者都不会引发任何错误,并且它已在我完成的其他一些测试代码中使用,没有任何问题)
您的大小确实不正确,不是以字节为单位。大小表示每个顶点的元素数,例如vec3
对应3:
glVertexArrayAttribFormat(VAO, 0, 3 , GL_FLOAT, GL_FALSE, 0);
为什么它在一台 PC 上工作,好吧,习惯它。 GPU 驱动程序中的 OpenGL 实现通常非常神奇和宽容,直到它们不是。
以字节为单位的实际大小在 relativeoffset 参数和 glVertexArrayVertexBuffer
中发挥作用,同时还指定了偏移量和步幅。
考虑将 glCreateVertexArrays
与直接状态访问函数结合使用。原因是 glGenVertexArrays
只保留一个 VAO 对象,但不创建它(在某些驱动程序上它创建)。只有第一个 glBindVertexArray(VAO);
会创建这样的对象。这是危险的,因为使用 DSA 的任何调用都可能在绑定之前失败,并且如果您首先使用 DSA,则没有理由进行绑定。我怀疑您已经这样做了,但是看到您的代码和“浪费”绑定的其他人可能不知道这一点。
有 2 台电脑都配备了现代显卡。两者都处理 OpenGL 4.6。我得到了这个代码:
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);
出于某种原因,此代码在我的一台计算机上运行良好(我的三角形打印正确)(但是 OpenGL return 错误:
在我的另一台计算机(具有完全相同的代码)上,当调用 glEnableVertexArrayAttrib(VAO,0) 并且我的程序崩溃时出现此错误
我不知道为什么会出现这两个错误,我的 VAO 在两台计算机上都生成良好。我在调用此代码之前检查了 OpenGL 上下文,没问题。
如果需要,我可以分享 GLFW 和 Glew Init 代码以及我的着色器生成代码(两者都不会引发任何错误,并且它已在我完成的其他一些测试代码中使用,没有任何问题)
您的大小确实不正确,不是以字节为单位。大小表示每个顶点的元素数,例如vec3
对应3:
glVertexArrayAttribFormat(VAO, 0, 3 , GL_FLOAT, GL_FALSE, 0);
为什么它在一台 PC 上工作,好吧,习惯它。 GPU 驱动程序中的 OpenGL 实现通常非常神奇和宽容,直到它们不是。
以字节为单位的实际大小在 relativeoffset 参数和 glVertexArrayVertexBuffer
中发挥作用,同时还指定了偏移量和步幅。
考虑将 glCreateVertexArrays
与直接状态访问函数结合使用。原因是 glGenVertexArrays
只保留一个 VAO 对象,但不创建它(在某些驱动程序上它创建)。只有第一个 glBindVertexArray(VAO);
会创建这样的对象。这是危险的,因为使用 DSA 的任何调用都可能在绑定之前失败,并且如果您首先使用 DSA,则没有理由进行绑定。我怀疑您已经这样做了,但是看到您的代码和“浪费”绑定的其他人可能不知道这一点。