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

Aktuelle Zeit: Fr Jul 04, 2025 05:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: NameStack
BeitragVerfasst: Mo Dez 30, 2002 11:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
huhu,

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 :roll:

Deswegen frag ich einfach mal, ist der begrenzt???
Also kann ich nur einer bestimmten Anzahl an objekten mit glLoadName nen Namen zuweisen..?

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 30, 2002 13:30 
Offline
Fels i.d. Brandung
Benutzeravatar

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..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 30, 2002 14:51 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
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.

Viel Spaß beim Programmieren,

Martin

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 08, 2003 01:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
so wie ich das verstanden hab, ist die anzahl der zurückgelieferten Names auf 64 bzw 128 begrenzt, oder?

evtl. mal im redbook blättern! ;)

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 08, 2003 12:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Red Book: chapter 12

void glPushName(GLuint name);

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

<a href='http://www.martinscad.cjb.net' target='_blank'>http://www.martinscad.cjb.net</a>

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.

Viel Spaß beim Programmieren,

Martin

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


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