gpt4 book ai didi

java - 如何加载 VBO 并在单独的 Java 线程上渲染它?

转载 作者:行者123 更新时间:2023-12-02 03:40:09 25 4
gpt4 key购买 nike

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

  1. 在主线程上创建 VAO,
  2. 使用以下方法在工作线程上创建 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);

  3. 在主线程上渲染它,但是我得到了这个异常(exception):

线程“main”org.lwjgl.opengl.OpenGLException中出现异常:禁用元素数组缓冲区对象时无法使用偏移

我确信我不会渲染未加载的地形,因为我在地形超出渲染范围时加载地形。我读过很多关于 OpenGL 共享上下文和并发的文章、问题和博客,但没有找到解决方案。我将非常感谢任何帮助。

最佳答案

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

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

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

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

关于java - 如何加载 VBO 并在单独的 Java 线程上渲染它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36916826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com