如何加载 VBO 并在单独的 Java 线程上渲染它?
How to load VBO and render it on separate Java threads?
为了创建虚拟世界,我使用轻量级 Java 游戏库 (LWJGL) (Java + OpenGL)。我想在工作线程上将我的地形加载到显卡内存中,而在主线程上我想获取这些已经加载的地形并渲染它们。为此,我必须创建顶点数组对象 (VAO),创建顶点缓冲区对象 (VBO),将 VBO 添加到 VAO 属性列表中,最后渲染所有内容。这在单线程系统上工作得很好,但是我在多线程系统上实现它时遇到了问题。我知道 VBO 可以在 OpenGL 上下文之间共享,而 VAO 不能共享 (reference1; reference2)。因此,为了实现我的目标,我:
- 在主线程上创建 VAO,
使用这些方法在 worker tread 上创建 VBO:
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, ID);
int ID = GL15.glGenBuffers();
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, 缓冲区, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
在主线程上渲染它,但是我明白了
异常:
线程中出现异常 "main" org.lwjgl.opengl.OpenGLException:禁用元素数组缓冲区对象时无法使用偏移量
我确定我不会渲染未加载的地形,因为当地形超出渲染范围时我会加载它们。我已经阅读了很多关于 OpenGL 共享上下文和并发的文章、问题和博客,但没有设法找到解决方案。如果有任何帮助,我将不胜感激。
如您所述,VAO 不 在上下文之间共享,因此也不可能从多个线程修改它们。
GL20.glVertexAttribPointer(attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0);
正在修改 VAO 状态,因此必须从主线程调用它。
在单独的线程中上传数据(glBufferData
)是完全没问题的,但是构建 VAO 只能在主线程中完成。
为了创建虚拟世界,我使用轻量级 Java 游戏库 (LWJGL) (Java + OpenGL)。我想在工作线程上将我的地形加载到显卡内存中,而在主线程上我想获取这些已经加载的地形并渲染它们。为此,我必须创建顶点数组对象 (VAO),创建顶点缓冲区对象 (VBO),将 VBO 添加到 VAO 属性列表中,最后渲染所有内容。这在单线程系统上工作得很好,但是我在多线程系统上实现它时遇到了问题。我知道 VBO 可以在 OpenGL 上下文之间共享,而 VAO 不能共享 (reference1; reference2)。因此,为了实现我的目标,我:
- 在主线程上创建 VAO,
使用这些方法在 worker tread 上创建 VBO:
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, ID); int ID = GL15.glGenBuffers(); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, 缓冲区, GL15.GL_STATIC_DRAW); GL20.glVertexAttribPointer(attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
在主线程上渲染它,但是我明白了 异常:
线程中出现异常 "main" org.lwjgl.opengl.OpenGLException:禁用元素数组缓冲区对象时无法使用偏移量
我确定我不会渲染未加载的地形,因为当地形超出渲染范围时我会加载它们。我已经阅读了很多关于 OpenGL 共享上下文和并发的文章、问题和博客,但没有设法找到解决方案。如果有任何帮助,我将不胜感激。
如您所述,VAO 不 在上下文之间共享,因此也不可能从多个线程修改它们。
GL20.glVertexAttribPointer(attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0);
正在修改 VAO 状态,因此必须从主线程调用它。
在单独的线程中上传数据(glBufferData
)是完全没问题的,但是构建 VAO 只能在主线程中完成。