glBufferData生成GL_INVALID_OPERATION

时间:2015-06-23 23:19:19

标签: java opengl lwjgl

我正在浏览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是一个填充网格位置(如Vector3f' s)的ArrayList。 v.toFloatArray()只返回一个带有向量成员的float数组。

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

glBufferData(GL_ARRAY_BUFFER, posBuf, GL_STATIC_DRAW);

是罪魁祸首。但是,检查文档时,GL_INVALID_OPERATION仅在第一个参数设置为保留值(0)时生成。事实显然不是这样,所以这里发生了什么?

1 个答案:

答案 0 :(得分:2)

只有两个条件glBufferData()会触发GL_INVALID_OPERATION错误。这是来自OpenGL 4.5规范:

  

如果零绑定到目标,则BufferData会生成INVALID_OPERATION错误。

     

如果缓冲区对象的BUFFER_IMMUTABLE_STORAGE标志为TRUE,则会生成INVALID_OPERATION错误。

第二个错误条件仅适用于OpenGL 4.4及更高版本,其中可以使用glBufferStorage()分配不可变缓冲区。

因此,在您的情况下,唯一合乎逻辑的解释是您有GL_ARRAY_BUFFER的0界限。您在发布的代码的第一行绑定缓冲区:

glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]);

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