当前位置: 首页 > 面试题库 >

OpenGLException:禁用数组缓冲区对象时无法使用偏移量。.调用glEnable(GL_ARRAY_BUFFER)后的一行吗?

申高峯
2023-03-14
问题内容

我不断收到此异常:

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+)中,如果您将 0
绑定到GL_ARRAY_BUFFER,则最后一个参数glVertexPointer是实际 指向 _ 程序 内存(客户端内存)的
_指针
,而不是GPU内存(服务器内存)的 偏移量核心OpenGL 3.1+甚至不支持客户端顶点存储,因此最后一个参数始终是偏移量。

LWJGL的错误消息措辞很差:

线程“主”中的异常 org.lwjgl.opengl.OpenGLException禁用数组缓冲区对象时无法使用偏移量。

错误消息实际上表示您在致电时绑定了 0* 。LWJGL显然认为,只要没有绑定任何内容,数组缓冲区对象就被 _ “禁用”_ 。那不是
合理,但是它确实使您相信这是可以使用或启用或禁用的状态。它不是。GL_ARRAY_BUFFER``glVertexPointer (...) _
*_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);

如您所见,glVertexPointerLWJGL中存在函数的另一种形式,该形式可以占用未存储在缓冲区对象中的内存,而您在该对象中传递的特化java.nio.Buffer。当没有顶点缓冲区绑定时, _ 就是您期望使用的形式, _ 就是错误消息真正告诉您的。

这说明了您所看到的错误消息的实际含义,而不是原因。

由于某些原因vboVertexHandle,该值似乎为 0 或某些值未glGenBuffers (...)在您的应用程序中使用生成。在您初始化VBO的地方显示代码将是helfpul。



 类似资料:
  • 问题内容: 在编写用于OpenGL库的Matrix类时,我遇到了一个问题,即使用Java数组还是使用Buffer策略存储数据(JOGL为Matrix操作提供直接缓冲区复制)。为了对此进行分析,我编写了一个小型性能测试程序,该程序比较了Arrays vs Buffers和Direct Buffers上循环和批量操作的相对速度。 我想在这里与您分享我的结果(因为我发现它们很有趣)。请随时发表评论和/或

  • 我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个? null

  • 我有一个应用程序,在PHP中使用openssl_encrypt加密文本,方法如下。(使用与“239422AE7940144F”相同的盐和iv值) 密码“abc123”加密提供“xup9pwhcxm5xbkifisxmca==”,解密则返回“abc123”。

  • 我在OpenGL方面有半经验,目前正在为2D游戏开发简单的照明。我的计划如下: 创建一个统一的缓冲区对象,以存储表示场景中所有活动灯光的两个矢量数组:一个用于位置,一个用于颜色 在我的顶点着色器中将该均匀缓冲区对象作为均匀对象(显然)。以某种方式转换数据,并将其复制到与统一格式相同的输出接口块(抱歉,如果这是混淆/不正确的术语,请不要犹豫要求澄清) 使用顶点着色器输出的界面块作为片段着色器的输入,

  • 我目前的方法是用所有粒子填充一个数组(称为vertexData),这样数组的结构将是:[particle,particle,particle,...],其中每个粒子都有上面给出的布局。 我的计划是简单地将初始信息提供给顶点着色器,然后让它根据初始信息计算位置偏移量和颜色。我希望大多数的计算是在GPU上完成的。 我想通过将所有数据放在一个缓冲区对象中来传递数据到着色器,然后使用偏移量来获取正确的值来

  • 在Android上,我试图对相机帧执行一些OpenGL处理,在相机预览中显示这些帧,然后将这些帧编码为视频文件。我试图用OpenGL做这件事,使用GLSurfaceView和GLSurfaceView。渲染器和FFMPEG用于视频编码。 我已经使用着色器成功地处理了图像帧。现在我需要将处理后的帧编码为视频。这是一个表面视图。渲染器提供onDrawFrame(GL10..)方法正是在这种方法中,我尝