java - OpenGL异常 : Cannot use offsets when Array Buffer Object is disabled. 。调用 glEnable(GL_ARRAY_BUFFER) 后在一行上?

标签 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)

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

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/

相关文章:

Java - 如何允许用户选择日期范围,然后检查日期范围是 7 天还是 14 天?

c# - 在 C# 中将像素数组转换为图像

macos - 为什么这个 OpenGL 应用程序在某些 Mac 上运行得非常慢?

c++ - 第一次尝试 - 图形程序

opengl - 如何在OpenGL中实现没有重复顶点的平面着色?

java - LoggerFactory - 输出位置

java - 每次调用函数时从文件中读取一行

java - 如何在 OpenGL/LWJGL 显示列表上绘制纹理?

Opengl 像素完美 2D 绘图

java - lwjgl 为屏幕上的所有项目着色