glDrawPixels 函数

glDrawPixels 函数将像素块写入 framebuffer。

语法

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

parameters

width

将写入帧缓冲区的像素矩形的宽度尺寸。

height

将写入帧缓冲区的像素矩形的高度维度。

format

像素数据的格式。 可接受的符号常量如下所示。

含义
GL_COLOR_INDEX
每个像素都是一个值,即一个颜色索引。
  1. glDrawPixels 函数将每个像素转换为定点格式,二进制点右侧有未指定的位数,而不考虑内存数据类型。 浮点值转换为真正的定点值。 glDrawPixels 函数转换所有小数位都设置为零的有符号和无符号整数数据。 函数将位图数据转换为 0.0 或 1.0。
  2. glDrawPixels 函数将左GL_INDEX_SHIFT位的每个定点索引移动,并将其添加到GL_INDEX_OFFSET。 如果GL_INDEX_SHIFT为负值,则向右移动。 在任一情况下,零位填充结果中其他未指定的位位置。
  3. 在 RGBA 模式下, glDrawPixels 使用 GL_PIXEL_MAP_I_TO_R、GL_PIXEL_MAP_I_TO_G、GL_PIXEL_MAP_I_TO_B 和 GL_PIXEL_MAP_I_TO_A 表将生成的索引转换为 RGBA 像素。 如果处于颜色索引模式且GL_MAP_COLOR为 true,则索引将替换为GL_PIXEL_MAP_I_TO_I查找表中 glDrawPixels 引用的值。
  4. 无论索引的查找替换是否完成,索引的整数部分都是 AND2b - 1,其中 b 是颜色索引缓冲区中的位数。
  5. 然后将生成的索引或 RGBA 颜色转换为片段,方法是将当前光栅位置 z 坐标和纹理坐标附加到每个像素,然后将 xy 窗口坐标分配给 第 n个片段,使 x? = xr + n mod width
    y? = yr + n/width
    其中 (xryr ) 是当前光栅位置。
  6. glDrawPixels 函数将这些像素片段视为光栅化点、线条或多边形所生成的片段。 在将片段写入 framebuffer 之前,它会应用纹理映射、雾化和所有片段操作。
GL_STENCIL_INDEX
每个像素都是单个值,即模具索引。
  1. 无论内存数据类型如何, glDrawPixels 函数都会将其转换为定点格式,二进制点右侧有未指定的位数。 浮点值转换为真正的定点值。 glDrawPixels 函数转换所有小数位都设置为零的有符号和无符号整数数据。 位图数据转换为 0.0 或 1.0。
  2. glDrawPixels 函数按GL_INDEX_SHIFT位移动剩余的每个定点索引,并将其添加到GL_INDEX_OFFSET。 如果GL_INDEX_SHIFT为负值,则向右移动。 在任一情况下,零位填充结果中其他未指定的位位置。
  3. 如果GL_MAP_STENCIL为 true,则索引将替换为GL_PIXEL_MAP_S_TO_S查找表中 glDrawPixel 引用 的值。
  4. 无论索引的查找替换是否完成,索引的整数部分都是使用 2b - 1 的 ANDed,其中 b 是模具缓冲区中的位数。 然后将生成的模具索引写入模具缓冲区,以便将 n个索引写入位置 x? = xr + n mod width
    y? = yr + n/width
    其中, (xr ,yr ) 是当前光栅位置。 只有像素所有权测试、剪刀测试和模具写掩码会影响这些写入。
GL_DEPTH_COMPONENT
每个像素都是单深度分量。
  1. glDrawPixels 函数将浮点数据直接转换为具有未指定精度的内部浮点格式。 带符号整数数据以线性方式映射到内部浮点格式,使最正的可表示整数值映射到 1.0,而最负的可表示值映射到 -1.0。 无符号整数数据的映射方式类似:最大整数值映射到 1.0,零映射到 0.0。
  2. glDrawPixels 函数将生成的浮点深度值乘以GL_DEPTH_SCALE并将其添加到GL_DEPTH_BIAS。 结果被固定到 [0,1] 范围。
  3. glDrawPixels 函数将生成的深度分量转换为片段,方法是将当前光栅位置颜色或颜色索引和纹理坐标附加到每个像素,然后将 xy 窗口坐标分配给第 n 个片段,这样 x? = xr + n mod width
    y? = yr + n/width
    其中, (x ryr ) 是当前光栅位置。
  4. 然后,这些像素片段的处理方式与光栅化点、线条或多边形生成的片段一样。 glDrawPixels 函数在将片段写入 framebuffer 之前应用纹理映射、雾化和所有片段操作。
GL_RGBA
每个像素按以下顺序为四分量组:红色、绿色、蓝色、alpha。
  1. glDrawPixels 函数将浮点值直接转换为具有未指定精度的内部浮点格式。 有符号整数值以线性方式映射到内部浮点格式,使最正的可表示整数值映射到 1.0,而最负的可表示值映射到 -1.0。 无符号整数数据的映射方式类似:最大整数值映射到 1.0,零映射到 0.0。
  2. glDrawPixels 函数将生成的浮点颜色值乘以GL_c_SCALE,并将其添加到GL_c_BIAS,其中 c 为红色、绿色、蓝色和 ALPHA(对于相应的颜色分量)。 结果被固定到 [0,1] 范围内。
  3. 如果GL_MAP_COLOR为 true, 则 glDrawPixels 按查找表GL_PIXEL_MAP_c_TO_c的大小缩放每个颜色分量,然后用它在表中引用的值替换该组件; c 分别为 R、G、B 或 A。
  4. glDrawPixels 函数将生成的 RGBA 颜色转换为片段,方法是将当前光栅位置 z 坐标和纹理坐标附加到每个像素,然后将 xy 窗口坐标分配给第 n个片段,这样 x? = xr + n mod width
    y? = yr + n /width
    其中, (xr ,yr ) 是当前光栅位置。
  5. 然后,这些像素片段的处理方式与光栅化点、线条或多边形生成的片段一样。 glDrawPixels 函数在将片段写入 framebuffer 之前应用纹理映射、雾化和所有片段操作。
GL_RED
每个像素都是一个红色分量。
glDrawPixels 函数以与 RGBA 像素的红色分量相同的方式将此分量转换为内部浮点格式,然后将其转换为绿色和蓝色设置为 0.0、alpha 设置为 1.0 的 RGBA 像素。 在此转换后,像素被视为已读取 RGBA 像素一样。
GL_GREEN
每个像素都是一个绿色分量。
glDrawPixels 函数将此分量转换为内部浮点格式,其方式与 RGBA 像素的绿色分量相同,然后将其转换为 RGBA 像素,其中红色和蓝色设置为 0.0,alpha 设置为 1.0。 在此转换后,像素被视为已读取 RGBA 像素一样。
GL_BLUE
每个像素都是一个蓝色分量。
glDrawPixels 函数将此分量转换为内部浮点格式,其方式与 RGBA 像素的蓝色分量相同,然后将其转换为红色和绿色设置为 0.0、alpha 设置为 1.0 的 RGBA 像素。 在此转换后,像素被视为已读取 RGBA 像素一样。
GL_ALPHA
每个像素都是一个 alpha 分量。
glDrawPixels 函数将此分量转换为内部浮点格式,其方式与 RGBA 像素的 alpha 分量相同,然后将其转换为红色、绿色和蓝色设置为 0.0 的 RGBA 像素。 在此转换后,像素被视为已读取 RGBA 像素一样。
GL_RGB
每个像素按以下顺序由三个分量组成:红色、绿色、蓝色。 glDrawPixels 函数将每个分量转换为内部浮点格式,其方式与 RGBA 像素的红色、绿色和蓝色分量相同。 颜色三重转换为 alpha 设置为 1.0 的 RGBA 像素。 此转换后,将像将其读取为 RGBA 像素一样处理像素。
GL_LUMINANCE
每个像素都是单个亮度分量。
glDrawPixels 函数将此分量转换为内部浮点格式,其方式与 RGBA 像素的红色分量相同,然后将其转换为 RGBA 像素,其中红色、绿色和蓝色设置为转换后的亮度值,alpha 设置为 1.0。 此转换后,将像将其读取为 RGBA 像素一样处理像素。
GL_LUMINANCE_ALPHA
每个像素是按以下顺序由两个分量构成的一组:亮度、alpha。
glDrawPixels 函数将两个分量转换为内部浮点格式,其方式与 RGBA 像素的红色分量相同,然后将其转换为 RGBA 像素,其中红色、绿色和蓝色设置为转换后的亮度值,alpha 设置为转换后的 alpha 值。 此转换后,将像将其读取为 RGBA 像素一样处理像素。
GL_BGR_EXT
每个像素是一组三个分量,按以下顺序排列:蓝色、绿色、红色。
GL_BGR_EXT提供的格式与 windows 设备无关位图 (DDB) 的内存布局相匹配。 因此,应用程序可以通过 Windows 函数调用和 OpenGL 像素函数调用使用相同的数据。
GL_BGRA_EXT
每个像素都是一组四个分量,按以下顺序排列:蓝色、绿色、红色、alpha。
GL_BGRA_EXT提供的格式与与 windows 设备无关的位图 (DDB) 的内存布局相匹配。 因此,应用程序可以通过 Windows 函数调用和 OpenGL 像素函数调用使用相同的数据。

type

像素的数据类型。 以下是接受的符号常量及其含义。

含义
GL_UNSIGNED_BYTE
无符号的 8 位整数
GL_BYTE
8 位带符号整数
GL_BITMAP
无符号 8 位整数中的单位
GL_UNSIGNED_SHORT
无符号 16 位整数
GL_SHORT
有符号 16 位整数
GL_UNSIGNED_INT
无符号的 32 位整数
GL_INT
32-bit integer
GL_FLOAT
单精度浮点

像素

指向像素数据的指针。

返回值

此函数不返回值。

错误代码

glGetError 函数可以检索以下错误代码。

名称 含义
GL_INVALID_VALUE
宽度高度为负值。
GL_INVALID_ENUM
格式类型不是接受的值。
GL_INVALID_OPERATION
format 为 GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_RGB、GL_RGBA、GL_BGR_EXT、GL_BGRA_EXT、GL_LUMINANCE 或 GL_LUMINANCE_ALPHA,OpenGL 处于颜色索引模式。
GL_INVALID_ENUM
type 已GL_BITMAP, 并且格式 不是GL_COLOR_INDEX或GL_STENCIL_INDEX。
GL_INVALID_OPERATION
格式 已GL_STENCIL_INDEX,并且没有模具缓冲区。
GL_INVALID_OPERATION
函数是在 对 glBegin 的调用和对 glEnd 的相应调用之间调用的。

备注

glDrawPixels 函数从内存中读取像素数据,并将其写入到相对于当前光栅位置的帧缓冲区中。 使用 glRasterPos 设置当前光栅位置,并使用 glGet 和参数GL_CURRENT_RASTER_POSITION查询光栅位置。

多个参数定义内存中像素数据的编码,并控制将像素数据放入帧缓冲区之前对其进行处理。 这些参数设置有四个函数: glPixelStoreglPixelTransferglPixelMapglPixelZoom。 本主题介绍这四个函数指定的许多(但不是全部)参数对 glDrawPixel 的影响。

数据以有符号或无符号字节、有符号或无符号短、有符号或无符号整数或单精度浮点值序列的形式从 像素 中读取,具体取决于 类型。 其中每个字节、短号、整数或浮点值都解释为一个颜色或深度分量或一个索引,具体取决于 格式。 始终单独处理索引。 颜色分量被视为包含一个、两个、三个或四个值的组,同样基于 格式。 单个索引和组件组都称为像素。 如果 type 为 GL_BITMAP,则数据必须是无符号字节,并且 格式 必须为GL_COLOR_INDEX或GL_STENCIL_INDEX。 每个无符号字节被视为 8 个 1 位像素,位排序由GL_UNPACK_LSB_FIRST (请参阅 glPixelStore) 。

从内存中读取 宽度高度 像素,从位置 像素开始。 默认情况下,这些像素取自相邻的内存位置,不同之处在于读取所有 宽度 像素后,读取指针会提前到下一个 4 字节边界。 glPixelStore 函数使用参数GL_UNPACK_ALIGNMENT指定 4 字节行对齐方式,可以将其设置为 1、2、4 或 8 个字节。 其他像素存储参数指定不同的读取指针提升,包括读取第一个像素之前和读取所有 宽度 像素之后。 glPixelStore 函数根据 glPixelTransferglPixelMap 指定的多个参数的值,以相同的方式对从内存中读取的每个逐高像素进行操作。 这些操作的详细信息以及将像素绘制到的目标缓冲区特定于由 format 指定的像素 格式

到目前为止,所述的光栅化假定像素缩放系数为 1.0。 如果使用 glPixelZoom 更改 xy 像素缩放系数,则像素将转换为片段,如下所示。 如果 (xr,yr) 是当前光栅位置,并且给定的像素位于像素矩形的第 n列和第 m行中,则为中心位于角处的矩形中的像素生成片段

(xr + 缩放nyr + 缩放ym)

(xr + 缩放? (n + 1) , yr + 缩放y (m + 1) )

在哪里缩放?是 GL_ZOOM_X 的值,缩放y 是 GL_ZOOM_Y 的值。

以下函数检索与 glDrawPixels 相关的信息:

带参数GL_CURRENT_RASTER_POSITION的 glGet

带参数GL_CURRENT_RASTER_POSITION_VALID的 glGet

要求

要求
最低受支持的客户端
Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器
Windows 2000 Server [仅限桌面应用]
标头
Gl.h

Opengl32.lib
DLL
Opengl32.dll

另请参阅

glAlphaFunc

glBegin

glBlendFunc

glCopyPixels

glDepthFunc

glEnd

glGet

glLogicOp

glPixelMap

glPixelStore

glPixelTransfer

glPixelZoom

glRasterPos

glReadPixels

glScissor

glStencilFunc