【问题标题】:glEnableVertexArrayAttrib throw invalide sizeglEnableVertexArrayAttrib 抛出无效大小
【发布时间】:2021-01-18 11:47:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 当然,经典的 glVertexAttribPointer 效果很好,但我想将单个 VAO 用于多个 VBO(就像在这篇文章中解释的那样:glVertexAttribFormat style of VAO usage
  • @Rabbid76 我有 GLFW 源代码(没有 lib/dll/a),我在两台计算机上都使用 clang 编译了 64 位的所有内容
  • 请不要将文字作为图片发布,请在此处复制。图片不可搜索。

标签: c++ opengl glfw glew


【解决方案1】:

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

为什么它可以在一台 PC 上运行,好吧,习惯吧。 GPU 驱动程序中的 OpenGL 实现通常非常神奇和宽容,除非它们不是。

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

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

【讨论】:

  • 感谢“原因是 glGenVertexArrays 只保留了一个 VAO 对象,但不创建它(在某些驱动程序上)。”它修复了我在其他代码中遇到的许多错误!
  • @Xemuth 没问题,有点出乎意料。它适用于所有 glGen* 函数。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2020-01-13
  • 2014-12-03
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多