c++ - glEnableVertexArrayAttrib 抛出无效大小

标签 c++ opengl glfw glew

有 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返回错误:Error but program work但程序运行正常而没有崩溃)

在我的另一台计算机(具有完全相同的代码)上,我收到此错误 Error crash the program 当调用 glEnableVertexArrayAttrib(VAO,0) 并且我的程序崩溃时。

我不知道为什么会发生这两个错误,我的 VAO 在两台计算机上都生成良好。我在调用此代码之前检查了 OpenGL 上下文,一切正常。

如果需要,我可以分享 GLFW 和 Glew Init 代码以及我的着色器生成代码(两者都不会引发任何错误,并且它已在我完成的其他一些测试代码中使用,没有任何问题)

最佳答案

你的大小确实不正确,它不是以字节为单位。大小表示每个顶点的元素数量,例如vec3 对应于 3: glVertexArrayAttribFormat(VAO, 0, 3 , GL_FLOAT, GL_FALSE, 0);

至于为什么它可以在一台电脑上运行,好吧,习惯它。 GPU 驱动程序中的 OpenGL 实现通常非常神奇且宽容,直到事实并非如此。

实际大小(以字节为单位)在relativeoffset参数和glVertexArrayVertexBuffer中发挥作用,同时还指定偏移量和步幅。

考虑使用带有直接状态访问函数的glCreateVertexArrays。原因是glGenVertexArrays仅保留VAO对象,但不创建它(在某些驱动程序上确实如此)。只有第一个 glBindVertexArray(VAO); 才会创建这样的对象。这是危险的,因为使用 DSA 的任何调用都可能在绑定(bind)之前失败,并且如果您首先使用 DSA,则没有理由进行绑定(bind)。我怀疑您已经这样做了,但是其他看到您的代码和“浪费”绑定(bind)的人可能不知道这一点。

关于c++ - glEnableVertexArrayAttrib 抛出无效大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64177660/

相关文章:

c++ - fork 后全局资源的归属

python - 当我没有为 openGLWidget 创建额外的类时,为什么 glRotate 只工作一次?

c++ - glfw3 for code::blocks 16.01 in ubuntu

iphone - 在 iPhone 上使用 Alpha channel 捕获 EAGLview 内容

opengl - 3D网格的隐藏线去除算法?

c++ - 构造函数发生异常时如何释放API使用的资源?

c++ - 增加按键模型的加速?

c++ - 如何修复 C++ DLL 中未解析的外部符号错误?

c++ - std::begin() 和 std::end() 依赖 ADL?

C++ 类型推断递归函数