我一直得到这个例外:
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调用之前的两行(错误所在的那一行),然后我显然启用了数组缓冲区!
这有什么不对?
您需要确定该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+甚至不支持客户端顶点存储,因此最后一个参数始终是一个偏移量.
线程"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 (...) 必须是当前绑定的顶点缓冲区内存的偏移量.
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.
| 归档时间: |
|
| 查看次数: |
2677 次 |
| 最近记录: |