buffer = gl.SelectBuffer(size)
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.
#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.
#GL_NAME_STACK_DEPTH
gl.Get() mit dem Argument #GL_SELECTION_BUFFER_SIZE
gl.GetPointer() mit dem Argument #GL_SELECTION_BUFFER_POINTER