我不断收到此异常:
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调用之前两行(错误所在的那一行),那么我显然在启用数组缓冲区!
怎么了
您需要知道该glVertexPointer
命令使用绑定到的GL_ARRAY_BUFFER
对象(“数组缓冲区对象”)作为其内存源(从OpenGL
1.5开始)。
在某些版本的OpenGL(兼容1.5-3.0和3.1+)中,如果您将 0
绑定到GL_ARRAY_BUFFER
,则最后一个参数glVertexPointer
是实际 指向 _ 程序 内存(客户端内存)的
_指针
,而不是GPU内存(服务器内存)的 偏移量 。 核心OpenGL 3.1+甚至不支持客户端顶点存储,因此最后一个参数始终是偏移量。
线程“主”中的异常 org.lwjgl.opengl.OpenGLException : 禁用数组缓冲区对象时无法使用偏移量。
错误消息实际上表示您在致电时绑定了 0* 。LWJGL显然认为,只要没有绑定任何内容,数组缓冲区对象就被 _ “禁用”_ 。那不是 太
合理,但是它确实使您相信这是可以使用或启用或禁用的状态。它不是。GL_ARRAY_BUFFER``glVertexPointer (...)
_ *_GL_ARRAY_BUFFER
__glEnable``glDisable
还记得当您有绑定对象时,我如何将最后一个参数描述glVertexPointer
为
偏移量GL_ARRAY_BUFFER
?由于LWJGL基于Java,因此无法将任意内存地址作为整数传递。传递给的整数值glVertexPointer (...)
必须 是当前绑定的顶点缓冲区的内存中的偏移量。
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
,该值似乎为 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..)方法正是在这种方法中,我尝