gl.CopyPixels(x, y, width, height, type)
gl.CopyPixels()
kopiert ein bildschirmausgerichtetes Rechteck von Pixeln
von dem angegebenen Bildpufferspeicherposition (Framebufferposition) in
einen Bereich relativ zur aktuellen Rasterposition. Seine Operation ist
nur dann gut definiert, wenn der gesamte Pixelquellenbereich innerhalb
des exponierten Teils des Fensters liegt. Ergebnisse von Kopien außerhalb
des Fensters oder von nicht exponierten Bereichen des Fensters sind
hardwareabhängig und nicht definiert.
x
und y
gibt die Fensterkoordinaten der unteren linken Ecke des zu
kopierenden rechteckigen Bereichs an. width
und height
geben die Abmessungen
des rechteckigen Bereichs an, der kopiert werden soll. Sowohl die Breite als
auch die Höhe dürfen nicht negativ sein.
Mehrere Parameter steuern die Verarbeitung der Pixeldaten während des
Kopierens. Diese Parameter werden mit drei Befehlen festgelegt:
gl.PixelTransfer(), gl.PixelMap()
und gl.PixelZoom(). Diese Referenzseite beschreibt die
Auswirkungen der meisten, aber nicht aller Parameter von gl.CopyPixels()
auf
die von diesen drei Befehlen angegebenen Parameter.
gl.CopyPixels()
kopiert Werte von jedem Pixel mit der unteren linken Ecke bei
(x+i, y+j) für 0 <= i < Breite und 0 <= j < Höhe. Dieses Pixel wird als das
i-te Pixel in der j-ten Reihe bezeichnet. Pixel werden in Reihenreihenfolge
von der niedrigsten in die höchste Zeile kopiert, von links nach rechts in
jeder Zeile.
type
gibt an, ob Farb-, Tiefen- oder Schablonendaten kopiert werden sollen.
Die Details der Übertragung für jeden Datentyp lauten wie folgt:
#GL_COLOR
#GL_INDEX_OFFSET
hinzugefügt. Wenn #GL_INDEX_SHIFT
negativ ist, wird die Verschiebung nach
rechts vorgenommen. In beiden Fällen füllen Null-Bits ansonsten nicht definierte
Bitstellen im Ergebnis. Wenn #GL_MAP_COLOR
True
ist, wird der Index durch
den Wert ersetzt, auf den er in der Nachschlagetabelle #GL_PIXEL_MAP_I_TO_I
verweist. Unabhängig davon, ob der Nachschlageaustausch des Indexes
durchgeführt wird oder nicht, wird der ganzzahlige Teil des Index dann
mit 2^b-1 AND-verknüpft, wobei b die Anzahl der Bits in einem
Farbindexpuffer ist.
Wenn sich GL im RGBA-Modus befindet, werden die Rot-, Grün-, Blau- und
Alpha-Komponenten jedes gelesenen Pixels in ein internes Gleitkommaformat mit
unbestimmter Genauigkeit konvertiert. Bei der Konvertierung wird der Wert
der größten darstellbaren Komponente auf 1.0 und der Komponentenwert auf 0
bis 0.0 abgebildet. Die resultierenden Gleitkomma-Farbwerte werden dann mit
#GL_c_SCALE
multipliziert und zu #GL_c_BIAS
hinzugefügt, wobei c für die
jeweiligen Farbkomponenten ROT, GRÜN, BLAU und ALPHA ist. Die Ergebnisse
werden auf den Bereich [0,1] festgelegt. Wenn #GL_MAP_COLOR
True
ist, wird jede
Farbkomponente durch die Größe der Nachschlagetabelle #GL_PIXEL_MAP_c_TO_c
skaliert und dann durch den Wert ersetzt, auf den sie in dieser Tabelle
verweist. c ist R, G, B oder A.
Wenn die Erweiterung ARB_imaging unterstützt wird, können die Farbwerte zusätzlich durch Farbtabellen-Nachschlagewerke, Farbmatrixtransformationen und Faltungsfilter verarbeitet werden.
GL wandelt dann die resultierenden Indizes oder RGBA-Farben in Fragmente um, indem er die aktuellen Rasterpositionskoordinaten- und Texturkoordinaten an jedes Pixel anfügt und dann Fensterkoordinaten (xr+i, yr+j) zuweist, wobei (xr, yr) die aktuelle Rasterposition ist und das Pixel war das i-te Pixel in der j-ten Reihe. Diese Pixelfragmente werden dann genauso behandelt wie die Fragmente, die durch Rasterung von Punkten, Linien oder Polygonen erzeugt werden. Textur-Abbildungen, Nebel und alle Fragment-Operationen werden angewendet, bevor die Fragmente in den Bildpuffer geschrieben werden.
#GL_DEPTH
#GL_DEPTH_SCALE
multipliziert und zu
#GL_DEPTH_BIAS
hinzugefügt. Das Ergebnis wird auf den Bereich [0,1] festgelegt.
GL wandelt dann die resultierenden Tiefenkomponenten in Fragmente um, indem er die aktuelle Rasterpositionsfarbe oder Farbindex- und Texturkoordinaten an jedes Pixel anfügt und dann Fensterkoordinaten (xr+i, yr+j) zuweist, wobei (xr, yr) die aktuelle Rasterposition ist und das Pixel war das i-te Pixel in der j-ten Reihe. Diese Pixelfragmente werden dann genauso behandelt wie die Fragmente, die durch Rasterung von Punkten, Linien oder Polygonen erzeugt werden. Textur-Abbildungen, Nebel und alle Fragment-Operationen werden angewendet, bevor die Fragmente in den Bildpuffer geschrieben werden.
#GL_STENCIL
#GL_INDEX_OFFSET
hinzugefügt. Wenn #GL_INDEX_SHIFT
negativ ist, wird die Verschiebung nach rechts vorgenommen. In beiden Fällen
füllen Null-Bits ansonsten nicht spezifizierte Bitstellen im Ergebnis. Wenn
#GL_MAP_STENCIL
True
ist, wird der Index durch den Wert ersetzt, auf den
er in der Nachschlagetabelle #GL_PIXEL_MAP_S_TO_S
verweist. Unabhängig davon,
ob der Nachschlageaustausch des Indexes durchgeführt wird oder nicht, wird
der ganzzahlige Teil des Index dann mit 2^b-1 AND-verknüpft, wobei b die
Anzahl der Bits im Schablonenpuffer ist. Die resultierenden Schablonenindizes
werden dann in den Schablonenpuffer geschrieben, so dass der Index, der von
der i-ten Stelle der j-ten Reihe gelesen wird, in den Ort (xr+i, yr+j)
geschrieben wird, wobei (xr, yr) die aktuelle Rasterposition ist. Nur der
Pixelbesitztest, der Scherentest und die Schablonen-Schreibmaske beeinflussen
diese Schreiboperationen.
Die bisher beschriebene Rasterung setzt Pixelzoomfaktoren von 1.0 voraus. Wenn gl.PixelZoom() verwendet wird, um die Zoomfaktorfaktoren x und y zu ändern, werden die Pixel wie folgt in Fragmente konvertiert. Wenn (xr, yr) die aktuelle Rasterposition ist und ein gegebenes Pixel an der i-ten Stelle in der j-ten Reihe des Quellpixelrechtecks liegt, dann werden Fragmente für Pixel erzeugt, deren Mitten in dem Rechteck mit Ecken bei
(xr + zoomx_i, yr + zoomy_j) |
und
(xr + zoomx_(i + 1), yr + zoomy_(j + 1)) |
ligen. Dabei ist zoomx
der Wert von #GL_ZOOM_X
und zoomy
ist der Wert von #GL_ZOOM_Y
.
Die mit gl.PixelStore() angegebenen Modi haben keinen
Einfluss auf die Operation des Befehls gl.CopyPixels()
.
Weitere Informationen finden Sie in einem OpenGL-Referenzhandbuch.
#GL_COLOR
, #GL_DEPTH
und #GL_STENCIL
werden akzeptiert#GL_INVALID_ENUM
wird generiert, wenn der Typ kein akzeptierter Wert ist.
#GL_INVALID_VALUE
wird generiert, wenn Breite oder Höhe negativ sind.
#GL_INVALID_OPERATION
wird generiert, wenn der Typ #GL_DEPTH
ist und kein
Tiefenpuffer vorhanden ist.
#GL_INVALID_OPERATION
wird generiert, wenn der Typ #GL_STENCIL
ist und kein
Schablonenpuffer vorhanden ist.
#GL_INVALID_OPERATION
wird generiert, wenn gl.CopyPixels()
zwischen
gl.Begin() und gl.End() ausgeführt wird.
#GL_CURRENT_RASTER_POSITION
gl.Get() mit dem Argument #GL_CURRENT_RASTER_POSITION_VALID