Bezeichnung
gl.SelectBuffer -- richtet einen Puffer für die Werte des Auswahlmodus ein
Übersicht
buffer = gl.SelectBuffer(size)
Beschreibung
gl.SelectBuffer() weist einen Speicherpuffer der im Argument size angegebenen Größe zu und gibt einen Zeiger auf diesen Puffer zurück. Werte aus dem Namensstapel werden in diesen Puffer geschrieben (siehe gl.InitNames(), gl.LoadName(), gl.PushName()), wenn der Rendering-Modus #GL_SELECT ist. Siehe gl.RenderMode für Details. gl.SelectBuffer() muss ausgegeben werden, bevor der Auswahlmodus aktiviert wird, und darf nicht ausgegeben werden, wenn der Rendering-Modus #GL_SELECT aktiviert ist.

Sie können Werte aus dem von gl.SelectBuffer() zurückgegebenen Speicherpuffer lesen, indem Sie gl.GetSelectBuffer() aufrufen, oder den direkten Zugriff auf den Puffer mit den Hollywood-Befehlen GetMemPointer() und Peek() vornehmen. Beim direkten Zugriff auf den Puffer ist zu beachten, dass die ersten vier Bytes im Puffer die Größe des Selektionspuffers in Bytes enthalten.

Ein Programmierer kann mit Hilfe der Auswahl bestimmen, welche Grundelemente in einen Bereich eines Fensters gezeichnet werden. Dieser Bereich wird durch die aktuelle Modellansicht und perspektivische Matrizen definiert.

Im Auswahlmodus werden keine Pixelfragmente aus der Rasterung erzeugt. Wenn stattdessen ein Grundelement oder eine Rasterposition das durch den Betrachtungsrahmen und die benutzerdefinierten Ausschnittebene definierte Ausschnitt-Volumen schneidet, führt dieses Grundelement zu einem Selektionstreffer (bei Polygonen tritt kein Treffer auf, wenn das Polygon ausgewählt wird). Wenn eine Änderung am Namensstapel vorgenommen oder wenn gl.RenderMode() aufgerufen wird, wird ein Trefferprotokoll in den Puffer kopiert, wenn seit dem letzten solchen Ereignis Treffer aufgetreten sind (Namensstapeländerung oder gl.RenderMode() Aufruf). Der Trefferdatensatz besteht aus der Anzahl der Namen im Namensstapel zum Zeitpunkt des Ereignisses, gefolgt von den minimalen und maximalen Tiefenwerten aller Knoten, die seit dem vorherigen Ereignis getroffen wurden, gefolgt von den Inhalten des Namensstapels, zuerst der untere Name.

Tiefenwerte (die im Bereich von [0,1] liegen) werden mit 2^32 - 1 multipliziert, bevor sie in das Trefferprotokoll aufgenommen werden.

Ein interner Index im Puffer wird bei jedem Aufruf des Auswahlmodus auf 0 zurückgesetzt. Jedes Mal, wenn ein Trefferdatensatz in den Puffer kopiert wird, erhöht sich der Index, um auf die Zelle unmittelbar nach dem Ende des Namensblocks zu verweisen, d.h. in die nächste verfügbare Zelle, wenn der Trefferdatensatz größer als die Anzahl der verbleibenden Positionen im Puffer ist und es werden so viele Daten wie möglich kopiert sowie das Überlauf-Flag gesetzt. Wenn der Namensstapel beim Kopieren eines Treffer-Datensatzes leer ist, besteht dieser Datensatz aus 0, gefolgt von den minimalen und maximalen Tiefenwerten.

Rufen Sie zum Verlassen des Auswahlmodus gl.RenderMode() mit einem anderen Argument als #GL_SELECT auf. Immer wenn gl.RenderMode() aufgerufen wird, während der Rendermodus #GL_SELECT ist, wird die Anzahl der in den Puffer kopierten Treffer zurückgegeben, das Überlauf-Flag und der Auswahlpufferzeiger zurückgesetzt und initialisiert den Namensstapel als leer. Wenn das Überlauf-Flag gesetzt war, als gl.RenderMode() aufgerufen wurde, wird eine negative Trefferanzahl zurückgegeben.

Der Inhalt des Puffers ist undefiniert, bis gl.RenderMode() mit einem anderen Argument als #GL_SELECT aufgerufen wird.

gl.Begin() / gl.End() Grundelemente und Aufrufe von gl.RasterPos() können zu Treffern führen.

Um einen von dieser Funktion zugewiesenen Puffer freizugeben, rufen Sie den Befehl gl.FreeSelectBuffer() auf. Siehe gl.FreeSelectBuffer für Details.

Weitere Informationen finden Sie in einem OpenGL-Referenzhandbuch.

Eingaben
size
gibt die Größe des Puffers in Bytes an
Rückgabewerte
buffer
Speicherpuffer zur Verwendung im Auswahlmodus
Fehler
#GL_INVALID_VALUE wird erzeugt, wenn size negativ ist.

#GL_INVALID_OPERATION wird erzeugt, wenn gl.SelectBuffer() aufgerufen wird, während der Rendermodus #GL_SELECT ist, oder wenn gl.RenderMode() mit dem Argument #GL_SELECT aufgerufen wird, bevor gl.SelectBuffer() mindestens einmal aufgerufen wird.

#GL_INVALID_OPERATION wird erzeugt, wenn gl.SelectBuffer() zwischen gl.Begin() und gl.End() ausgeführt wird.

Verbundene get-operationen
gl.Get() mit dem Argument #GL_NAME_STACK_DEPTH

gl.Get() mit dem Argument #GL_SELECTION_BUFFER_SIZE

gl.GetPointer() mit dem Argument #GL_SELECTION_BUFFER_POINTER


Navigation zeigen