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

Joe*_*200 2 java opengl lwjgl

我一直得到这个例外:

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)
Run Code Online (Sandbox Code Playgroud)

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

glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glVertexPointer(3, GL_FLOAT, 0, 0L);
Run Code Online (Sandbox Code Playgroud)

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

这有什么不对?

And*_*man 5

顶点缓冲区不是你启用或禁用的东西--LWJGL会误导你.

您需要确定该glVertexPointer命令使用绑定的任何内容GL_ARRAY_BUFFER("Array Buffer Object")作为其内存源(从OpenGL 1.5开始).

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


LWJGL的错误信息措辞不足:

线程"main"中的异常org.lwjgl.opengl.OpenGLException:禁用Array Buffer Object时不能使用偏移量.

错误消息实际上意味着您在调用时绑定了0.LWJGL显然认为只要没有任何约束," Array Buffer Objects "就会被"禁用".这不是不合理,但它确实让你相信这是一个可以使用或启用或禁用的状态; 它不是.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);
Run Code Online (Sandbox Code Playgroud)

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

void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,glVertexPointerLWJGL中还有一种替代形式的函数可以将未存储在缓冲区对象中的内存传递给您java.nio.Buffer.当您没有绑定顶点缓冲区时,这是您应该使用的表单,是错误消息真正告诉您的内容.


这解释了您看到的错误消息实际上意味着什么,但不是它的原因.

由于某种原因vboVertexHandle,在您的应用程序中使用的内容似乎为0或某些值glGenBuffers (...).显示初始化VBO的代码将是helfpul.