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

要创建一个虚拟世界,我使用轻量级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,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:禁用Element Array Buffer Object时的偏移量

    我确信我不会渲染未加载的地形,因为我在渲染范围之外时加载地形。 我已经阅读了许多关于OpenGL共享上下文和并发性的文章,问题和博客,但没有设法找到解决方案。 我会非常感谢任何帮助。


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

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

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

    将数据上传( glBufferData )放在单独的线程中是完全正确的,但只能通过主线程来构建VAO。

    链接地址: http://www.djcxy.com/p/38497.html

    上一篇: How to load VBO and render it on separate Java threads?

    下一篇: SDL2 / Opengl3 can't display anything