glBufferData 生成 GL_INVALID_OPERATION

glBufferData generating GL_INVALID_OPERATION

我正在阅读 OGLdev 教程,但我在让顶点数组对象工作时遇到了困难。这是相关代码:

glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]);

FloatBuffer posBuf = BufferUtils.createFloatBuffer(positions.size() * 3);
for (Vector3f v : positions) {
    posBuf.put(v.toFloatArray());
}
posBuf.flip();

glBufferData(GL_ARRAY_BUFFER, posBuf, GL_STATIC_DRAW);

POS_VB 是 1,positions 是一个 ArrayList,其中填充了网格的位置(如 Vector3f)。 v.toFloatArray() 只是 returns 一个包含向量成员的浮点数组。

检查了 glGetError() 开始生成除 0 以外的任何内容的代码后,我发现这一行:

glBufferData(GL_ARRAY_BUFFER, posBuf, GL_STATIC_DRAW);

是罪魁祸首。但是,查看文档, GL_INVALID_OPERATION 仅在第一个参数设置为保留值(0)时生成。显然不是这样的,这是怎么回事?

只有两种情况 glBufferData() 会触发 GL_INVALID_OPERATION 错误。这是来自 OpenGL 4.5 规范:

An INVALID_OPERATION error is generated by BufferData if zero is bound to target.

An INVALID_OPERATION error is generated if the BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE.

第二个错误条件仅适用于 OpenGL 4.4 及更高版本,其中可以使用 glBufferStorage().

分配不可变缓冲区

因此,在您的案例中,唯一合乎逻辑的解释是您绑定了 0 GL_ARRAY_BUFFER。您在发布代码的第一行绑定缓冲区:

glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]);

这意味着此时buffer[POS_VB]为0。在使用之前,需要使用 glGenBuffers() 生成缓冲区 ID。看来您错过了 glGenBuffers() 调用,或者使用不当。