我不断收到此异常:
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
命令使用绑定(bind)到 GL_ARRAY_BUFFER
的任何内容(“数组缓冲区对象”)作为其内存源(从 OpenGL 1.5 开始)。
在某些版本的 OpenGL(1.5-3.0 和 3.1+ 兼容性)中,如果您将 0 绑定(bind)到 GL_ARRAY_BUFFER
,然后最后一个参数为glVertexPointer
是指向程序内存(客户端内存)的实际指针,而不是GPU内存(服务器内存)的偏移 )。 核心 OpenGL 3.1+ 甚至不支持客户端顶点存储,因此最后一个参数始终是偏移量。
LWJGL 的错误消息措辞不当:
Exception in thread "main" org.lwjgl.opengl.OpenGLException: Cannot use offsets when Array Buffer Object is disabled.
该错误消息实际上意味着您已将 0 绑定(bind)到 GL_ARRAY_BUFFER
当您调用glVertexPointer (...)
时。当没有任何内容绑定(bind)到 GL_ARRAY_BUFFER
时,LWJGL 显然会考虑数组缓冲区对象“禁用” 。这并不是太不合理,但它确实让您相信这是一个可以使用 glEnable
启用或禁用的状态。或glDisable
;事实并非如此。
还记得我如何描述 glVertexPointer
的最后一个参数吗?当您将某些内容绑定(bind)到 GL_ARRAY_BUFFER
时作为偏移 ?由于 LWJGL 是基于 Java 的,因此无法将任意内存地址作为整数传递。传递给 glVertexPointer (...)
的整数值必须是当前绑定(bind)顶点缓冲区内存的偏移量。
客户端顶点规范(核心 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);
如您所见,glVertexPointer
有另一种形式。 LWJGL 中的函数可以获取未存储在缓冲区对象中的内存,您可以在其中传递 java.nio.Buffer
的特化。 。当您没有顶点缓冲区绑定(bind)时,您应该使用这种形式,并且这正是错误消息真正告诉您的内容。
这解释了您看到的错误消息的实际含义,但没有解释其原因。
出于某种原因vboVertexHandle
似乎是 0 或某个未使用 glGenBuffers (...)
生成的值在您的应用程序中。显示初始化 VBO 的代码将会很有帮助。
关于java - OpenGL异常 : Cannot use offsets when Array Buffer Object is disabled. 。调用 glEnable(GL_ARRAY_BUFFER) 后在一行上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27525323/