Ich bin relativ neu in OpenGL. Deswegen gleich vorweg mein Hauptproblem:
Ich versuche so etwas ähnliches wie den Desktop zu emulieren. Was ich habe und brauche ist:
orthographische Projektion
mehrere Schichte (z.B. 2): z.B. Hintergrund (entspricht Objekten) und Vordergrund (entspricht Mausselektierbox)
Mein Problem besteht nun im speed. Ich habe auf der untersten Schicht (Hintergrund) zu viele Objekte die jedes mal neu gerendert werden müssen.
Wenn ich eine Selektierbox erstelle mit der Maus, also Klick und drag, muss ich ja den Bildschirm clearen und dann alles neuzeichnen, samt meiner vergrößerten/verkleinerten Box.
Das Problem ist nun, das ich im Hintergrund zu viele Primitive habe (z.B. circles oder lines) mit alpha-blending (können schon über 100.000 werden) und diese selektiert werden müssen. Nun wenn ich meine Maus bewege, dann verändert sich natürlich alles wie geplant nur hängt es, weil die items nicht so schnell gerendert werden.
Ich dachte mir, dieses Problem zu lösen, dass ich nur eine z-Ebene lösche und dann auf dieser z-Ebene meine Mausselektierungsbox zeichne, Hintergrund bleibt fix. Wie kann ich das realisieren?
(Scissortest wird wohl nicht helfen, weil ich oft fast alle Items selektiere).
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Teile deiner Objekte die statisch sind solltest du in eine Displayliste oder VBO packen. Damit solltest du schonmal etwas schneller werden.
Was ich mich gerade frage ist welchen einsatzzweck dein Programm verfolgt. Möchtest du wirklich einen Desktop emulieren (so wie SharpDesk ) oder möchtest du (z.B. für ein Spiel) eine GUI bauen? (Da gibts bei uns schon einige Mitglieder die sowas machen.)
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
yadaddy hat geschrieben:
Ich dachte mir, dieses Problem zu lösen, dass ich nur eine z-Ebene lösche und dann auf dieser z-Ebene meine Mausselektierungsbox zeichne, Hintergrund bleibt fix. Wie kann ich das realisieren?
Soweit ich weiss garnicht.
Du hast nämlich nur 2 Ebenen. Eine die die später angezeigten Pixel (der x,y-Pixel hat die Farbe (z_1,z_2,z_3) ) enthält und eine weitere die die Tiefeninformationen enthält (der x,y-Pixel hat die Tiefe z).
Du könntest aber versuchen den Hintergrund, der bei sowas statisch ist, in eine Textur zu rendern und diese anzuzeigen.
So könntest du Renderarbeit sparen.
Aber Flash hat recht, wir bräuchten etwas mehr Informationen über dein Projekt.
Könntest du einfach mal ein Bild der Anwendung machen und markieren was selektierbar ist etc.?
Also es geht nicht um eine Emulation des Desktops, sondern um statistische Plots.
Das Problem ist, dass ich zu viele Standardprimitiven habe (am umfangreichsten zu rendern natürlich die Kreise unter diesen) und diese mit jedem Mausmove jedes mal neugezeichnet werden. Stell dir vor du hast 3 Ebenen:
Background == die Primitive von oben
2te Schicht == markierte Primitive
3te Schicht == Mausselektierbox.
Mit jeder Mausbewegung muss ich also die unteren 2 Schichten neu rendern, wenn ich Primitive auswählen möchte. V.a. besteht das Problem wenn ich z.B. 10000 Kreise mit Alpha und Radius >= 100px habe.
Ich habe das Problem mit Displaylisten schonmal probiert. Ja es wurde schneller, aber ab einem bestimmten Kreisradius (>=120px z.B.) wars wieder wie vorhin.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
yadaddy hat geschrieben:
Background == die Primitive von oben
Rendere diese einfach als Textur. Dann musst du nur einmal dieses berechnen und kannst es danach einfach nur zeichnen. Musst aber aufpassen, dass deine Grafikkarte entsprechen grosse Texturen unterstützt.
yadaddy hat geschrieben:
2te Schicht == markierte Primitive
Wie markierst du die Primitive? Wenn dein Hintergrund (die Clearcolor) schwarz ist und die Primitive weiss sind könntest du sie mit einem einfachem roten Quadrat und Blending einfärben. So müsstest du nicht alle markierten Primitive neuzeichnen.
Wegen der Geschwindigkeit: Ist eigentlich der Tiefentest an?
Weil er bei geschickter Sortierung unnötig ist und nur Leistung kostet.
Ich könnte mir das mit den grösseren Radien so erklären.
Weil bei mehr Punkten jetzt überprüft werden muss ob er gerendert werden darf.
Gibt es da einen Unterschied, ob ich den Background als Textur oder Displayliste speichere und dann rendere?
Das einzige Problem bei der Textur wäre ja, dass ihre größe eine 2er Potenz sein muss, bei mir ist das Window flexibel groß, kann also zusätzlich Zeit verbraten beim Speichern.
@ 2te Schicht: Das ist so. Ich brauche das Schichtensystem, d.h. ich muss Background und 2te Schicht gespeichert haben.
i.A. ist das was ich oben erzählt habe nur ein Sonderfall. Es soll abstrakt mit n Schichten funktionieren können. Die Anwendung, die ich gerade mache, braucht nur 3.
Deswegen muss ich wohl die einzelnen Schichten gleichartig behandeln und nicht fallspezifisch in der Anwendung.
Gibt es dann einen Unterschied ob ich die Schichten als Texturen speichere und dann lade oder lieber als Displaylisten? (Ich denke Texturen sind doch eher für komplexere Objekte spezifiziert und nicht für solche Primitive)
Der Hintergrund wird wohl auch oft nacheinander verändert werden müssen, also schnelle Speicherung und Laden notwendig, so dass immernoch ein sichtbarer Renderfluß existiert.
Registriert: Sa Nov 13, 2004 11:00 Beiträge: 229 Wohnort: Steinhude
wenn du wirklich 10000 kreise mit je Radius >100pixel hast würde ich mal davon ausgehen, dassdir irgendwo dann die Füllrate nen strich durch die rechnung macht, insofern ist das nicht alllzu verwunderlich wenn DLs oder VBOs nicht mehr soviel bringen
Ich würde dazu wie schon erwähnt wirklich alles, was in irgendeinerweise statisch ist zusammen auf eine (oder auf einige wenige) textur rendern, um overdraw einzusparen.
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.