glCopyPixels 函数

glCopyPixels 函数复制 framebuffer 中的像素。

语法

void WINAPI glCopyPixels(
   GLint   x,
   GLint   y,
   GLsizei width,
   GLsizei height,
   GLenum  type
);

参数

x

要复制的像素矩形区域左下角的窗口 x 平面坐标。

y

要复制的像素矩形区域左下角的窗口 y 平面坐标。

width

要复制的像素的矩形区域的宽度尺寸。 必须为非负数。

height

要复制的像素的矩形区域的高度维度。 必须为非负数。

type

指定 glCopyPixels 是复制颜色值、深度值还是模具值。 可接受的符号常量为 。

含义
GL_COLOR
glCopyPixels 函数从当前指定为读取源缓冲区的缓冲区读取索引或 RGBA 颜色, (请参阅 glReadBuffer) 。
如果 OpenGL 处于颜色索引模式:
  1. 从此缓冲区读取的每个索引都转换为固定点格式,二进制点右侧有未指定位数。
  2. 每个索引按GL_INDEX_SHIFT位向左移动,并添加到GL_INDEX_OFFSET。如果GL_INDEX_SHIFT为负值,则向右移动。 在任一情况下,零位填充结果中其他未指定的位位置。
  3. 如果GL_MAP_COLOR为 true,则索引将替换为它在查阅表中GL_PIXEL_MAP_I_TO_I引用的值。
  4. 无论索引的查找替换是否完成,索引的整数部分都是使用 2b 1 的 ANDed,其中 b 是颜色索引缓冲区中的位数。
如果 OpenGL 处于 RGBA 模式:
  1. 读取的每个像素的红色、绿色、蓝色和 alpha 分量将转换为具有未指定精度的内部浮点格式。
  2. 转换将可表示的最大组件值映射到 1.0,将组件值 0 映射到 0.0。
  3. 然后,生成的浮点颜色值乘以GL_c_SCALE并添加到GL_c_BIAS,其中 c 为相应颜色成分的 RED、GREEN、BLUE 和 ALPHA。
  4. 结果被固定到 [0,1] 范围内。
  5. 如果GL_MAP_COLOR为 true,则每个颜色分量按查找表GL_PIXEL_MAP_c_TO_c的大小缩放,然后替换为它在该表中引用的值; c 分别为 R、G、B 或 A。 然后将生成的索引或 RGBA 颜色转换为片段,方法是将当前光栅位置 z 坐标和纹理坐标附加到每个像素,然后将窗口坐标 (xr + i、yr + j) ,其中 (xryr ) 是当前光栅位置,而像素是 j 行中 i 位置中的像素。 然后,这些像素片段的处理方式与光栅化点、线条或多边形生成的片段一样。 在将片段写入帧缓冲区之前,将应用纹理映射、迷雾和所有片段操作。
GL_DEPTH
深度值从深度缓冲区中读取,并直接转换为具有未指定精度的内部浮点格式。 然后将生成的浮点深度值乘以GL_DEPTH_SCALE并添加到GL_DEPTH_BIAS。 结果被固定到 [0,1] 范围。
然后将生成的深度分量转换为片段,方法是将当前光栅位置颜色或颜色索引和纹理坐标附加到每个像素,然后将窗口坐标 (xr + i,yr + j) ,其中 (xryr ) 是当前光栅位置,像素是 j 行中 i 位置的像素。 然后,这些像素片段的处理方式与光栅化点、线条或多边形生成的片段一样。 在将片段写入帧缓冲区之前,将应用纹理映射、迷雾和所有片段操作。
GL_STENCIL
模具索引从模具缓冲区读取,并转换为二进制点右侧具有未指定位数的内部定点格式。 然后,每个定点索引按GL_INDEX_SHIFT位向左移动,并添加到GL_INDEX_OFFSET。 如果GL_INDEX_SHIFT为负值,则向右移动。 在任一情况下,零位填充结果中其他未指定的位位置。 如果GL_MAP_STENCIL为 true,则索引将替换为它在查阅表中GL_PIXEL_MAP_S_TO_S引用的值。 无论索引的查找替换是否完成,索引的整数部分都是使用 2b - 1 的 ANDed,其中 b 是模具缓冲区中的位数。 然后将生成的模具索引写入模具缓冲区,以便从 j的 i 位置读取的索引写入到位置 (xr + iyr + j) ,其中 (x ryr ) 是当前光栅位置。 只有像素所有权测试、剪刀测试和模具写掩码会影响这些写入。

返回值

此函数不返回值。

错误代码

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

名称 含义
GL_INVALID_ENUM
type 不是接受的值。
GL_INVALID_VALUE
宽度或高度为负值。
GL_INVALID_OPERATION
type 为GL_DEPTH,并且没有深度缓冲区。
GL_INVALID_OPERATION
type 为GL_STENCIL,并且没有模具缓冲区。
GL_INVALID_OPERATION
在对 glBegin 的调用和对 glEnd 的相应调用之间调用了函数。

备注

glCopyPixels 函数将屏幕对齐的像素矩形从指定的 framebuffer 位置复制到相对于当前光栅位置的区域。 仅当整个像素源区域位于窗口的公开部分时,其操作才定义良好。 来自窗口外部或未公开的窗口区域的副本的结果依赖于硬件且未定义。

xy 参数指定要复制的矩形区域左下角的窗口坐标。 宽度高度参数指定要复制的矩形区域的尺寸。 宽度高度都必须是非否定的。

复制像素数据时,有几个参数控制像素数据的处理。 这些参数由三个函数设置: glPixelTransferglPixelMapglPixelZoom。 本主题介绍这三个函数指定的大多数(但不是全部)参数对 glCopyPixels 的影响。

glCopyPixels 函数从左下角 (x + iy + j) 的每个像素复制值,0 = i<宽度,0 = j<高度。 此像素称为 j 行中的 i 像素。 像素按行顺序从最低到最高行复制,每行从左到右复制。

type 参数指定是复制颜色、深度还是模具数据。

到目前为止,所描述的光栅化假定像素缩放系数为 1.0。 如果使用 glPixelZoom 更改 xy 像素缩放因子,则像素将转换为片段,如下所示。 如果 (xryr ) 是当前光栅位置,并且给定像素位于源像素矩形的 j 行中的 i 位置,则为中心位于矩形中且角位于矩形中的像素生成片段

(xr + zoom? i, yr + zoomyj)

(xr + 缩放? (i + 1) , yr + zoomy (j + 1) )

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

glPixelStore 指定的模式对 glCopyPixel 的操作没有影响。

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

带参数GL_CURRENT_RASTER_POSITION的 glGet

带参数GL_CURRENT_RASTER_POSITION_VALID的 glGet

若要将窗口左下角的颜色像素复制到当前光栅位置,请使用

glCopyPixels ( 0、0、1、1、GL_COLOR ) ;

要求

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

Opengl32.lib
DLL
Opengl32.dll

另请参阅

glBegin

glDepthFunc

glDrawBuffer

glDrawPixels

glEnd

glGet

glPixelMap

glPixelStore

glPixelTransfer

glPixelZoom

glRasterPos

glReadBuffer

glReadPixels

glStencilFunc