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()
调用,或者使用不当。
我正在阅读 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()
调用,或者使用不当。