glDrawPixels

NAME

glDrawPixels - write a block of pixels to the frame buffer

C SPECIFICATION

void glDrawPixels(GLsizei width,
                  GLsizei height,
                  GLenum format,
                  GLenum type,
                  const GLvoid *pixels)

PARAMETERS

width, height Specify the dimensions of the pixel rectangle to be written into the frame buffer.
format Specifies the format of the pixel data. The allowable values are GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA, GL_BGR_EXT, GL_BGRA_EXT, GL_ARGB_I3D, GL_422_EXT, GL_422_REV_EXT, GL_422_AVERAGE_EXT, and GL_422_REV_AVERAGE_EXT.
type Specifies the data type for pixel data. The allowable values are GL_BITMAP, GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2_EXT, GL_UNSIGNED_BYTE_2_3_3_REV_EXT, GL_UNSIGNED_SHORT_5_6_5_EXT, GL_UNSIGNED_SHORT_5_6_5_REV_EXT, GL_UNSIGNED_SHORT_4_4_4_4_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_UNSIGNED_SHORT_5_5_5_1_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_UNSIGNED_INT_8_8_8_8_EXT, GL_UNSIGNED_INT_8_8_8_8_REV_EXT, GL_UNSIGNED_INT_10_10_10_2_EXT, and GL_UNSIGNED_INT_2_10_10_10_REV_EXT.
pixels Specifies a pointer to the pixel data.

DESCRIPTION

glDrawPixels reads pixel data from memory and writes it into the frame buffer relative to the current raster position. Use glRasterPos to set the current raster position; use glGet with argument GL_CURRENT_RASTER_POSITION to query the raster position.

Several parameters define the encoding of pixel data in memory and control the processing of the pixel data before it is placed in the frame buffer. These parameters are set with four commands: glPixelStore, glPixelTransfer, glPixelMap, and glPixelZoom. This reference page describes the effects on glDrawPixels of many, but not all, of the parameters specified by these four commands.

Data is read from pixels as a sequence of signed or unsigned bytes, signed or unsigned shorts, signed or unsigned integers, or single-precision floating-point values, depending on type. The following table summarizes the meaning of the valid constants for the type parameter:

type Corresponding Type
GL_UNSIGNED_BYTEunsigned 8-bit integer
GL_BYTEsigned 8-bit integer
GL_BITMAPsingle bits in unsigned 8-bit integers
GL_UNSIGNED_SHORTunsigned 16-bit integer
GL_SHORTsigned 16-bit integer
GL_UNSIGNED_INTunsigned 32-bit integer
GL_INT32-bit integer
GL_FLOATsingle-precision floating-point
GL_UNSIGNED_BYTE_3_3_2_EXTunsigned 8-bit integer
GL_UNSIGNED_BYTE_2_3_3_REV_EXTunsigned 8-bit integer
GL_UNSIGNED_SHORT_5_6_5_EXTunsigned 16-bit integer
GL_UNSIGNED_SHORT_5_6_5_REV_EXTunsigned 16-bit integer
GL_UNSIGNED_SHORT_4_4_4_4_EXTunsigned 16-bit integer
GL_UNSIGNED_SHORT_4_4_4_4_REV_EXTunsigned 16-bit integer
GL_UNSIGNED_SHORT_5_5_5_1_EXTunsigned 16-bit integer
GL_UNSIGNED_SHORT_1_5_5_5_REV_EXTunsigned 16-bit integer
GL_UNSIGNED_INT_8_8_8_8_EXTunsigned 32-bit integer
GL_UNSIGNED_INT_8_8_8_8_REV_EXTunsigned 32-bit integer
GL_UNSIGNED_INT_10_10_10_2_EXTunsigned 32-bit integer
GL_UNSIGNED_INT_2_10_10_10_REV_EXTunsigned 32-bit integer

If type is GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, or GL_FLOAT, the data is read as a sequence of signed or unsigned bytes, shorts, or integers, or single-precision floating-point values. Each of these bytes, shorts, integers, or floating-point values is interpreted as one color component, one depth component, or one index, depending on format. Indices are always treated individually. Colors are treated as groups of one, two, three, or four elements, again based on format. Both individual indices and groups of components are referred to as pixels.

If type is GL_UNSIGNED_BYTE_3_3_2_EXT, GL_UNSIGNED_BYTE_2_3_3_REV_EXT, GL_UNSIGNED_SHORT_5_6_5_EXT, GL_UNSIGNED_SHORT_5_6_5_REV_EXT, GL_UNSIGNED_SHORT_4_4_4_4_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_UNSIGNED_SHORT_5_5_5_1_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_UNSIGNED_INT_8_8_8_8_EXT, GL_UNSIGNED_INT_8_8_8_8_REV_EXT, GL_UNSIGNED_INT_10_10_10_2_EXT, or GL_UNSIGNED_INT_2_10_10_10_REV_EXT, all the elements of each group are read from a single unsigned byte, unsigned short, or unsigned int. The number of elements per packed pixel is fixed by type, and must match the number of elements per group indicated by format.

The following table shows which values of format are valid for each of the packed pixel types:

type Number of Elements Format
GL_UNSIGNED_BYTE_3_3_2_EXT3GL_RGB
GL_UNSIGNED_BYTE_2_3_3_REV_EXT3GL_RGB
GL_UNSIGNED_SHORT_5_6_5_EXT3GL_RGB
GL_UNSIGNED_SHORT_5_6_5_REV_EXT3GL_RGB
GL_UNSIGNED_SHORT_4_4_4_4_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_SHORT_5_5_5_1_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_INT_8_8_8_8_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_INT_8_8_8_8_REV_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_INT_10_10_10_2_EXT4GL_RGBA, GL_BGRA_EXT
GL_UNSIGNED_INT_2_10_10_10_REV_EXT4GL_RGBA, GL_BGRA_EXT

The elements in a packed pixel are ordered such that the first element is in the most-significant bits, followed by the second element, etc. For example, if type is set to GL_UNSIGNED_SHORT_4_4_4_4_EXT then element 1 is read from bits 15-12, element 2 is read from bits 11-8, element 3 is read from bits 7-4 and element 4 is read from bits 3-0.

The elements in a reversed packed pixel are ordered such that the first element is in the least-significant bits, followed by the second element, etc. For example, if type is set to GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT then element 1 is read from bits 0-3, element 2 is read from bits 4-7, element 3 is read from bits 8-11 and element 4 is read from bits 12-15.

If type is GL_BITMAP, the data must be unsigned bytes, and format must be either GL_COLOR_INDEX or GL_STENCIL_INDEX. Each unsigned byte is treated as eight 1-bit pixels, with bit ordering determined by GL_UNPACK_LSB_FIRST (see glPixelStore).

A total of width times height pixels are read from memory, starting at location pixels. By default, these pixels are taken from adjacent memory locations, except that after all width pixels are read, the read pointer is advanced to the next four-byte boundary. The four-byte row alignment is specified by glPixelStore with argument GL_UNPACK_ALIGNMENT, and it can be set to one, two, four, or eight bytes. Other pixel store parameters specify different read pointer advancements, both before the first pixel is read and after all width pixels are read. See the glPixelStore reference page for details on these options.

Pixels that are read from memory are each operated on in the same way, based on the values of several parameters specified by glPixelTransfer and glPixelMap. The details of these operations, as well as the target buffer into which the pixels are drawn, are specific to the format of the pixels, as specified by format. format can assume one of the following symbolic values:

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 0. Bitmap data convert to either 0 or 1.

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 with the help of 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 GL then converts the resulting indices or RGBA colors 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

xn = xr + n MOD width
yn = yr + n / width |

where (xr, yr) 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 0. Bitmap data convert to either 0 or 1.

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

xn = xr + n MOD width
yn = yr + n / width |

where (xr, yr) is the current raster position. Only the pixel ownership test, the scissor test, and the stencil writemask affect these write operations.

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 0 maps to 0.0. The resulting floating-point depth value is then multiplied by by GL_DEPTH_SCALE and added to GL_DEPTH_BIAS. The result is clamped to the range [0,1].

The GL then converts the resulting depth components 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

xn = xr + n MOD width
yn = yr + n / width |

where (xr, yr) 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
Each pixel is a four-component group: for GL_RGBA, the red component is first, followed by green, followed by blue, followed by alpha. Floating-point values are converted directly to an internal floating-point format with unspecified precision. Signed integer values are 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. (Note that this mapping does not convert 0 precisely to 0.0.) Unsigned integer data is mapped similarly: the largest integer value maps to 1.0, and 0 maps to 0.0. The resulting floating-point color values are then multiplied by GL_c_SCALE and added to GL_c_BIAS, where c is RED, GREEN, BLUE, and ALPHA for the respective color components.

If GL_MAP_COLOR is true, each color component is clamped to the range [0,1] and 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.

If GL_COLOR_TABLE_EXT is true, each color component is clamped to the range [0,1] and scaled by the size of the GL_COLOR_TABLE_EXT, then replaced by the value that it references in that table according to the format of the color table (see glColorTableEXT).

If GL_CONVOLUTION_2D_EXT or GL_SEPARABLE_2D_EXT is true, two-dimensional convolution will be performed on each color component according to the format of the convolution filter (see glConvolutionFilter2DEXT and glSeparableFilter2DEXT).

If GL_POST_CONVOLUTION_COLOR_TABLE_EXT is true, each color component is clamped to the range [0,1] and scaled by the size of the GL_POST_CONVOLUTION_COLOR_TABLE_EXT, then replaced by the value that it references in that table according to the format of the color table (see glColorTableEXT).

Each color is then transformed by the color matrix (see glMatrixMode).

If GL_POST_COLOR_MATRIX_COLOR_TABLE_EXT is true, each color component is clamped to the range [0,1] and scaled by the size of the GL_POST_COLOR_MATRIX_COLOR_TABLE_EXT, then replaced by the value that it references in that table according to the format of the color table (see glColorTableEXT).

Each color is then clamped to the color clamp values (see glPixelTransfer).

The GL then converts the resulting RGBA colors to fragments by attaching the current raster position z coordinate and texture coordinates to each pixel.

If GL_PIXEL_TEX_GEN_EXT, the image RGBA color is used as the texture coordinates for the fragment and the image color is replaced according to the pixel texture generation mode (see glPixelTexGenEXT).

Window coordinates x and y are assigned to the nth fragment according to the following equations:

xn = xr + n MOD width
yn = yr + n / width |

where (xr, yr) is the current raster position. If GL_INTERLACE_EXT is enabled, the yn window coordinates is calculated as follows:

yn = yr + 2 * n / width |

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
Each pixel is a single red component. This component is converted to the internal floating-point format in the same way the red component of an RGBA pixel is. It is then converted to an RGBA pixel with green and blue set to 0, and alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_GREEN
Each pixel is a single green component. This component is converted to the internal floating-point format in the same way the green component of an RGBA pixel is. It is then converted to an RGBA pixel with red and blue set to 0, and alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_BLUE
Each pixel is a single blue component. This component is converted to the internal floating-point format in the same way the blue component of an RGBA pixel is. It is then converted to an RGBA pixel with red and green set to 0, and alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_ALPHA
Each pixel is a single alpha component. This component is converted to the internal floating-point format in the same way the alpha component of an RGBA pixel is. It is then converted to an RGBA pixel with red, green, and blue set to 0. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_LUMINANCE
Each pixel is a single luminance component. This component is converted to the internal floating-point format in the same way the red component of an RGBA pixel is. It is then converted to an RGBA pixel with red, green, and blue set to the converted luminance value, and alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_LUMINANCE_ALPHA
Each pixel is a two-component group: luminance first, followed by alpha. The two components are converted to the internal floating-point format in the same way the red component of an RGBA pixel is. They are then converted to an RGBA pixel with red, green, and blue set to the converted luminance value, and alpha set to the converted alpha value. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_RGB
Each pixel is a three-component group: red first, followed by green, followed by blue. Each component is converted to the internal floating-point format in the same way the red, green, and blue components of an RGBA pixel are. The color triple is converted to an RGBA pixel with alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_BGR_EXT
Each pixel is a three-component group: blue first, followed by green, followed by red. Each component is converted to the internal floating-point format in the same way the red, green, and blue components of an RGBA pixel are. The color triple is converted to an RGBA pixel with alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_BGRA_EXT
Each pixel is a four-component group: blue first, followed by green, followed by red, followed by alpha. Each component is converted to the internal floating-point format in the same way the red, green, and blue components of an RGBA pixel are. The pixel is then treated as if it had been read as an RGBA pixel.

GL_ARGB_I3D
Each pixel is a four-component group: alpha first, followed by red, followed by green, followed by blue. Each component is converted to the internal floating-point format in the same way the red, green, and blue components of an RGBA pixel are. The pixel is then treated as if it had been read as an RGBA pixel.

GL_422_EXT
Each pixel is a two-component group: chrominance first, followed by luminance. Only an even number of pixels are processed. Luminance is present on all pixels; a full chrominance value requires two pixels. Each component is converted to the internal floating-point format in the same way the red component of an RGBA pixel is. They are then converted to an RGBA pixel with red set to converted luminance value, green set to the even pixel's converted chrominance value, blue set to the odd pixel's converted chrominance value, and alpha set to 1. After this conversion, the pixel is treated as if it had been read as an RGBA pixel.

GL_422_REV_EXT
Each pixel is a two-component group: luminance first, followed by chrominance. Conversion to RGBA then follows the conversion of the GL_422_EXT format.

GL_422_AVERAGE_EXT
Each pixel is a two-component group: chrominance first, followed by luminance. Only an even number of pixels are processed. Luminance is present on all pixels; a full chrominance value requires two pixels. Each component is converted to the internal floating-point format in the same way the red component of an RGBA pixel is. They are then converted to an RGBA pixel according to the following.

For even pixels, red is set to converted luminance value, green is set to the even pixel's converted chrominance value, blue is set to the odd pixel's converted chrominance value, and alpha is set to 1.

For odd pixels, red is set to converted luminance value, green is set to the average of the even pixel's converted chrominance and the next even pixel's converted chrominance value, blue is set to the average of the odd pixel's converted chrominance and the next odd pixel's converted chrominance, and alpha is set to 1. If the next even or odd pixel does not exist, the behavior of the odd pixel is the same as the GL_422_EXT format.

GL_422_REV_AVERAGE_EXT
Each pixel is a two-component group: luminance first, followed by chrominance. Conversion to RGBA then follows the conversion of the GL_422_AVERAGE_EXT format.

The rasterization described so far assumes pixel zoom factors of 1. If glPixelZoom is used to change the x and y pixel zoom factors, pixels are converted to fragments as follows. If (xr, yr) is the current raster position, and a given pixel is in the nth column and mth row of the pixel rectangle, then fragments are generated for pixels whose centers are in the rectangle with corners at

(xr + zoomxn, yr + zoomym)
(xr + zoomx (n + 1), yr + zoomy (m + 1))

where zoomx is the value of GL_ZOOM_X and zoomy is the value of GL_ZOOM_Y.

EXTENSIONS

Some routines and constants for this function are part of an extension, not part of the core GL command set. The following extension names must be present in the string returned by glGetString when called with argument GL_EXTENSIONS to use these routines and constants.
GL_EXT_422_pixels
GL_422_EXT, GL_422_REV_EXT, GL_422_AVERAGE_EXT, and GL_422_REV_AVERAGE_EXT are part of the EXT_422_pixels extension.

GL_I3D_argb
GL_ARGB_I3D is part of the I3D_argb extension.

GL_EXT_bgra
GL_BGR_EXT and GL_BGRA_EXT are part of the EXT_bgra extension.

GL_I3D_color_clamp
The color clamp is part of the I3D_color_clamp extension.

GL_EXT_color_matrix
The color matrix is part of the EXT_color_matrix extension.

GL_EXT_color_table
GL_COLOR_TABLE_EXT, GL_POST_CONVOLUTION_COLOR_TABLE_EXT, and GL_POST_COLOR_MATRIX_COLOR_TABLE_EXT are part of the EXT_color_table extension.

GL_EXT_convolution
GL_CONVOLUTION_2D_EXT and GL_SEPARABLE_2D_EXT are part of the EXT_convolution extension.

EXT_interlace
GL_INTERLACE_EXT is part of the EXT_interlace extension.

GL_EXT_packed_pixels
GL_UNSIGNED_BYTE_3_3_2_EXT, GL_UNSIGNED_BYTE_2_3_3_REV_EXT, GL_UNSIGNED_SHORT_5_6_5_EXT, GL_UNSIGNED_SHORT_5_6_5_REV_EXT, GL_UNSIGNED_SHORT_4_4_4_4_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_UNSIGNED_SHORT_5_5_5_1_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_UNSIGNED_INT_8_8_8_8_EXT, GL_UNSIGNED_INT_8_8_8_8_REV_EXT, GL_UNSIGNED_INT_10_10_10_2_EXT, and GL_UNSIGNED_INT_2_10_10_10_REV_EXT are part of the EXT_packed_pixels extension.

GL_EXT_pixel_texture
GL_PIXEL_TEX_GEN_EXT is part of the EXT_pixel_texture extension.

ERRORS

GL_INVALID_VALUE is generated if either width or height is negative.

GL_INVALID_ENUM is generated if format or type is not one of the accepted values.

GL_INVALID_OPERATION is generated if format is GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_BGR_EXT, GL_BGRA_EXT, GL_ARGB_I3D, GL_LUMINANCE, or GL_LUMINANCE_ALPHA, and the GL is in color index mode.

GL_INVALID_ENUM is generated if type is GL_BITMAP and format is not either GL_COLOR_INDEX or GL_STENCIL_INDEX.

GL_INVALID_OPERATION is generated if format is GL_STENCIL_INDEX and there is no stencil buffer.

GL_INVALID_OPERATION is generated if glDrawPixels is executed between the execution of glBegin and the corresponding execution of glEnd.

ASSOCIATED GETS

glGet with argument GL_CURRENT_RASTER_POSITION
glGet with argument GL_CURRENT_RASTER_POSITION_VALID

SEE ALSO

glAlphaFunc, glBlendFunc, glCopyPixels, glDepthFunc, glLogicOp, glPixelMap, glPixelStore, glPixelTransfer, glPixelZoom, glRasterPos, glReadPixels, glScissor, glStencilFunc