2008-12-01 13 views
6

Pracuję nad prostym programem CAD, który wykorzystuje OpenGL do obsługi renderowania na ekranie. Każdy kształt narysowany na ekranie jest zbudowany w całości z prostych odcinków linii, więc nawet prosty rysunek kończy przetwarzanie tysięcy pojedynczych linii.Jaki jest najskuteczniejszy sposób zarządzania dużym zestawem linii w OpenGL?

Jaki jest najlepszy sposób przekazywania zmian w tym zbiorze linii między moją aplikacją a OpenGL? Czy istnieje sposób aktualizacji tylko niektórych podzbiorów linii w buforach OpenGL?

Poszukuję tutaj konceptualnej odpowiedzi. Nie trzeba wchodzić w rzeczywisty kod źródłowy, tylko niektóre zalecenia dotyczące struktury danych i komunikacji.

Odpowiedz

8

Można użyć prostego podejścia, takie jak na podstawie listy wyświetlania (glNewList/glEndList)

Inną opcją, która jest nieco bardziej skomplikowana, jest użycie Vertex Buffer Objects (VBOs - GL_ARB_vertex_buffer_object). Mają tę przewagę, że można je zmieniać dynamicznie, a lista wyświetlania nie.

Te zasadniczo wsadowo wszystkie dane/transformacje są wykonywane i wykonywane na GPU (zakładając, że używasz akceleracji sprzętowej), co daje wyższą wydajność.

7

Obiekty bufora wierzchołków są prawdopodobnie tym, czego potrzebujesz. Po załadowaniu oryginalnego zestawu danych można wprowadzać modyfikacje istniejących porcji za pomocą glBufferSubData().

Jeśli dodasz dodatkowe segmenty linii i przepełnisz rozmiar bufora, będziesz musiał oczywiście utworzyć nowy bufor, ale nie różni się to od konieczności przydzielania nowego, większego fragmentu pamięci w C, gdy coś rośnie .

EDIT: Kilka uwag na listach wyświetlania, i dlatego nie należy ich użyć:

  1. W OpenGL 3.0, listy są już nieaktualne, więc ich użyciu nie jest kompatybilne z przeszłości naprzód 3.0 (2.1 implementacje będzie na jakiś czas, oczywiście, więc w zależności od grupy docelowej może to nie być problem)
  2. Zawsze, gdy coś zmienisz, musisz przebudować całą listę wyświetlania, która pokonuje cały cel list wyświetlania, jeśli rzeczy są często zmieniane.
2

Nie jestem pewien, czy już to robisz, ale warto wspomnieć, że jeśli to możliwe, spróbuj użyć GL_LINE_STRIP zamiast pojedynczego GL_LINES, aby zmniejszyć ilość danych werteksów przesyłanych na kartę.

+0

Dziękuję za napiwek! –

2

Moja sugestia to próba użycia wykresu sceny, jakiejś hierarchicznej struktury danych dla linii/krzywych. Jeśli masz duże modele, wydajność będzie miała wpływ, jeśli masz zwykłą listę linii. Dzięki strukturze wykresu/drzewa można łatwo sprawdzić, które elementy są widoczne, a które nie za pomocą ograniczających objętości. Również w scenegrafie możesz łatwo zastosować transformację i ponownie użyć geometrii.

Powiązane problemy