2016-04-28 11 views
0

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?

  1. VAO erstellen, die auf Hauptthread,
  2. 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);

  3. 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.

+1

Wir brauchen mehr Code, vor allem 1 und 3 – elect

Antwort

2

Wie bereits erwähnt, sind VAOs NICHT zwischen Kontexten freigegeben, so dass es auch unmöglich ist, sie aus mehreren Threads zu modifizieren.

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

modifiziert den VAO-Zustand, daher muss er vom Haupt-Thread aufgerufen werden.

Es ist vollkommen in Ordnung, die Daten in einen separaten Thread hochzuladen (glBufferData), aber das Erstellen des VAO kann nur vom Hauptthread aus erfolgen.

+0

Es scheint, dass Sie Recht haben. Allerdings musste ich meinen ganzen Code rekonstruieren und ich bekomme nur wenige andere Fehler (hoffentlich nicht verwandt). Ich werde Ihre Antwort akzeptieren, sobald ich mit diesen Fehlern fertig bin. Vielen Dank. – Fataho