我正在浏览 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()
仅返回一个包含 vector 成员的 float 组。
检查了 glGetError()
开始生成 0 以外的任何内容的代码后,我发现这一行:
glBufferData(GL_ARRAY_BUFFER, posBuf, GL_STATIC_DRAW);
是罪魁祸首。但是,检查文档后发现,仅当第一个参数设置为保留值 (0) 时才会生成 GL_INVALID_OPERATION 。显然情况并非如此,那么这里发生了什么?
最佳答案
只有两种情况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()
分配不可变缓冲区。
因此,在您的情况下,唯一合乎逻辑的解释是您对 GL_ARRAY_BUFFER 的绑定(bind)为 0。您在发布的代码的第一行中绑定(bind)缓冲区:
glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]);
这意味着此时buffer[POS_VB]
为0。使用前需要使用 glGenBuffers()
生成缓冲区 ID。看来您错过了 glGenBuffers()
调用,或者使用不当。
关于java - glBufferData 生成 GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31015083/