Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:43

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Viele Punkte zeichnen
BeitragVerfasst: Mo Mai 21, 2007 13:18 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Hallo,

ich möchte in meinem Programm mehrere hunderttausende Punkte zeichnen können. Bisher löse ich das Problem über eine DisplayList:

Code:
  1. GLuint DisplayWidget::makePointCloud()
  2.     GLuint list = glGenLists(1); // allocates range number of contiguous display list indices
  3.     glNewList(list, GL_COMPILE); // create new display list
  4.         glPointSize(1); // the size of the points
  5.         glColor3f(0.8f, 0.2f, 0.1f);
  6.  
  7.         // display the points
  8.         glBegin(GL_POINTS);
  9.             foreach(Point* p, pointCloud->getPointList()) {
  10.                 glVertex3f(p->x, -(p->z), p->y);
  11.             } //for
  12.         glEnd();
  13.  
  14.     glEndList(); // end of display list
  15.  
  16.     return list;
  17. } //makePointCloud


Allerdings bricht irgendwann bei einer hohen Anzahl an Punkten ( > 500.000 ) die Performance zusammen. Die Punkte sollen einfach nur dreidimensional dargestellt werden.

Hat jemand einen einfach umzusetzenden Vorschlag, dieses Problem zu lösen?

Vielen Dank!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 14:56 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Meine erste Frage wäre erst einmal... wozu? Eine solche Anzahl von Punkten müssen schon einen trifftigen Grund haben, dass man sie alle auf einmal zeichnen will. Eine halbwegs aktuelle Grafikkarte wird rund 500.000 Partikel gerade so eben mit Ach und Krach auf den Bildschirm bringen. In der Regel braucht man eine solche Anzahl nicht. Du solltest also in jedem Fall prüfen, ob Du wirklich alle brauchst oder sich alle gleichzeitig im Sichtbereich befunden. Um eine solche Optimierung wirst Du vermutlich nicht herum kommen.

Die nächste Frage wäre dann, ob die Punkte rein statisch sind oder sich auch verändern können. Ich denke bei statischen Punkten solltest Du Dir in jedem Fall einmal einen Vertex Buffer Object (VBO) ansehen, da der vermutlich performanter als eine DisplayListe ist - und dabei gar nicht wesentlich komplexer.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Zuletzt geändert von Phobeus am Mo Mai 21, 2007 15:21, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 15:18 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das einfachste und schnellste ist ein Vertexbuffer Object:

Das müsste so ungefähr funktionieren:

Am Anfang:
Code:
  1. glBindBuffer(GL_ARRAY_BUFFER,1);
  2. glBufferData(GL_ARRAY_BUFFER,12 * Count,pointCloud->getPointList()),GL_STATIC_DRAW);
  3. glVertexPointer(3,gl_FLOAT,12,0);


Für jeden Frame:
Code:
  1. glDrawArrays(GL_POINTS,0,Count);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 17:13 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
Phobeus hat geschrieben:
Meine erste Frage wäre erst einmal... wozu? Eine solche Anzahl von Punkten müssen schon einen trifftigen Grund haben, dass man sie alle auf einmal zeichnen will....


Das Programm soll Punktwolken grafisch darstellen und bearbeiten, d.h. clustern und Objekte erkennen. Leider bin ich in OpenGL nicht so gewappnet. Ich habe schon die Befürchtung gehabt, dass die Grafikkarten Probleme damit bekommen würden.

Ich werde versuchen, ob es ausreichend ist, nur eine Stichprobe der Punkte grafisch darzustellen.

Auf jeden Fall danke für die Antwort! Ich werde über die Erfolge berichten...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 17:15 
Offline
DGL Member

Registriert: Di Mär 27, 2007 00:17
Beiträge: 12
LarsMiddendorf hat geschrieben:
Das einfachste und schnellste ist ein Vertexbuffer Object:

Das müsste so ungefähr funktionieren:

Am Anfang:
Code:
  1. glBindBuffer(GL_ARRAY_BUFFER,1);
  2. glBufferData(GL_ARRAY_BUFFER,12 * Count,pointCloud->getPointList()),GL_STATIC_DRAW);
  3. glVertexPointer(3,gl_FLOAT,12,0);


Für jeden Frame:
Code:
  1. glDrawArrays(GL_POINTS,0,Count);


Kann ich den Aufruf innerhalb der DisplayList vornehmen oder fällt die dann weg?

Vielen Dank für die Antwort!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 20:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Die sollte dann wegfallen :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]