Frage

Ich arbeite an einem einfachen CAD-Programm, das OpenGL verwendet On-Screen-Rendering zu handhaben. Jede Form auf dem Bildschirm gezeichnet wird, vollständig aus einfachen Liniensegmenten aufgebaut, so dass selbst eine einfache Zeichnung endet Tausende von einzelnen Linien zu verarbeiten.

Was ist der beste Weg, Änderungen in dieser Sammlung von Linien zwischen meiner Anwendung und OpenGL zu kommunizieren? Gibt es eine Möglichkeit nur eine bestimmte Teilmenge der Zeilen in dem OpenGL Puffer zu aktualisieren?

Ich suche eine konzeptionelle Antwort hier. Keine Notwendigkeit, in den eigentlichen Quellcode zu erhalten, nur einige Empfehlungen zur Datenstruktur und Kommunikation.

War es hilfreich?

Lösung

Sie können einen einfachen Ansatz verwenden, wie zum Beispiel einer Anzeigeliste mit (glNewList / glEndList)

Die andere Option, die etwas komplizierter ist, ist Vertex Buffer Objects (VBOs - GL_ARB_vertex_buffer_object) zu verwenden. Sie haben den Vorteil, dass sie sich dynamisch während einer Anzeigeliste geändert werden kann, kann es nicht.

Diese im Grunde Batch alle Ihre Daten / Transformationen und sie auf der GPU ausgeführt werden (vorausgesetzt, Sie Hardwarebeschleunigung verwenden) in höherer Leistung führen.

Andere Tipps

Vertex Buffer Objects sind wahrscheinlich das, was Sie wollen. Sobald Sie die Originaldaten in Set laden, können Sie Änderungen an bestehenden Chunks mit glBufferSubData() machen.

Wenn Sie zusätzliche Liniensegmente hinzuzufügen und die Größe des Pufferüberlauf, werden Sie natürlich müssen einen neuen Puffer machen, aber das ist nicht anders als mit einem neuen, größeren Speicherblock in der C zuzuordnen, wenn etwas wächst.

EDIT: Ein paar Hinweise zur Anzeigelisten, und warum sie nicht zu verwenden:

  1. In OpenGL 3.0, Displaylisten sind veraltet, sich so verwendet, ist nicht aufwärtskompatibel Vergangenheit 3.0 (2.1 Implementierungen werden für eine Weile herum, natürlich, so dass je nach Zielgruppe dies kein Problem sein könnte)
  2. Wenn Sie etwas ändern, müssen Sie die gesamte Anzeigeliste neu zu erstellen, die den gesamten Zweck der Anzeigelisten besiegt, wenn die Dinge oft geändert werden.

Nicht sicher, ob Sie dies bereits tun, aber es lohnt Sie erwähnen sollten versuchen GL_LINE_STRIP statt einzelner GL_LINES zu verwenden, wenn möglich, die Menge von Vertex-Daten zu reduzieren, um die Karte gesendet werden.

Mein Vorschlag ist, zu versuchen, einen Szenengraph verwenden, eine Art von hierarchischer Datenstruktur für die Linien / Kurven. Wenn Sie große Modelle haben, wird die Leistung beeinträchtigt werden, wenn Sie einfache Liste von Linien haben. Mit einer Grafik / Baumstruktur können Sie leicht prüfen, welche Elemente sichtbar sind und welche nicht durch Begrenzungsvolumen verwendet wird. Auch mit einem Szenengraphen können Sie Transformation leicht anwenden und Wiederverwendung Geometrien.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top