如何加载 VBO 并将其呈现在单独的 Java 线程上?

Posted

技术标签:

【中文标题】如何加载 VBO 并将其呈现在单独的 Java 线程上?【英文标题】:How to load VBO and render it on separate Java threads? 【发布时间】:2016-08-23 08:17:00 【问题描述】:

为了创建一个虚拟世界,我使用轻量级 Java 游戏库 (LWJGL) (Java + OpenGL)。我想在工作线程上将我的地形加载到显卡内存中,而在主线程上我想获取这些已经加载的地形并渲染它们。为此,我必须创建顶点数组对象 (VAO),创建顶点缓冲区对象 (VBO),将 VBO 添加到 VAO 属性列表中,最后渲染所有内容。这在单线程系统上完美运行,但是我在多线程系统上实现它时遇到问题。我知道 VBO 可以在 OpenGL 上下文之间共享,而 VAO 不能共享(reference1;reference2)。因此,为了实现我的目标,我:

    在主线程上创建 VAO,

    使用这些方法在工人踏板上创建 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 共享上下文和并发的文章、问题和博客,但没有找到解决方案。如果有任何帮助,我将不胜感激。

【问题讨论】:

我们需要更多的代码,尤其是1和3 【参考方案1】:

正如您已经说过的,VAO 在上下文之间共享,因此也不可能从多个线程中修改它们。

GL20.glVertexAttribPointer(attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0); 

正在修改VAO状态,因此必须从主线程调用。

在单独的线程中上传数据(glBufferData)是完全可以的,但是构建 VAO 只能在主线程中完成。

【讨论】:

看来你是对的。但是我不得不重建我所有的代码,并且我得到了一些其他的错误(希望是不相关的)。处理完这些错误后,我会立即接受您的回答。谢谢。

以上是关于如何加载 VBO 并将其呈现在单独的 Java 线程上?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenGL 3.x VBO 渲染动态世界?

OpenGL ES:一个 VBO - 几个精灵 - 每个单独翻译

Android OpenGL ES2 一个 VBO 的许多纹理

如何将多个纹理应用于立方体的 VBO?

Java Intellij Idea如何添加装订线图标?

如何强制视图呈现自己?