java-OpenGLException:禁用数组缓冲区对象时无法使用偏移量..在调用glEnable(GL_ARRAY_BUFFER)之后的一行上?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-OpenGLException:禁用数组缓冲区对象时无法使用偏移量..在调用glEnable(GL_ARRAY_BUFFER)之后的一行上?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2404字,纯文字阅读大概需要4分钟。
内容图文
![java-OpenGLException:禁用数组缓冲区对象时无法使用偏移量..在调用glEnable(GL_ARRAY_BUFFER)之后的一行上?](/upload/InfoBanner/zyjiaocheng/692/25ea2d89df964d3b9511758595ab386b.jpg)
我不断收到此异常:
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兼容性)中,如果将GL_ARRAY_BUFFER绑定为0,则glVertexPointer的最后一个参数是指向程序内存(客户端内存)的实际指针,而不是GPU内存(服务器内存)的偏移量.核心OpenGL 3.1甚至不支持客户端顶点存储,因此最后一个参数始终是偏移量.
LWJGL的错误消息措辞很差:
Exception in thread “main” org.lwjgl.opengl.OpenGLException: Cannot use offsets when Array Buffer Object is disabled.
该错误消息实际上意味着您在调用glVertexPointer(…)时将0绑定到GL_ARRAY_BUFFER. LWJGL显然认为只要没有绑定到GL_ARRAY_BUFFER的数组缓冲区对象就“禁用”.这不是很合理,但是您的确可以使您相信可以使用glEnable或glDisable启用或禁用该状态.它不是.
还记得当您绑定到GL_ARRAY_BUFFER时,我如何将glVertexPointer的最后一个参数描述为偏移量?由于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);
如您所见,LWJGL中有glVertexPointer函数的另一种形式,该形式可以占用未存储在缓冲区对象中的内存,您可以在其中传递java.nio.Buffer的特殊化.当没有顶点缓冲区绑定时,这就是您期望使用的形式,这就是错误消息真正告诉您的.
这说明了您所看到的错误消息的实际含义,而不是原因.
由于某些原因,vboVertexHandle似乎为0或某些在应用程序中使用glGenBuffers(…)未生成的值.在您初始化VBO的地方显示代码将是helfpul.
内容总结
以上是互联网集市为您收集整理的java-OpenGLException:禁用数组缓冲区对象时无法使用偏移量..在调用glEnable(GL_ARRAY_BUFFER)之后的一行上?全部内容,希望文章能够帮你解决java-OpenGLException:禁用数组缓冲区对象时无法使用偏移量..在调用glEnable(GL_ARRAY_BUFFER)之后的一行上?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。