glDrawPixels

Aus DGL Wiki
Wechseln zu: Navigation, Suche
Hinweis: Dieser Artikel ist noch unvollständig.
(Mehr Informationen/weitere Artikel)

{{{1}}}

Incomplete.jpg

glDrawPixels


Name

glDrawPixels - liest Pixeldaten aus dem Speicher und schreibt diese in den Framebuffer relativ zur aktuellen Rasterposition.


procedure glDrawPixels(width: TGLsizei; height: TGLsizei; 
                       format: TGLenum; _type: TGLenum; 
                       const pixels: PGLvoid);


Parameter

width, height Beschreibt die Dimensionen des Pixelrechtecks. Die Angaben werden dabei in Pixel gemacht.
format Bestimmt das Format der Pixeldaten. Folgende symbolische Werte werden akzeptiert:
GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, und GL_LUMINANCE_ALPHA
type Beschreibt den Datentyp der Pixeldaten. Muss einer der Folgenden sein:
GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, oder GL_FLOAT
pixels Beschreibt die Pixeldaten die in einem Array gespeichert sind.


Beschreibung

glDrawPixels ließt Pixeldaten aus dem Speicher und schreibt diese in den Framebuffer relativ zur aktuellen Rasterposition. Nutzen Sie glRasterPos um die aktuelle Rasterposition zu setzen. Um die aktuelle Rasterposition abzufragen nutzen Sie glGet mit dem Argument GL_CURRENT_RASTER_POSITION.


Verschiedene Parameter bestimmen des decodieren der Pixeldaten im Speicher und die Verarbeitung der Daten bevor diese im Framebuffer abgelegt werden. Diese Parameter werden mit 4 Befehlen gesetzt: glPixelStore, glPixelTransfer, glPixelMap, und glPixelZoom. Dieser Artikel beschreibt den Effekt vieler, jedoch nicht aller Parameter welche die 4 genannten Befehle auf glDrawPixels haben können.


Die Daten welche aus pixels gelesen werden, werden als Sequenz von vorzeichenlosen bzw. behafteten Bytes, Shortints, Integer oder Fließkommazahlen mit einfacher Genauigkeit angesehen. Bestimmt wird dies über die Typangabe in type. Jeder einzelne dieser Werte wird je nach Wert von format als Farb- oder Tiefenkomponente oder als Index verstanden. Indizes werden immer einzeln behandelt. Farbkomponenten werden als Gruppen von ein bis vier Elementen angesehen. (Dies ist wiederum abhängig von format). Indizes und Farbkomponentengruppen gehören jeweils zu einem Pixel. Wenn type GL_BITMAP ist müssen die Daten vorzeichenlose Ganzzahlen sein und format muss entweder GL_COLOR_INDEX oder GL_STENCIL_INDEX sein. Jedes vorzeichenlose Byte wird als acht 1-Bit Pixel behandelt. Die Bitanordnung wird über GL_UNPACK_LSB_FIRST gesteuert. (siehe glPixelStore)


Es werden width x height Pixel aus dem Speicher gelesen. Begonnen wird an der Stelle auf die pixels zeigt. Standardmäßig werden die Pixel aus angrenzenden Speicherregionen gelesen. Eine Ausnahme tritt nach allen width Pixel ein, wo der Lesepointer zur nächsten 4-Byte-Grenze vorgerückt wird. Die 4-Byte Zeilenausrichtung wird über glPixelStore mit dem Argument GL_UNPACK_ALIGNMENT gesetzt. Die Ausrichtung kann auch zur 1, 2, 4 oder 8-Byte-Grenze geändert werden. Andere Pixelstore Prameter spezifizieren andere Lesepointerschrittweiten (bevor das erste Pixel gelsen wird, aber auch nachdem width Pixel gelesen wurden.)


Die width x height Pixel welche aus dem Speicher gelesen werden, werden alle auf die selbe Art und Weise verarbeitet. Bestimmt wird dies durch diverse Parameter die durch glPixelTransfer und glPixelMap gesetzt werden können. Details dieser Operationen genauso wie der Zielpuffer indem die Pixel gezeichnet werden sollen, werden über das Pixelformat bestimmt. Dieses wiederum wird über den Parameter format angegeben. format kann einen von elf symbolischen Werten annehmen:

GL_COLOR_INDEX

Each pixel is a single value, a color index. It is converted to fixed-point format, with an unspecified number of bits to the right of the binary point, regardless of the memory data type. Floating-point values convert to true fixed-point values. Signed and unsigned integer data is converted with all fraction bits set to zero. Bitmap data convert to either 0.0 or 1.0.
Each fixed-point index is then shifted left by GL_INDEX_SHIFT bits and added to GL_INDEX_OFFSET. If GL_INDEX_SHIFT is negative, the shift is to the right. In either case, zero bits fill otherwise unspecified bit locations in the result.
If the GL is in RGBA mode, the resulting index is converted to an RGBA pixel using the GL_PIXEL_MAP_I_TO_R, GL_PIXEL_MAP_I_TO_G, GL_PIXEL_MAP_I_TO_B, and GL_PIXEL_MAP_I_TO_A tables. If the GL is in color index mode, and if GL_MAP_COLOR is true, the index is replaced with the value that it references in lookup table GL_PIXEL_MAP_I_TO_I. Whether the lookup replacement of the index is done or not, the integer part of the index is then ANDed with 2b-1, where b is the number of bits in a color index buffer.
The resulting indices or RGBA colors are then converted to fragments by attaching the current raster position z coordinate and texture coordinates to each pixel, then assigning x and y window coordinates to the nth fragment such that
BITTE GRAFIK EINFÜGEN: x (n) = x (r) + n mod width
BITTE GRAFIK EINFÜGEN: y (n) = y (r) + ë n/width û
where (x (r) , y (r) ) is the current raster position. These pixel fragments are then treated just like the fragments generated by rasterizing points, lines, or polygons. Texture mapping, fog, and all the fragment operations are applied before the fragments are written to the frame buffer.


GL_STENCIL_INDEX

Each pixel is a single value, a stencil index. It is converted to fixed-point format, with an unspecified number of bits to the right of the binary point, regardless of the memory data type. Floating-point values convert to true fixed-point values. Signed and unsigned integer data is converted with all fraction bits set to zero. Bitmap data convert to either 0.0 or 1.0.
Each fixed-point index is then shifted left by GL_INDEX_SHIFT bits, and added to GL_INDEX_OFFSET. If GL_INDEX_SHIFT is negative, the shift is to the right. In either case, zero bits fill otherwise unspecified bit locations in the result. If GL_MAP_STENCIL is true, the index is replaced with the value that it references in lookup table GL_PIXEL_MAP_S_TO_S. Whether the lookup replacement of the index is done or not, the integer part of the index is then ANDed with 2b - 1, where b is the number of bits in the stencil buffer. The resulting stencil indices are then written to the stencil buffer such that the nth index is written to location
BITTE GRAFIK EINFÜGEN: x (n) = x (r) + n mod width
BITTE GRAFIK EINFÜGEN: y (n) = y (r) + ë n /width û
where (x (r) , y (r) ) is the current raster position. Only the pixel ownership test, the scissor test, and the stencil writemask affect these writes.


GL_DEPTH_COMPONENT

Each pixel is a single-depth component. Floating-point data is converted directly to an internal floating-point format with unspecified precision. Signed integer data is mapped linearly to the internal floating-point format such that the most positive representable integer value maps to 1.0, and the most negative representable value maps to -1.0. Unsigned integer data is mapped similarly: the largest integer value maps to 1.0, and zero maps to 0.0. The resulting floating-point depth value is then multiplied by GL_DEPTH_SCALE and added to GL_DEPTH_BIAS. The result is clamped to the range [0,1].
The resulting depth components are then converted to fragments by attaching the current raster position color or color index and texture coordinates to each pixel, then assigning x and y window coordinates to the nth fragment such that
BITTE GRAFIK EINFÜGEN: x (n) = x (r) + n mod width
BITTE GRAFIK EINFÜGEN: y (n) = y (r) + ë n /width û
where (x (r) , y (r) ) is the current raster position. These pixel fragments are then treated just like the fragments generated by rasterizing points, lines, or polygons. Texture mapping, fog, and all the fragment operations are applied before the fragments are written to the frame buffer.


GL_RGBA

Jedes Pixel wird auf eine Gruppe aus vier Werten abgebildet: Rot, Grün, Blau und Alpha-Wert.
Fließkommazahlen werden in ein internes Fließkommaformat mit unbestimmter Genauigkeit umgewandelt. Vorzeichenbehaftete Integer werden linear in das interne Fließkommaformat umgewandelt, wobei der größtmögliche Wert (MAXINT) auf 1.0 und der kleinstmögliche Wert (MININT) auf -1.0 abgebildet wird. Vorzeichenlose Integer werden ähnlich behandelt. Null wird auf 0.0 abgebildet und der größtmögliche Wert wird auf 1.0 abgebildet. Die resultierenden Fließkommewerte werden dann entsprechend mit GL_RED_SCALE, GL_GREEN_SCALE, GL_BLUE_SCALE bzw. GL_ALPHA_SCALE multipliziert und zu GL_RED_BIAS, GL_GREEN_BIAS, GL_BLUE_BIAS bzw. GL_ALPHA_BIAS addiert. In einem letzten Schritt werden die Resultate noch auf den Wertebereich [0..1] abgebildet.

If GL_MAP_COLOR is true, each color component is scaled by the size of lookup table GL_PIXEL_MAP_c_TO_c, then replaced by the value that it references in that table. c is R, G, B, or A, respectively.
The resulting RGBA colors are then converted to fragments by attaching the current raster position z coordinate and texture coordinates to each pixel, then assigning x and y window coordinates to the nth fragment such that
BITTE GRAFIK EINFÜGEN: x (n) = x (r) + n mod width
BITTE GRAFIK EINFÜGEN: y (n) = y (r) + ë n /width û
where (x (r) , y (r) ) is the current raster position. These pixel fragments are then treated just like the fragments generated by rasterizing points, lines, or polygons. Texture mapping, fog, and all the fragment operations are applied before the fragments are written to the frame buffer.


GL_RED

Jedes Pixel besteht aus einer einzelnen roten Farbkomponente. Die Komponente wird in der selben Weise in das interne Fließkommaformat kovertiert wie die Rotkomponente eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen Grün bzw. Blaukomponente 0.0 und dessen Alphakomponente 1.0 ist. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.


GL_GREEN

Jedes Pixel besteht aus einer einzelnen grünen Farbkomponente. Die Komponente wird in der selben Weise in das interne Fließkommaformat kovertiert wie die Grünkomponente eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen Rot bzw. Blaukomponente 0.0 und dessen Alphakomponente 1.0 ist. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.


GL_BLUE

Jedes Pixel besteht aus einer einzelnen blauen Farbkomponente. Die Komponente wird in der selben Weise in das interne Fließkommaformat kovertiert wie die Blaukomponente eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen Grün bzw. Rotkomponente 0.0 und dessen Alphakomponente 1.0 ist. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.

GL_ALPHA

Jedes Pixel besteht aus einer einzelnen Alphakomponente. Die Komponente wird in der selben Weise in das interne Fließkommaformat kovertiert wie die Alphakomponente eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen RGB-Komponenten alle 0.0 sind. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.


GL_RGB

Jedes Pixel besteht aus einer 3-Komponenten-Gruppe. Die einzelnen Komponenten werden in der selben Weise in das interne Fließkommaformat kovertiert wie die Komponenten eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen Alphakomponente 1.0 ist. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.


GL_LUMINANCE

Jedes Pixel besteht aus einer einzelnen Helligkeitskomponente. Die Komponente wird in der selben Weise in das interne Fließkommaformat kovertiert wie die Rotkomponente eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen RGB-Komponenten auf den Konvertierten Helligkeitswert gesetzt sind und dessen Alphakomponente 1.0 ist. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.


GL_LUMINANCE_ALPHA

Jedes Pixel besteht aus einer 2-Komponenten-Gruppe: Zuerst ein Helligkeitswert dann der Alphawert. Die Komponenten werden in der selben Weise in das interne Fließkommaformat kovertiert wie die Rotkomponente eines RGBA Pixels. Anschließend wird das Pixel in ein RGBA Pixel umgewandelt dessen RGB-Komponenten auf den Konvertierten Helligkeitswert gesetzt sind und dessen Alphakomponente auf den konvertierten Alphawert gesetzt ist. Nach dieser Konvertierung wird das Pixel wie ein normales RGBA Pixel behandelt.


Hier nocheinmal eine Zusammenfassung der für den Parameter format akzeptierten Werte:

Format Parameter

Name Art der Pixeldaten
GL_COLOR_INDEX Ein Farb-Index
GL_RGB Eine rote Farbkomponente, gefolgt von einer grünen und einer blauen
GL_RGBA Eine rote Farbkomponente, gefolgt von einer grünen, einer blauen und eines Alpha-Wertes
GL_RED Eine rote Farbkomponente
GL_GREEN Eine gruene Farbkomponente
GL_BLUE Eine blaue Farbkomponente
GL_ALPHA Eine Alpha-Wert Farbkomponente
GL_LUMINANCE Eine Helligkeits-Komponente
GL_LUMINANCE_ALPHA Eine Helligkeits-Komponente gefolgt von einer Alpha-Wert Farbkomponente
GL_STENCIL_INDEX Eine Masken- Komponente
GL_DEPTH_COMPONENT Eine Farbtiefen-Wert Farbkomponente


Der Parameter type gibt an, wieviel Speicherplatz für eine Komponente eines Pixels reserviert wurde

Name Datentype
GL_UNSIGNED_BYTE unsigned 8-bit integer
GL_BYTE signed 8-bit integer
GL_BITMAP single bits in unsigned 8-bit integers
GL_UNSIGNED_SHORT unsigned 16-bit integer
GL_SHORT signed 16-bit integer
GL_UNSIGNED_INT unsigned 32-bit integer
GL_INT 32-bit integer
GL_FLOAT single-precision floating point

Beispiel: wenn das Format GL_RGBA ist und als type GL_INT (32 bit) eingegeben wurde, dann braucht jedes Pixel einen Speicher von 16 bytes (4 Komponenten x 4 bytes)

Hinweise

Werte von Pixeln außerhalb des Fensters, das mit dem aktuellen GL-Kontext verbunden ist, sind undefiniert.

Wenn ein Fehler bei der Durchführung der Funktion auftritt, werden keine Veränderungen am Inhalt von pixels durchgeführt.


Fehlermeldungen

GL_INVALID_ENUM wird generiert wenn format oder type ein ungültiger Wert übergeben wird.
GL_INVALID_VALUE wird generiert wenn entweder width oder height negativ ist.
GL_INVALID_OPERATION wird generiert wenn format GL_COLOR_INDEX ist und der Farbpuffer RGBA Werte enthält.
GL_INVALID_OPERATION wird generiert wenn format GL_STENCIL_INDEX ist und kein Schablonen-(/Stencil-)Puffer existiert.
GL_INVALID_OPERATION wird generiert wenn format GL_DEPTH_COMPONENT ist und kein Tiefenpuffer existiert.
GL_INVALID_OPERATION wird generiert wenn glDrawPixels innerhalb eines glBegin-glEnd Blocks aufgerufen wird.


Zugehörige Wertrückgaben

glGet mit Token GL_INDEX_MODE


Siehe auch

glCopyPixels, glReadPixels, glPixelMap, glPixelStore, glPixelTransfer, glReadBuffer