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

Aktuelle Zeit: Fr Jul 18, 2025 17:00

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Aug 02, 2007 19:56 
Offline
DGL Member

Registriert: Do Aug 02, 2007 14:22
Beiträge: 2
Hallo ich hab folgendes Problem:

Ich möchte eine hohe Anzahl von Figuren(können ca. 20Mio. sein) mit der Hilfe von OpenGL zeichen.

Es handelt sich hauptsächlich um Rechtecke sowie andere Primitive und zudem sind meine Koordinaten zunächst nur in 2D.

Ich habe bis jetzt mit Vertex-Array gearbeitet.


Kennt sich jemand damit aus, wie ich schon zeichnen kann während ich noch meine restlichen Daten auslese?(Also damit schon etwas zu sehen ist während der Vorgang noch läuft) Welche Buffer müssen/dürfen da gelöscht werden?


Gibt es eine Möglichkeit (vll. unter Nutzung von Buffern?), die schneller ist als Vertexarrays?


Hat jemand Erfahrung mit "hochdimensionalen" Problemen und der damit zusammenhängenden Performance-Problematik?

Und wie kann ich raus finden, ob ein Pixel des Bildschirms schon eingefärbt ist und nicht noch mal gezeichnet werden muss?


Viele Fragen, ich hoffe, dass mir der ein oder andere helfen kann.


Conny


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 02, 2007 20:58 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Problem mit dem "Ist Bildschirm schon gefüllt" kannst du per Depth test regeln. Du sagst alle Objekte sind in 2D Koordinaten? Dann benutz statt glVertex2i (wie mans eigentlich bei 2D machen würde) bewußt glVertex2i und setze z auf 0. (Wobei eigentlich glVertex2i das auch tun sollte). Wenn der Tiefentest als Funktion GL_LESS hat, dann werden nur die Fragmente weiterverarbeitet die an einer leeren Stelle stehen.

SIehe dazu Wiki Tiefentest.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 02, 2007 21:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mal eine ganz wichtige Frage vorweg. Was hast du dem Daten vor? Sollen die Ansicht verändert werden können? Also Scrollen, Zoomen etc. Weil wenn ja wird es richtig kompliziert, denn 20 Mio Rechtecke auf Grafikkarten die Teilweise nur 60-100 Mio Dreiecke pro Sekunde schaffen und flüssige Animationen heben sich da schon Gegenseitig auf.

Ansonsten kann ich dir nur zu VertexBufferObjects raten. Damit kannst du einen Speicherbereich auf der Grafikkarte anfordern in den du deine Daten packen kannst. Wenn du sagen wir mal VBOs mit einer ungefähren größe von 0.5-2 MB benutzt dann kannst du diese nach und nach befüllen und könntest so nach und nach alle Daten auf den Schirm bringen. VBOs sind wohl für solche Datenmengen unablässlich. Evtl auch Displaylisten die auch auf VBOs zugreifen. Aber das Erstellen der DLs könnte länger dauern als nur einen Speicherbereich in einen anderen kippen.

Das Laden würde ich in einem anderen Thread machen. Der würde die Daten laden und wenn ein Teilstück mit der entsprechenden Größe fertig ist dann würde ich das in ein VBO Laden und es beim Darstellen mit berücksichtigen. Aber WICHTIG. OpenGL ist Threadgebunden und du musst das Teilstück synchron an den VCL Thread übergeben und dort das VBO erstellen. So würdest du schon mal das Laden vom Darstellen trennen.

Aber wie oben schon erwähnt. Das ist keine Kleinigkeit und dürfte genügend Karten an deren physische Grenzen bringen. Von daher wäre es besser wenn du redundante Informationen gar nicht erst berücksichtigen würdest. Und das nach möglichkeit schon außerhalb von OpenGL. denn selbst wenn man durch den Tiefentest einiges an Zeit spart. Am Meisten sparrt man wenn diese arbeit gar nicht erst tun muss. ;) Wenn sich deinen Ansicht nicht verändert könntest du auch einen Tiefentest außerhalb programmieren. Also simpel ein Speicherbereich der X*Y Pixel groß ist und dann pro Pixel 1 Byte. Ist zwar nicht gerade Speicherschonend aber Schneller als Bitschubserrei. Wenn das Byte dann gesetzt ist wurde dort schon ein Element gezeichnet ansonsten nicht. Ist zwar etwas umständlich aber das wäre der einfachste Weg die Datenmenge zu reduzieren und das würde die Darstellung entlasten. Das solltest du aber wohl nur in Betracht ziehen wenn die Elemente nur 1 oder wenige Pixel groß sind und das nur ein Mal gemacht wird. Ansonsten hast du dabei mal gar keine Vorteile mehr. Dann könnte man auch einfacher eben alles Darstellen.

PS: Das "zunächst nur in 2D" bereitet mir im übrigen leichte Sorgen. Falls du später noch Anderes damit vor hast solltest du dir jetzt schon mal überlegen was das genau sein könnte. Denn wenn du es Später noch drehen möchtest werden dir die jetzigen Vorschläge wohl teilweise nur bedingt bis gar nicht helfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 02, 2007 22:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich kann mir sogar vorstellen, dass es in 3D leichter ist. Wenn du die Daten in 3D hast kannst du mittels Quad/Octrees einige Daten wegrationalisieren.

Wobei... das könnte auch in 2D schon helfen. Unterteil deine Datenmenge einfach in räumliche Abschnitte (Boxen). Teste einfach ob eine Box überhaupt zu sehen ist, wenn nein kannst du sie weglassen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 02, 2007 22:11 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
SInd die 20mio alle gleichzeitig sichtbar, oder kannst du einen teil davon einfach mithilfe von AABBs weglassen?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 03, 2007 07:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo conny,

20 Mio Figuren sind recht viel (wenn man bedenkt, dass auf dem Bildschirm grade mal 1 bis 2 Millionen Pixel angezeigt werden). Vielleicht solltest du mit anderen Techniken wie z.B. Octrees oder LOD (Level of Detail) arbeiten...

Viele Grüße
dj3hut1


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 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]