also mir is als hätte ich gestern oder so irgendwo hier im Forum was davon gelesen das der NameStack begrenzt ist... nur, ich finde es absolut nichmehr
Deswegen frag ich einfach mal, ist der begrenzt???
Also kann ich nur einer bestimmten Anzahl an objekten mit glLoadName nen Namen zuweisen..?
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Ja, er ist begrenzt, wobei dies IMAO von der Grafikkarte abhängt (hö?). Meines erachtens waren das 64 oder 128. Wird wohl irgend etwas im Redbook drinne sein, habe aber die Stelle nicht rausgesucht.
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ja.Der NameStack ist begrenzt, die Anzahl der auf den Namestack legbaren Namen ist Grafikkarten- (und je nach Karte auch Treiber) abhängig.
Bei Karten der GeForce-Reihe ist der NameStack auf 128 Einträge beschränkt.
Wenn du wissen willst, welche Karte welche NameStack-Größe anbietet, dann schau dir mal folgende Datenbank an : <a href='http://www.delphi3d.net/hardware/index.php' target='_blank'>http://www.delphi3d.net/hardware/index.php</a>
Dort gibt es für fast alle Grakas detaillierte Infos über deren OpenGL-Fähigkeiten.Darunter auch die Tiefe des Namestacks.
Hmm, so ganz stimmt das nicht. Der Namestack begrenzt nicht die Anzahl der Namen, die zurückgeliefert werden können, sondern vielmehr deren Rekursionstiefe.
Wenn alle deine Objekte voneinander getrennt sind, langt ein einzigens glPushName aus, dann kannst du mit glLoadName diesen verändern.
z.B.
glPushName(0); // Stack ist definiert
glLoadName(id1); // Identität für Objekt 1
Objekt 1 Zeichnen
glLoadName(id2); // Identität für Objekt 2
Objekt 2 Zeichnen
...
glPopName; // nicht unbedingt notwendig - aber schöner
langt völlig aus, um beliebig viele Objekte im Frustum zurückzulieferen - und benötigt nur eine Stacktiefe von 1.
Eine höhere Rekursionstiefe brauchst du, wenn du Selektionen verschachtelst - z.B. glLoadName in einer DisplayList aufrufst (Beispiel Autorad) und diese DisplayList viermal verwendest um alle vier Räder zu zeichnen - dann kannst du zwei glPushNames nacheinander verwenden, die dir dann zurückliefern
1) es handelt sich um ein Rad
2) das Objekt zu dem das Rad gehört
Wär ja auch noch schöner, wenn die Anzahl der selektierbaren Objekte auf 64 (Standardtiefe des Namestacks) begrenzt wäre.
Ein Tipp: als Identifier musst du eindeutige Namen verwenden - wenn du (Delphi) Objekte verwendest, kannst du einfach deren Adresse in einen Integer typecasten, dann liefert dir OpenGL gleich die dargestellten Adressen zurück und du mußt nicht lange suchen, welcher Identifier zu welchem Objekt gehört.
Pushes name onto the name stack. Pushing a name beyond the capacity of the stack generates the error GL_STACK_OVERFLOW. The name stack's depth can vary among different OpenGL implementations, but it must be able to contain at least sixty-four names. You can use the parameter GL_NAME_STACK_DEPTH with glGetIntegerv() to obtain the depth of the name stack.
Lies: glPushName bringt den Stack zum Überlaufen - wie du im Codefragment meines letzten Posts liest, verwende ich das aber nur ein einziges Mal, während glLoadName die aktuelle Spitze des Stacks ersetzt!
Du darfst den Namestack nicht so verstehen, dass zuerst die Namen gepusht werden, dann die Objekte selektiert. Vielmehr liefert jeder Hittest WÄHREND des Zeichnens bei jedem Treffer sämtliche auf dem Stack liegenden Namen zurück - du brauchst für n Objekte wirklich nur einen Platz auf dem Stack.
Was bringt das Ganze ?
Nehmen wir an, du schreibst:
glPushName(0) // neue Stackebene
glLoadName(Auto) // Auto liegt auf dem Stack
glPushName(0) // Stack um eins erhöhen
glLoadName(Rad) // Auto und Rad liegen auf dem Stack
Zeichne Rad
glLoadName(Auspuff) // Auto und Auspuff liegen auf dem Stack
Zeichne Auspuff
glPopName // das nächste LoadName liegt auf der Ebene von Auto
Wenn du jetzt das Objekt "Rad" triffst (oder irgendein Objekt nach glLoadName Auto, glPushName) liefert der Selektionbuffer automatisch die Objekte "Rad" und "Auto" zurück - obwohl für Auto gar kein "eigener" Zeichencode vorhanden ist - damit kannst du wunderbar hierarchische Objekte verwalten. Du kannst auch das Objekt "Rad" in eindeutiger Weise mehreren Autos zuordnen (z.B. das glPushName Kommando gleich mit in einer DisplayList ablegen). Wenn viele Namen auf dem Stack liegen, kann daher der für den Selektionsbuffer benötigte Speicher allerdings recht groß werden (in 99% aller Fälle wirst du aber mit einem einzigen Namen auskommen).
Natürlich hätte ich auch gleich glPushName(Auto), anstatt glPushName(0) und glLoadName(Auto) schreiben können, ich denke aber, so wird klarer, was eigentlich wirklich auf dem Stack passiert.
Ich hoffe das war halbwegs verständlich - ohne jetzt groß Werbung für meine eigenen Projekte machen zu wollen - vielleicht schaust du mal auf
Der dort vorgestellte Freeware-3d-Editor erstellt automatisch lauffähige OpenGL Programme - und verwaltet problemlos Szenarien mit tausenden von Objekten mit einem glPushName und ohne Selektionsprobleme.
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.