OpenGLException:禁用数组缓冲区对象时无法使用偏移量。.在调用glEnable(GL_ARRAY_BUFFER)之后的一行上?

乔浩特200

我不断收到此异常:

Exception in thread "main" org.lwjgl.opengl.OpenGLException: Cannot use offsets when Array Buffer Object is disabled
at org.lwjgl.opengl.GLChecks.ensureArrayVBOenabled(GLChecks.java:93)
at org.lwjgl.opengl.GL11.glVertexPointer(GL11.java:2680)
at Joehot200.TerrainDemo.render(TerrainDemo.java:2074)
at Joehot200.TerrainDemo.enterGameLoop(TerrainDemo.java:3266)
at Joehot200.TerrainDemo.startGame(TerrainDemo.java:3490)
at StartScreenExperiments.Test2.resartTDemo(Test2.java:55)
at StartScreenExperiments.Test2.main(Test2.java:41)

但是,数组缓冲区对象已启用!

glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glVertexPointer(3, GL_FLOAT, 0, 0L);

如您所见,在glVertexPointer调用之前两行(错误所在的那一行),那么我显然在启用数组缓冲区!

怎么了

安东·科尔曼

顶点缓冲区不是您启用或禁用的东西-LWJGL误导您。

您需要了解该glVertexPointer命令将绑定到的GL_ARRAY_BUFFER对象(“数组缓冲区对象”)用作其内存源(从OpenGL 1.5开始)。

在某些版本的OpenGL(1.5-3.0和3.1+兼容性)中,如果您将0绑定到GL_ARRAY_BUFFER,则最后一个参数glVertexPointer是实际指向程序内存(客户端内存)的指针而不是GPU内存(服务器内存)偏移量核心OpenGL 3.1+甚至不支持客户端顶点存储,因此最后一个参数始终是偏移量。


LWJGL的错误消息措辞很差:

线程“主”中的异常org.lwjgl.opengl.OpenGLException禁用数组缓冲区对象时无法使用偏移量。

错误消息实际上表示您在致电时绑定了0LWJGL显然认为,只要没有绑定任何内容,数组缓冲区对象就被“禁用”那不是合理,但是它确实使您相信这是可以使用启用或禁用的状态它不是。GL_ARRAY_BUFFERglVertexPointer (...)GL_ARRAY_BUFFERglEnableglDisable

还记得当您有绑定对象时,我如何将最后一个参数描述glVertexPointer偏移量GL_ARRAY_BUFFER由于LWJGL基于Java,因此无法将任意内存地址作为整数传递。传递给的整数值glVertexPointer (...) 必须是当前绑定的顶点缓冲区的内存中的偏移量。

客户端顶点规范(核心GL 3.1+不支持)

void glVertexPointer(int size, int type, int stride, java.nio.ByteBuffer pointer);

服务器侧顶点规范(采用一个偏移GL_ARRAY_BUFFER

void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset);

如您所见,glVertexPointerLWJGL中存在函数的另一种形式,该形式可以占用未存储在缓冲区对象中的内存,而您在该对象中传递的特化java.nio.Buffer这是您没有顶点缓冲区绑定时期望使用的形式,就是错误消息真正告诉您的。


这说明了您所看到的错误消息的实际含义,而不是原因。

由于某些原因vboVertexHandle,该似乎为0或某些值未glGenBuffers (...)在您的应用程序中使用生成显示代码在初始化VBO的位置将是helfpul。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档