OpenGL系统设计-位图 字体(4) 读写像素

 

1.1        读写像素

OpenGL的图像(Image)操作实际上是对屏幕像素的直接处理,包括读取、写入、复制和缩放等。对像素的读取函数为glReadPixels,其原型如下:

 

void glReadPixels(

  GLint x,

  GLint y,

  GLsizei width,

  GLsizei height,

  GLenum format,

  GLenum type,

  GLvoid *pixels

);

 

x, y 表示从帧缓冲中读取的第一个像素的坐标值,位置是像素矩形块的左下角。width, height 表示像素矩形的宽度和高度,单位是像素。format 表示像素数据的格式,取值及含义如下表8-1所示。

 

8-1   图像像素格式

format取值

象素数据格式

GL_INDEX

单个颜色索引,来自于颜色缓存

GL_STENCIL_INDEX

单个模板索引,来自于模板缓存

GL_DEPTH_COMPONENT

单个深度分量、来自于深度缓存,取值界于0,1之间

GL_RED

单个红色分量

GL_GREEN

单个绿色分量

GL_BLUE

单个蓝色分量

GL_ALPHA

单个Alpha分量

GL_RGB

先是红色分量,再是绿色分量,然后是蓝色分量

GL_RGBA

红色分量,绿色分量,蓝色分量和Alpha分量

GL_BGR_EXT

先是蓝色分量,再是绿色分量,最后是红色分量

GL_BGRA_EXT

蓝色分量,绿色分量,红色分量和Alpha分量

GL_LUMINANCE

亮度分量

GL_LUMINANCE_ALPHA

先是亮度分量,然后是Alpha

 

type 表示像素数据的数据类型,取值如下表8-2所示。

  

8-2   图像数据类型

type取值

数据类型

分量的值

GL_UNSIGNED_BYTE

无符号的8位整数

(28–1)c

GL_BYTE

8位整数

[(27–1)c-1]/2

GL_BITMAP

无符号的8位整数数组中的单个数位

1

GL_UNSIGNED_SHORT

无符号的16位整数

(216–1) c

GL_SHORT

16位整数

[(215–1) c–1] / 2

GL_UNSIGNED_INT

无符号的32位整数

(232–1) c

GL_INT

32位整数

[(231–1) c–1] / 2

GL_FLOAT

单精度浮点数

c

 

pixels 是一指针,指向读取到的像素数据。

 

写像素的函数为glDrawPixels,其原型为:

 

 

void glDrawPixels(

  GLsizei width,

  GLsizei height,

  GLenum format,

  GLenum type,

  const GLvoid *pixels

);

 

其参数意义和glReadPixels中对应的参数完全相同,只是pixels是要写入的像素数据指针,并且写入的位置就是当前的光栅位置。

glReadPixels()glDrawPixels通常成对使用,联结两个函数的数据就是pixels参数。glReadPixels先把数据读取到内存中,然后glDrawPixels再把内存中的像素数据写到指定的位置。如果忽略pixels数据,则可以使用glCopyPixels()函数,它直接将屏幕的具体位置的图像像素复制到当前光栅位置上,其函数原型为:

 

void glCopyPixels(

  GLint x,

  GLint y,

  GLsizei width,

  GLsizei height,

  GLenum type

);

x, y 参数表示将被复制的矩形像素块矩形的左下角坐标, width, height表示被复制的像素矩形块的宽和高。 type 表示glCopyPixels是否复制颜色值,深度值或模板值。type的取值含义如下表8-3所示。

 

8-3     glCopyPixels复制数据说明

type取值

含义

GL_COLOR

从帧缓冲中指定的位置读取颜色索引(颜色索引表模式)或RGBA颜色值(RGBA模式)。

GL_DEPTH

从深度缓存中读取深度值并直接转换成浮点格式,再乘以GL_DEPTH_SCALE,加上GL_DEPTH_BIAS,结果圆整到 [0,1]间。 将当前光栅位置颜色或者颜色索引、纹理坐标应用到每一个像素,把深度结果转换成片元,分配给窗口坐标(xr + iyr + j),其中(xr, yr)是当前光栅位置,像素是第j行的第i个像素。这些像素片元就象是光栅化的点、线、多边形一样的处理。所有的纹理映射、雾化处理以及片元操作都在这些片元写入到帧缓冲前进行。

GL_STENCIL

将模板索引值从模板缓存读出转换成内部的固定格式,然后左移GL_INDEX_SHIFT位,加上GL_INDEX_OFFSET。若GL_INDEX_SHIFT为负则表示右移,结果再写回帧缓冲。

 

例如,若将窗口的作下角的像素颜色值复制到当前光栅位置,就可以这样来实现。

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

影响glReadPixelsglDrawPixelsglCopyPixels的几个参数的设置函数是glPixelTransfer, glPixelMapglPixelZoom

图像缩放

 

 

对图像像素进行缩放的函数是glPixelZoom(),其原型是:

void glPixelZoom(

  GLfloat xfactor,

  GLfloat yfactor

);

 

xfactoryfactor 分别表示在xy方向上像素放大因子,即每一个像素点经过放大后就在x方向上绘制xfactor个,y方向绘制yfactor个像素点,共xfactor*yfactor个像素点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值