java - glBufferData 生成 GL_INVALID_OPERATION

标签 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 是一个 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/

相关文章:

c++ - 调整缓冲区大小时 OpenGL 失败

javascript - OpenGL方法数值

java - 获取 java.lang.NoClassDefFoundError : javax/ws/rs/Path when dependency is in buiild. sbt

java - 从 Thymeleaf 访问常量(没有 spring)

linux - Linux中没有X.org的OpenGL

java - 如何在程序启动时验证 Java 版本?

java - GLSL 顶点着色器未编译

java - JPA 对于 GenerationType.IDENTITY 持久失败

java - Camel AmbiguousMethodCallException 抽象类

c++ - 我的 OpenGL C++ Eclipse 项目突然停止识别 glMatrixMode(GL_MODELVIEW)