如何解决OpenGLException:禁用数组缓冲区对象时无法使用偏移量.调用glEnableGL_ARRAY_BUFFER后的一行吗?
顶点缓冲区不是您启用或禁用的东西-LWJGL误导您。
您需要知道该glVertexPointer
命令使用绑定到的GL_ARRAY_BUFFER
对象(“数组缓冲区对象”)作为其内存源(从OpenGL
1.5开始)。
在某些版本的OpenGL(兼容1.5-3.0和3.1+)中,如果您将
绑定到GL_ARRAY_BUFFER
,则最后一个参数glVertexPointer
是实际 指向 _ 内存(客户端内存)的
_指针 ,而不是GPU内存(服务器内存)的 偏移量 。 核心OpenGL 3.1+甚至不支持客户端顶点存储,因此最后一个参数始终是偏移量。
LWJGL的错误消息措辞很差:
线程“主”中的异常 org.lwjgl.opengl.OpenGLException :
错误消息实际上表示您在致电时绑定了 *_GL_ARRAY_BUFFER
__glEnable``gldisable
还记得当您有绑定对象时,我如何将最后一个参数描述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);
如您所见,glVertexPointer
LWJGL中存在函数的另一种形式,该形式可以占用未存储在缓冲区对象中的内存,而您在该对象中传递的特化java.nio.Buffer
。当没有顶点缓冲区绑定时,
_ 就是您期望使用的形式, _ 就是错误消息真正告诉您的。
这说明了您所看到的错误消息的实际含义,而不是原因。
由于某些原因vboVertexHandle
,该值似乎为 或某些值未glGenBuffers
(...)
在您的应用程序中使用生成。在您初始化VBO的地方显示代码将是helfpul。
解决方法
我不断收到此异常:
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,0L);
如您所见,在glVertexPointer调用之前两行(错误所在的那一行),那么我显然在启用数组缓冲区!
怎么了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。