gpt4 book ai didi

java - glBufferData 生成 GL_INVALID_OPERATION

转载 作者:行者123 更新时间:2023-11-29 05:04:01 26 4
gpt4 key购买 nike

我正在浏览 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);

是罪魁祸首。但是,查看文档,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 绑定(bind)到 GL_ARRAY_BUFFER。您在发布代码的第一行绑定(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com