Um eine virtuelle Welt zu erstellen, verwende ich Lightweight Java Game Library (LWJGL) (Java + OpenGL). Ich möchte meine Terrains in den Grafikkartenspeicher des Worker-Threads laden, während ich im Hauptthread diese bereits geladenen Terrains aufnehmen und rendern möchte. Um das zu tun, muss ich Vertex Array Objekt (VAO) erstellen, Vertex Buffer Object (VBO) erstellen, VBO in die VAO-Attributliste aufnehmen und schließlich alles rendern. Dies funktioniert perfekt auf Single-Thread-System, aber ich habe Probleme bei der Implementierung auf Multi-Thread-System. Ich weiß, dass VBO zwischen OpenGL-Kontexten geteilt werden kann, während VAO nicht freigegeben werden kann (reference1; reference2). Deshalb mein Ziel zu erreichen I:Wie Laden von VBO und Rendern auf separaten Java-Threads?
- VAO erstellen, die auf Hauptthread,
schaffen VBO auf Arbeiter Lauffläche durch den Einsatz dieser Methoden:
GL15.glBindBuffer (GL15.GL_ARRAY_BUFFER, ID); int ID = GL15.glGenBuffers(); GL15.glBufferData (GL15.GL_ARRAY_BUFFER, Puffer, GL15.GL_STATIC_DRAW); GL20.glVertexAttribPointer (attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0); GL15.glBindBuffer (GL15.GL_ARRAY_BUFFER, 0);
es auf Hauptthread machen, jedoch bekomme ich diese Ausnahme:
Exception in thread "main" org.lwjgl.opengl.OpenGLException: Kann nicht Offsets verwenden, wenn Element Array Buffer Objekt deaktiviert ist
Ich bin mir sicher, dass ich nicht geladene Terrains nicht rendern, weil ich Terrains lade, wenn sie außerhalb des Renderbereichs liegen. Ich habe viele Artikel, Fragen und Blogs über freigegebene OpenGL-Kontexte und Nebenläufigkeit gelesen, aber es ist mir nicht gelungen, eine Lösung zu finden. Ich wäre sehr dankbar für jede Hilfe.
Wir brauchen mehr Code, vor allem 1 und 3 – elect