glSelectBuffer
Inhaltsverzeichnis
glSelectBuffer
Name
glSelectBuffer - Setzt einen Puffer um Werte im Selektionsmodus zu speichern.
Delphi-Spezifikation
procedure glSelectBuffer(size : GLSizei; buffer : PGLUint)
Parameter
size | Gibt die Größe des Puffers an. |
---|---|
buffer | Speichert die Selektionsdaten. |
Beschreibung
glSelectBuffer benötigt zwei Argumente : buffer ist ein Zeiger auf eine Reihe von vorzeichnelosen Ganzzahlwert, und size gibt an wie groß diese Reihe ist. buffer liefert dann die Werte auf dem Namensstapel (siehe glInitNames, glLoadName und glPushName) zurück, sobald der Rendermodus auf GL_SELECT steht (siehe glRenderMode). glSelectBuffer muss vor dem Aktivieren des Selektionsmodus aufgerufen werden und darf nicht während des Renderns im Modus GL_SELECT aufgerufen werden.
Die Selektion kann genutzt werden um zu ermitteln, welche Primitiven in welcher Region eines Bildausschnittes gerendert wurden. Diese Region wird durch die aktuelle Modelansichts- und Perspektivenmatrix festgelegt.
Im Selektionsmodus werden keine Pixelfragmente durch die Rasterisierung generiert. Stattdessen erzeugt eine Primitive (oder Rasterposition), die dass durch das Betrachterfrustum (und nutzerdefinierte Schnittflächen) festgelegte Schnittvolumen schneidet, einen Selektionstreffer (Polygone die gecullt werden erzeugen keine Treffer). Wenn der Namensstapel verändert wird, oder wenn glRenderMode aufgerufen wird, werden die Treffer in buffer kopriert, sofern Treffer seit dem letzten passenden Ereignis (Änderung des Namensstapels oder glRenderMode-Aufruf) Treffer stattfanden. Die Trefferlist besteht aus der Nummer der Namen auf dem Stapel zum Zeitpunkt des Treffer, gefolgt von dem kleinsten und größten Tiefenwert aller Eckpunkte seit dem letzten Treffer und dem Inhalt des Namensstapels, mit dem untersten Namen an erster Stelle.of all vertices that hit since the previous event, followed by the name stack contents, bottom name first.
Tiefenwerte (die zwischen 0 und 1 liegen) werden mit 232-1 multipliziert, bevor sie im Trefferpuffer abgelegt werden.
Ein interner Index in den Puffer wird immer auf 0 gesetzt, sobald man in den Selektionsmodus wechsel. Jedesmal wenn ein Treffer nach buffer kopiert wird, wird dieser Index erhöht und zeigt auf die Zelle direkt nach dem Ende des Namensblockes, also auf die nächste verfügbare Zelle. Wenn das Trefferregister größer als der verfügbare Platz in buffer ist, werden so viele Daten kopiert bis dieser Platz aufgebraucht ist, und das Overflow-Flag wird gesetzt. Wenn der Namensstapel beim Kopieren des Trefferregisters leer ist, dann besteht dieser Treffer aus 0, gefolgt von dem kleinsten und größten Tiefenwert.
Um den Selektionsmodus zu verlssen, ruft man glRenderMode mit einem Argument ungleich GL_SELECT auf. Sobald glRenderMode aufgerufen wird wenn der Modus GL_SELECT ist, liefert diese Funktion die Zahl der Treffer die in den Puffer kopiert wurden zurück, setzt das Overflow-Flag und den Zeiger des Selektionspuffers zurück und leert den Namenssstapel. Wenn das Overflow-Flag beim Aufruf von glRenderMode gesetzt ist, wird für die Zahl der Treffer ein negativer Wert zurückgeliefert.
Hinweise
Der Inhalt von buffer ist solange undefiniert, bis glRenderMode mit einem Argument ungleich GL_SELECT aufgerufen wird.
glBegin/glEnd-Primitiven und Aufrufe von glRasterPos können Treffer erzeugen.
Fehlermeldungen
GL_INVALID_VALUE wird generiert, wenn size negativ ist.
GL_INVALID_OPERATION wird generiert, wenn glSelectBuffer aufgerufen wird, solange der Rendermodus GL_SELECT ist, oder wenn glRenderMode mit dem Argument GL_SELECT aufgerufen wird, bevor glSelectBuffer aufgerufen wurde.
GL_INVALID_OPERATION wird generierte wenn glSelectBuffer in einem glBegin/glEnd-Block aufgerufen wird.
Zugehörige Wertrückgaben
glGet mit dem Argument GL_NAME_STACK_DEPTH.
Siehe auch
glFeedbackBuffer, glInitNames, glLoadName, glPushName, glRenderMode