拥有两台同时具有现代图形卡的计算机。两者都处理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返回错误:但是程序正常运行而不会崩溃)
在我的另一台计算机(具有完全相同的代码)上,当调用glEnableVertexArrayAttrib(VAO,0)且程序崩溃时,出现此错误。
我不知道为什么同时发生这两个错误,我的VAO在两台计算机中都很好生成。我在调用此代码之前检查了OpenGL上下文,没关系。
如果需要,我可以共享GLFW和Glew Init代码,以及我的着色器生成代码(都不会引发任何错误,并且它已经在我完成的其他一些测试代码中使用了)
您的大小确实不正确,不是以字节为单位。大小表示每个顶点的元素数,例如,vec3
对应于3:glVertexArrayAttribFormat(VAO, 0, 3 , GL_FLOAT, GL_FALSE, 0);
至于为什么它可以在一台PC上运行,那么请习惯它。GPU驱动程序中的OpenGL实现通常是非常神奇和宽容的,除非不是。
实际大小(以字节为单位)在relativeoffset参数中起作用,也在glVertexArrayVertexBuffer
指定offset和stride的同时起作用。
考虑使用glCreateVertexArrays
直接状态访问功能。原因是glGenVertexArrays
仅保留VAO对象,但不创建它(在某些驱动程序上会创建)。只有第一个glBindVertexArray(VAO);
将创建此类对象。这很危险,因为任何使用DSA的呼叫都可能在绑定之前失败,并且如果您首先使用DSA则没有理由进行绑定。我怀疑您已经这样做了,但是其他将看到您的代码和“垃圾”绑定的人可能不知道这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句