2008-12-01 7 views
6

Je travaille sur un programme de CAO simple qui utilise OpenGL pour gérer le rendu à l'écran. Chaque forme dessinée à l'écran est entièrement construite à partir de simples segments de ligne, de sorte que même un dessin simple finit par traiter des milliers de lignes individuelles.Quel est le moyen le plus efficace de gérer un grand nombre de lignes dans OpenGL?

Quelle est la meilleure façon de communiquer les changements dans cette collection de lignes entre mon application et OpenGL? Est-il possible de mettre à jour seulement un certain sous-ensemble des lignes dans les tampons OpenGL?

Je cherche une réponse conceptuelle ici. Pas besoin d'entrer dans le code source actuel, juste quelques recommandations sur la structure des données et la communication.

Répondre

8

Vous pouvez utiliser une approche simple, comme l'aide d'une liste d'affichage (glNewList/glEndList)

L'autre option, qui est un peu plus compliqué, est d'utiliser des objets vertex buffer (VBO - GL_ARB_vertex_buffer_object). Ils ont l'avantage de pouvoir être changés dynamiquement, contrairement à une liste d'affichage. Ils traitent toutes vos données/transformations par lots et les exécutent sur le GPU (en supposant que vous utilisez l'accélération matérielle), ce qui améliore les performances.

7

Vertex Buffer Les objets sont probablement ce que vous voulez. Une fois que vous avez chargé l'ensemble de données d'origine, vous pouvez apporter des modifications aux blocs existants avec glBufferSubData(). Si vous ajoutez des segments de ligne supplémentaires et débordez la taille de votre tampon, vous devrez bien sûr créer un nouveau tampon, mais ce n'est pas différent d'avoir à allouer un nouveau morceau de mémoire plus grand en C quand quelque chose se développe .

EDIT: Quelques notes sur les listes d'affichage, et pourquoi ne pas les utiliser:

  1. OpenGL 3.0, les listes d'affichage sont déconseillés, donc les utiliser est 3.0 passé en avant-compatibles (2.1 implémentations Cela peut ne pas être un problème en fonction de votre public cible)
  2. Chaque fois que vous modifiez quelque chose, vous devez reconstruire toute la liste d'affichage, ce qui va à l'encontre de l'objectif des listes d'affichage. sont souvent changés.
2

Vous ne savez pas si c'est déjà fait, mais vous devriez essayer d'utiliser GL_LINE_STRIP au lieu de GL_LINES individuels si possible pour réduire la quantité de données vertex envoyées à la carte.

+0

Merci pour le pourboire! –

2

Ma suggestion est d'essayer d'utiliser un graphe de scène, une sorte de structure de données hiérarchique pour les lignes/courbes. Si vous avez d'énormes modèles, les performances seront affectées si vous avez une liste simple de lignes. Avec une structure graphique/arborescente, vous pouvez facilement vérifier quels éléments sont visibles et lesquels ne le sont pas en utilisant des volumes englobants. De plus, avec un SceneGraph, vous pouvez facilement appliquer la transformation et réutiliser les géométries.

Questions connexes