Registriert: Do Jun 18, 2009 07:17 Beiträge: 44 Wohnort: Gießen/Hessen
Hallo,
ich suche schon eine Weile nach der Antwort, konnte aber nichts finden, obwohl mir die Frage
trivial erscheint.
Frage: Wie heißt die Funktion mit der man bestimmen kann welche Matrix gerade aktiv ist. Oder noch
besser, die Namen der Funktionen für die Werte aller wichtigen Parameter im OpenGL Ressouce-Kontext, also Farbe, Linienstärke, etc...
Gruß Andreas
_________________ Gruß Andreas (aka DeepCopy) - Sic Luceat Lux
Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.
Die aktuelle ModelviewMatrix bekommst du beispielsweise mit:
Code:
glGetFloatv(GL_MODELVIEW_MATRIX, @matrix);
(ich hab solange kein Delphi mehr benutzt, also @matrix soll ein Pointer auf ein Array aus 16 Floats (="Single") sein.)
Edit:
Also die Matrix auslesen macht in einigen Fällen durchaus Sinn. Für ein auslesen der Linienstärke sehe ich im Augenblick keine sinnvolle Anwendung, was nicht heißen muss das es keine gibt. Falls du nicht sicher bist welche Linienstärke gerade gesetzt ist, ist es wahrscheinlich besser diese einfach neu zu setzen.
Registriert: Do Jun 18, 2009 07:17 Beiträge: 44 Wohnort: Gießen/Hessen
@coolcat
danke für deine Antwort, aber meine Frage lautete in erster Linie (vielleicht habe ich da auch falsch ausgedrückt) wie bestimme ich welche Matrix gerade Aktiv ist, also GL_MODELVIEW, GL_TEXTURE etc.., und das werde ich an den Rohdaten der Matrizen nicht (immer) feststellen können.
Das Andere werde ich dennoch brauchen können, thx.
Gruß Andreas
_________________ Gruß Andreas (aka DeepCopy) - Sic Luceat Lux
Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.
Registriert: Do Jun 18, 2009 07:17 Beiträge: 44 Wohnort: Gießen/Hessen
Jo, jetzt hab ich's verstanden!
Big THX
Gruß
Andreas
_________________ Gruß Andreas (aka DeepCopy) - Sic Luceat Lux
Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.
Blöde Frage, aber wofür benötigst du das? Da Abfragen ungefähr genauso schnell sein dürfte wie neu setzen, würde ich immer dann wenn du nicht sicher bist in welchem Modus du bist einfach immer den Matrix-Modus neu setzen. Es ist nur selten sinnvoll ein eigenes State-System um das State-System von OpenGL herum zu bauen.
Einzig sinnvolle Anwendung ist vielleicht ein rücksetzen auf den vorherigen Zustand. Aber selbst da würde ich einfach immer den Modus neusetzen. Das erhöht die Lesbarkeit des Quellcodes und ist weniger fehleranfällig.
Registriert: Do Jun 18, 2009 07:17 Beiträge: 44 Wohnort: Gießen/Hessen
Hallo CoolCat,
Zu deiner Frage: Ich schreibe gerade eine OGL-Hilfs-Library für mich, in der verschiedene Objekte vorgefertigt vorhanden sein sollen, wie zum Beispiel ein Hilfsgrid, das eine bel. Ebene sichbar machen
soll. Oder Mausunterstüzung für die Rotation. Ich dachte ich erhöhe die Sicherheit durch "Desgin by Contract" in dem jede aufgerufene Funktion sicherstellt das der übergebene Zustand vor der Beendigung der Funktion wiederhergestellt wird.
So ich werde jetzt zur Entspannung und kreativen Erbauung, ein wenig 3D - Zoggen ...
Gruß
Andreas
_________________ Gruß Andreas (aka DeepCopy) - Sic Luceat Lux
Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.
Registriert: Do Jun 18, 2009 07:17 Beiträge: 44 Wohnort: Gießen/Hessen
Ja, nicht schlecht!
@flash Kann es sein das du GL_TRANSFORM_BIT nur bei glPushAttrib verwenden darfst? Laut der wiki-Hilfe stehen für glPushClientAttrib nur 3 Konstanten zur Verfügung: GL_ALL_ATTRIB_BITS, GL_CLIENT_PIXEL_STORE_BIT und GL_CLIENT_VERTEX_ARRAY_BIT.
Zum Problem "Design By Contract", ich glaube alle Parameter auf den Stack zu pushen und dann wieder zu poppen, ist IMHO nicht der schnellere Weg. Gut stelle ich mir vor, das nach dem Aufruf immer die Modelview-Matrix aktivert ist (spare ich mir eine Abfage beim Aufruf meiner Library).
Meine Kritik: Da die Library aus einzelnen Funktionen besteht, die im Code eingetreut verwendet wird, und
nur sehr partiell Attribute verändert die nachher wieder hergestellt werden müssten, erscheint mir
ein einfaches glPushMatrix oder eine lokale Zwischenvariable einfacher zu handhaben.
Zum Beispiel will ich eine Transformation oder Rotation erhalten, wenn ich mir dann bei der Anwendung von glPushAttrib, genau heraussuchen müsste welche Attibute nun gepusht bzw. nicht mehr gepusht werden dürften, dann hätte ich mehr Stresss das etwas falsch laufen könnte, und bedenkt man noch das die glPushClientAttrib bzw glPushAttib nicht gerade kleine Funktionen zu sein scheinen, dann ist der Laufzeitvorteil vieleicht auch nicht mehr so groß.
_________________ Gruß Andreas (aka DeepCopy) - Sic Luceat Lux
Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Nur so als kleiner Hinweis zu glPushAttrib : Das wird u.a. in diesem Dokument von ATI als eines der "State Evils" dargestellt. Und aus meiner Erfahrung kann ich zumindest für ATI-Karten behaupten dass glPushAttrib (bzw. glPopAtrrib) nur zum Sichern und Wiederherstellen einiger weniger States benutzt werden sollten. Ein glPushAttrib(GL_ALL_ATTRIB_BITS) ist auf einigen ATI-Karten (auf NV wirds wohl nicht viel anders sein) extremst langsam, das sollte man also vermeiden.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aha. Danke für den Hinweis. Jetzt stellt sich mir die Frage, wie schreibe ich meinen Code so, dass er in Fremden Code als BlackBox integriert werden kann?
Einfach hart definieren "Nach Aufruf meiner Lib sind folgende Status gesetzt:....." oder gehts anders besser?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Du hattest oben etwas von einem Hilfsgrid geschrieben. Sowas klingt ziemlich Debug-Library. Ich denke mal Performance ist da nicht so wichtig. Von daher wäre glPushAttrib schon ein guter Weg, vor allem weil dadurch nicht noch zusätzliche Fehler entstehen können. Was bei einer Debug-Lib ziemlich blöde wäre...
Zitat:
Einfach hart definieren "Nach Aufruf meiner Lib sind folgende Status gesetzt:....." oder gehts anders besser?
Ich löse das meist so, dass es bei mir zwei Gruppen von States gibt:
Gruppe 1: States die man nur selten ändert. Diese haben einen definierten Default-Zustand, der häufig einfach mit dem Default-Zustand von OpenGL übereinstimmt. Jede Methode die diese States ändert, ist selbst dafür verantwortlich diese wieder auf den Default-Zustand zurückzusetzen. Beispiele: GL_CULL_FACE, GL_DEPTH_TEST, GL_LIGHTING, ...
Gruppe 2: Die States die sich sowieso ständig ändern. Hier ist der Default-Zustand undefiniert. Jede Methode muss den State am Anfang selbst auf den für diese Methode benötigten Wert setzen. Beim verlassen der Methode bleibt der Zustand einfach so wie er ist, den die nächste Methode wird den State sowieso überschreiben. Beispiele: Shader-Programme, Uniform-Variablen, Texturen, ...
Um dieses Verfahren weniger Fehleranfällig zu machen kann man eine Debug-Funktion schreiben, welche überprüft ob alle States auf Default stehen und im Fall eines Fehlers Alarm schlägt. Diese ist idealerweise natürlich ein Marko (C++), welches später in der Release-Version einfach als leer definiert wird und es somit keinen Performance-Nachteil gibt. (Ich muss allerdings zugeben, dass ich eine derartige Debug-Funktion bisher noch nicht verwendet habe. Bei einem größeren Projekt kann sowas aber sicher sinnvoll sein.)
Registriert: Do Jun 18, 2009 07:17 Beiträge: 44 Wohnort: Gießen/Hessen
Kurze und knappe Antwort zum Thema aktive Matrix bestimmen gibt's hier glMatrixMode#Beschreibung, ganz am Schluss des Kapitels.
_________________ Gruß Andreas (aka DeepCopy) - Sic Luceat Lux
Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.