我正在浏览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)时生成。事实显然不是这样,所以这里发生了什么?
答案 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()
电话,或者使用不当。