glCopyPixels

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glCopyPixels

Name

glCopyPixels - kopiert Pixel in den Framebuffer.


Delphi-Spezifikation

procedure  glCopyPixels(x: TGLint; y: TGLint; 
                        width: TGLsizei; height: TGLsizei; 
                        _type: TGLenum);



Parameter

x,y Bestimmt die Fensterkoordinaten der linken unteren Ecke eines Rechtecks welches den Bereich umschließt der kopiert werden soll.
width, height Bestimmt die Seitenlängen des Rechtecks. Beide Werte dürfen nicht negativ sein.
type Bestimmt welche Werte kopiert werden sollen. Es können Farbwerte (mit der Konstante GL_COLOR), Stencil-Werte (GL_STENCIL) oder Tiefenwerte (GL_DEPTH) kopiert werden.


Beschreibung

glCopyPixels kopiert ein am Bildschirm ausgerichtetes Rechteck aus Pixel von der angegebenen Framebufferposition in einen Bereich relativ zur aktuellen Rasterposition. Diese Operation ist nur dann wohldefiniert, wenn alle Pixel der Quellregion innerhalb des angezeigten Fensterbereichs liegen. Die Ergebnisse von Kopiervorgängen, die Pixel erfassen, die entweder außerhalb des Fensters liegen oder von anderen Fenstern überdeckt werden, sind hardwareabhängig und undefiniert.

x und y bestimmen die untere linke Ecke der rechteckigen Quellregion in Fensterkoordinaten. width und height bestimmen von diesem Punkt aus die Dimensionen des Rechtecks. Beide Werte, width und height, dürfen nicht negativ sein.

Verschiedene Parameter beeinflussen die Behandlung der Pixeldaten wären diese kopiert werden. Diese werden mit den drei Befehlen glPixelTransfer, glPixelMap und glPixelZoom gesetzt. Dieser Artikel beschreibt die Auswirkungen der meisten, aber nicht aller Parameter, die durch diese Funktionen gesetzt werden können.

glCopyPixels kopiert Werte aller Pixel die im Bereich (x + i, y + j) mit 0<i<width und 0<j<height liegen. Die Pixel werden als i-tes Pixel in der j-ten Zeile bezeichnet. Die Pixel werden in folgender Reihenfolge kopiert: Zeilenweise beginnen bei der niedrigsten zur höchsten Zeile und in jeder Zeile von links nach rechts.

_type legt fest ob Farb-, Tiefen- oder Stencilwerte kopiert werden sollen. Die Details zu den Datentypen sind folgende:

GL_COLOR

Indizes und RGBA Farben werden von dem momentan als Quellpuffer festgelegten Puffer (siehe glReadBuffer) gelesen. Wenn die GL im Farbindexmodus ist wird jeder gelesene Index in eine Festkommazahl mit einer unbestimmten Anzahl von Bits rechts vom binären Punkt konvertiert. Jeder Index wird dann mit GL_INDEX_SHIFT nach links geshiftet und zu GL_INDEX_OFFSET addiert. Wenn GL_INDEX_SHIFT ein negativer Wert ist erfolgt das shiften nach rechts. In beiden Fällen werden undefinierte Bitplätze mit Nullen im Ergebnis aufgefüllt. Wenn GL_MAP_COLOR = true ist, wird der Index ersetzt mit dem Wert der in der Color-Lookup-Table GL_PIXEL_MAP_I_TO_I dem Index entspricht. Egal ob die Ersetzung des Index durchgeführt wurde oder nicht, wird der Integer-Teil des Index mit 2b-1 geANDed, wobei b die Anzahl der Bits in einem Color-Index-Buffer darstellt.
Wenn die GL im RGBA-Modus ist wird die Rot-, Grün-, Blau- und Alphakomponente eines jeden gelesenen Pixels ins interne Fließkommaformat konvertiert, wobei die Präzision unspezifiziert ist. Die Konvertierung bildet den größten darstellbaren Komponentenwert auf 1.0 und den Komponentenwert 0 auf 0.0 ab. Die Resultierenden Fließkomma-Farbwerte werden dann mit GL_c_SCALE multipliziert und zu GL_c_BIAS addiert. (Wobei c hier für die einzelnen Farbkomponenten steht und durch RED, BLUE, GREEN und Alpha ersetzt werden muss.) Die Ergebnisse werden auf das Interval [0,1] beschränkt. Wenn GL_MAP_COLOR = true ist wird jede Farbkomponente mit dem Wert von GL_PIXEL_MAP_c_TO_c skaliert und anschließend durch den referenzierten Wert aus der Tabelle ersetzt. c ist dabei R, G, B bzw A.
Die GL konvertiert anschließend die resultierenden Indices oder RGBA Farben in Fragmente indem zu jedem Pixel die aktuelle z-Koordinate und Texturkoordinate der Rasterposition hinzugefügt wird. Anschließend werden die Fensterkoordinaten (x +i, y +j) hinzugefügt, wobei (x,y) die aktuelle Rasterposition ist und das Pixel das i-te Pixel in der j-ten Zeile war. Diese Pixelfragmente werden dann genauso behandelt wie die Fragmente die durch die Rasterisierung (siehe Feste Funktionspipeline) von Punkten, Linien oder Polygonen entstehen. Texture Mapping, Nebel und alle Fragment Operationen werden anschließend, noch bevor die Fragmente in den Framebuffer geschrieben werden angewendet.

GL_DEPTH

Tiefenwerte werden aus dem Tiefenpuffer gelesen und direkt in das interene Fließkommaformat mit unspezifizierter Genauigkeit umgewandelt. Die resultierenden Tiefenwerte werden dann mit GL_DEPTH_SCALE multipliziert und zu GL_DEPTH_BIAS addiert. Das Ergebnis wird auf das Interval [0,1] beschränkt.
Anschließend konvertiert die GL die Tiefenwerte in Fragmente indem die Farbe bzw. Farbindex sowie die Texturkoodinaten der aktuellen Rasterposition an jedes Pixel angehängt wird. Anschließend werden die Fensterkoordinaten (x +i, y +j) zugewiesen, wobei (x, y) die aktuelle Rasterposition ist und das betreffende Pixel das i-te Pixel in der j-ten Zeile war. Diese Pixelfragmente werden dann wie normale Fragmente die aus Punkten, Linien oder Polygonen erzeugt wurden behandelt. Texture Mapping, Nebel und alle Fragment Operationen werden anschließend, noch bevor die Fragmente in den Framebuffer geschrieben werden angewendet.

GL_STENCIL

Stencilwerte werden aus dem Stencilbuffer gelesen und direkt in das interene Festkommaformat mit unspezifizierter Anzahl Bits rechts vom Binärpunkt konvertiert. Jeder Wert wird dann mit GL_INDEX_SHIFT nach links geshiftet und zu GL_INDEX_OFFSET addiert. Wenn GL_INDEX_SHIFT ein negativer Wert ist erfolgt das shiften nach rechts. In beiden Fällen werden undefinierte Bitplätze mit Nullen im Ergebnis aufgefüllt. Wenn GL_MAP_STENCIL = true ist, wird der Index ersetzt mit dem Wert der in der Lookup-Table GL_PIXEL_MAP_S_TO_S dem Index entspricht. Egal ob die Ersetzung des Index durchgeführt wurde oder nicht, wird der Integer-Teil des Index mit 2b-1 geANDed, wobei b die Anzahl der Bits im Stencilbuffer darstellt. Anschließend werden die Stencilindices an die Stelle (x +i, y +j) im Stencilbuffer geschrieben, wobei (x, y) die aktuelle Rasterposition ist und der betreffende Index der i-te in der j-ten Zeile war. Nur der Pixel-Besitzer Test, der Scissor Test und die Stecilmaske (glStencilMask) beeinflussen diese Schreiboperation.



Die bis jetzt beschriebene Rasterisierung geht von Pixelzoomfaktoren von 1.0 aus. Wenn glPixelZoom verwendet wird, um die x- und x-Pixelzoomfaktoren zu ändern, werden Pixel wie folgend zu Fragmenten konvertiert. Wenn [x,y] die aktuelle Rasterposition ist und sich ein gegebenes Pixel innerhalb der i-ten Position der j-ten Reihe befindet, dann werden Fragmente so erzeugt, dass Pixel, deren Zentren sich in dem Rechteck mit den Ecken bei

(xr + zoomxi, yr + zoomyj)
und
(xr + zoomx(i+1), yr + zoomy(j+1))

befinden. (Wobei zoomx der Wert von GL_ZOOM_X und zoomy der Wert von GL_ZOOM_Y ist.)




Beispiel

Um die Farbe des Pixels in der linken unteren Ecke an die aktuelle Rasterposition zu kopieren, rufen sie glCopyPixels so auf:

glCopyPixels(0, 0, 1, 1, GL_COLOR);


Hinweise

Einstellungen, die durch glPixelStore gemacht wurden, haben keinen Einfluss auf glCopyPixels.


Fehlermeldungen

GL_INVALID_ENUM wird generiert, wenn type kein gültiger Wert übergeben wurde.

GL_INVALID_VALUE wird generiert, wenn width oder height einen negativen Wert haben.

GL_INVALID_OPERATION wird generiert, wenn type GL_DEPTH ist und kein Tiefenpuffer existiert.

GL_INVALID_OPERATION wird generiert, wenn type GL_STENCIL ist und kein Stencilbuffer existiert.

GL_INVALID_OPERATION wird generiert, wenn glCopyPixels innerhalb eines glBegin-glEnd-Blocks aufgerufen wird.



Zugehörige Wertrückgaben

glGet mit Token GL_CURRENT_RASTER_POSITION

glGet mit Token GL_CURRENT_RASTER_POSITION_VALID



Siehe auch

glDepthFunc, glDrawBuffer, glDrawPixels, glPixelMap, glPixelTransfer, glPixelZoom, glRasterPos, glReadBuffer, glReadPixels, glStencilFunc