ich hab einige Objekte, die dich mehrfach an verschidenen Stellen zeichnen will. Das relisieren ich mit Pushmatrix und Popmatrix. Nun frage ich mich allerdings, ob ich immer alle Befehle zum Zeichnen neu aufrufen muss, oder ob ich Nicht einfach ein Objekt kopieren kann und dann Verschieben...
Zudem suche ich eine gute Möglichkeit Objekte zu speichern. Bin dabei auf XGL gestoßen... kennt jemand noch andere Alternativen???
Du suchst wahrscheinlich nach Displaylisten. Das dürfte das passende sein. Such malim Wiki nach glNewList und glEndlist. Mit diesen Befehlen kannst du eine Displayliste anlegen. Wenn du dann später das Objekt zeichnen willst, musst du nur noch die Displayliste mit glCallLists aufrufen
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Ich hatte die Option der Displaylists auch schon gesehen. War mir aber nicht sicher, ob das das Richtige ist oder ob es da noch andere Wege gibt.
Was ich machen möchte ist moglichst unkompliziert aus einer Datei ein Element zu laden, dieses mehrfach kopieren und dann an die Stellen schieben an denen ich diese benötige...
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wieso willst du ein Objekt denn überhaupt kopieren?
Es ist nicht ungewöhnlich in einem Programm 200 Einheiten mit einem "Objekt" zu rendern. Was für ein "Objekt" ist es denn? Hast du ein 3DS File geladen, oder irgend ein anderes File?
Displaylisten sind dann sinnvoll, wenn das Objekt eine Gewisse komplexität aufweist und wenn es mehrfach gerendert werden soll.
Das Positionieren musst du aber in jedemfall für jedes Objekt einzeln vornehmen. Aber das ist je eigentlich kein Problem, oder?
Ich denke es handelt sich hier vielleicht um ein missverständniss bezüglich desr Funktionsweise von OpenGL. Erzähl mal noch ein bischen was, wie du dir die Funktionsweise deines Proggs vorstellst. Eventuell ist es nur ein kleiner Denkfehler.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Also, ich bin gelernter Tischler und will in OpenGL Erzeugnisse wie Schränke und Treppen darstellen. Die Elemente (Verbindungsmittel wie Schrauben, Hülsen oder Winkel), die ich jetzt laden will, sind recht einfache Elemente die dafür auch bis zu 50 mal vorkommen können.
Da sind im Prinzig 2 Fragen:
1.: Sollte ich jedes mal zwischen Pushmatrix und Popmatrix die Procedure ZeichneSchraube aufrufen oder gibt es eine Möglichkeit dieses Element zu kopieren?
2.: Ich will die Elemente zur Laufzeit laden können. Ich könnte nun die ganzen Punkte, Normalen, etc. in eine XML-Dateischreiben, aber bevor ich das anfange, würde ich gerne wissen ob es das nicht was einfacheres in der art von blockread gibt???
Hehe... Also du kannst in OpenGL nicht direkt sagen, dass das, was du als nächstes renderst, zu einem bestimmten Objekt gehört. Indirekt geht das jedoch sehr wohl und auch deutlich performanter Du suchst also aktuell 2 Dinge:
Eine Möglichkeit, gezeichnete Objekte (Sprich: Dreiecke) wieder zu verwenden
Ein verbreitetes Dateiformat mitsamst Loader
Nun, ersteres kannst du wohl vergessen. Du musst das anders angehen. Und zwar so:
Erstelle eine Displayliste und rendere dann deinen Tisch z.B.. Dann schließt du die Displayliste wieder und somit ist dann das Objekt auf der Graphikkarte im Videospeicher gesichert. Du kannst es dann mit glCallList(name) (iirc) wieder aufrufen und OpenGL wird dann die ganzen OpenGL-Befehle, die in der Liste vorkommen, erneut ausführen. Was zu dem Ergebnis führt, dass du dein Objekt erneut zeichnen lässt Wenn du vorher mit Translate bzw. Rotate oder direkte Matrrixmanipulation die "Einfüge"-Position verändert hast, erscheint dein zweiter Tisch dementsprechend woanders. Und siehe da... Du hast den ersten Tisch kopiert
Zum zweiten Punkt: Ich nehme nicht an, dass du animierte Tische brauchst. Von daher wird dir das 3DS-Format vielleicht weiterhelfen. Es existiert dazu auch eine Handvoll Loader. Einer der besseren lässt sich auch hier im Forum finden. Er stammt von noeska. In das 3DS-Format kannst du eigentlich in allen gängigen Modellern exportieren. Mir fällt jetzt auf Anhieb keiner ein, mit dem das nicht ginge
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Zitat:
1.: Sollte ich jedes mal zwischen Pushmatrix und Popmatrix die Procedure ZeichneSchraube aufrufen oder gibt es eine Möglichkeit dieses Element zu kopieren?
Rein vom Prinzip her: Ja!
Das man in der Praxis statt "rendereTisch" auch eine Displayliste nehmen kann, ändert an der Struktur des Aufrufs eigentlich nichts.
Mal etwas zur grundlegenden Funktion:
Zeitaufwendig ist nicht der x-te aufruf einer Zeichenfunktion. Zeitaufwenidg ist es, wenn die Zeichenfunktion jedesmal Daten über den Bus an die GraKa schickt. Displaylisten werden einmal übertragen und im GraKa-Speicher gehalten. Somit entfällt der Zeitaufwendige-Übertragungsprozess.
Etwas anderes bei dir kostet aber auch Zeit: glPush/glPopMatrix. Die sind verhältnismäßifg teuer. Als optimierung kann man einfach die gemachten verschiebe und rotationsoperationen in Gegengesetzter Richtung und Reihenfolge ausführen. Das sind zwar mehr befehle, aber mitunter weniger Zeitaufwendige als die Matrix zu sichern und zu restaurieren.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich muss da gerade auch noch meinen Senf dazu geben.
DisplayListen liegen nicht immer in Speicher. Die Grafikkarte muss das unterstützen sonst gehts natürlich nicht. Die Listen funktionieren dennoch aber in diesem Falle puffert der Treiber alles und überträgt es dann die Karte. Dabei entfällt dann aber immer noch die Aufrufe von OpenGL. Das ist ja inter gepuffert.
Ja danke erst mal für die Hilfe. werde mich nun wohl erst mal mit dem Laden bzw. Speichern der Objekte befassen und dann mal schauen, ob mit displaylisten, popmatrix, etc.
Getreu dem Motto:
***FIRST MAKE IT RUN: THEN MAKE IT BETTER***
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja das wird wohl das beste sein. Dadurch hast du dann auch schon ein Gefühl wie das mit dem OpenGL so richtig geht. Ich hab anfangs auch paar Tage gebraucht um dieses Statemaschine-AndauerndRendern-Dings zu verstehen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.