glSelectBuffer

Aus DGL Wiki
(Weitergeleitet von GlSelectBuffer)
Wechseln zu: Navigation, Suche

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

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

glGet mit dem Argument GL_SELECTION_BUFFER_SIZE

glGetPointerv mit dem Argument GL_SELECTION_BUFFER_POINTER


Siehe auch

glFeedbackBuffer, glInitNames, glLoadName, glPushName, glRenderMode