Bezeichnung
gl.CopyPixels -- kopiert Pixel in den Bildspeicher
Übersicht
gl.CopyPixels(x, y, width, height, type)
Beschreibung
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
Indizes oder RGBA-Farben werden aus dem aktuell als Lese-Quellfarbpuffer angegebenen Puffer gelesen. Siehe gl.ReadBuffer für Details. Wenn sich GL im Farbindexmodus befindet, wird jeder Index, der aus diesem Puffer gelesen wird, in ein Festkommaformat mit einer nicht spezifizierten Anzahl von Bits rechts vom Binärpunkt konvertiert. Jeder Index wird dann um #GL_INDEX_SHIFT-Bits nach links verschoben und zu #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
Tiefenwerte werden aus dem Tiefenpuffer gelesen und direkt in ein internes Gleitkommaformat mit unbestimmter Genauigkeit konvertiert. Der resultierende Gleitkommatiefenwert wird dann mit #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
Schablonenindizes werden aus dem Schablonenpuffer gelesen und in ein internes Festkommaformat mit einer unbestimmten Anzahl von Bits rechts vom Binärpunkt umgewandelt. Jeder Festkomma-Index wird dann um #GL_INDEX_SHIFT-Bits nach links verschoben und zu #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.

Eingaben
x
gibt die x-Koordinate der unteren linken Ecke des rechteckigen Bereichs der zu kopierenden Pixel an
y
gibt die y-Koordinate der unteren linken Ecke des rechteckigen Bereichs der zu kopierenden Pixel an
width
definiert die Abmessungen des rechteckigen Bereichs der zu kopierenden Pixel; beide müssen nicht negativ sein
height
definiert die Abmessungen des rechteckigen Bereichs der zu kopierenden Pixel; beide müssen nicht negativ sein
type
gibt an, ob Farbwerte, Tiefenwerte oder Schablonenwerte kopiert werden sollen; die symbolischen Konstanten #GL_COLOR, #GL_DEPTH und #GL_STENCIL werden akzeptiert
Fehler
#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.

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

gl.Get() mit dem Argument #GL_CURRENT_RASTER_POSITION_VALID


Navigation zeigen