1.glReadPixels:

  • 它是GPU渲染完数据在显存,回传内存的唯一方式。
  • 显存也被叫做显示内存、帧缓存,它是用来存储显示芯片处理过或者即将读取的渲染数据。如同计算机的内存一样,显存是用来存储图形数据的硬件。在显示器上显示出的画面是由一个个的像素点构成的,而每个像素点都以4至64位的数据来控制它的亮度和色彩,这些点构成一帧的图形画面。为了保持画面流畅,要输出和要处理的多幅帧的像素数据必须通过显存来保存,达到缓冲效果,再交由显示芯片和CPU调配,最后把运算结果转化为图形输出到显示器上。
  • 它的具体作用是读取一些像素。当前可以简单理解为“把已经绘制好的像素(它可能已经被保存到显卡的显存中)读取到内存”。
  • glReadPixels的用法和举例以及函数的参数说明:
    • 该函数总共有七个参数。
    • void glReadPixels(GLint x, GLint y, GLsizei width,GLsizei height, GLenum format, GLenum type, GLvoid * data);
      • 前四个参数可以得到一个矩形,该矩形所包括的像素都会被读取出来。
      • 参数x,y表示指定从帧缓冲区读取的第一个像素的窗口坐标。 此位置是矩形像素块的左下角。
      • 参数width,height表示指定像素矩形的尺寸。 一个宽度和高度对应于单个像素。
      • format表示指定像素数据的格式。 接受以下符号值:GL_ALPHA,GL_RGB和GL_RGBA。
      • type表示指定像素数据的数据类型。 必须是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4或GL_UNSIGNED_SHORT_5_5_5_1之一。
      • data表示返回像素数据。
      • 注意:
        • 第一、二个参数表示了矩形的左下角横、纵坐标,坐标以窗口最左下角为零,最右上角为最大值;
        • 第三、四个参数表示了矩形的宽度和高度
        • 第五个参数表示读取的内容,例如:GL_RGB就会依次读取像素的红、绿、蓝三种数据,GL_RGBA则会依次读取像素的红、绿、蓝、alpha四种数据,GL_RED则只读取像素的红色数据(类似的还有GL_GREEN,GL_BLUE,以及GL_ALPHA)。如果采用的不是RGBA颜色模式,而是采用颜色索引模式,则也可以使用GL_COLOR_INDEX来读取像素的颜色索引。目前仅需要知道这些,但实际上还可以读取其它内容,例如深度缓冲区的深度数据等。
        • 第六个参数表示读取的内容保存到内存时所使用的格式,例如:GL_UNSIGNED_BYTE会把各种数据保存为GLubyte,GL_FLOAT会把各种数据保存为GLfloat等。
        • 第七个参数表示一个指针,像素数据被读取后,将被保存到这个指针所表示的地址。注意,需要保证该地址有足够的可以使用的空间,以容纳读取的像素数据。例如一幅大小为256x256的图象,如果读取其RGB数据,且每一数据被保存为GLubyte,总大小就是:256x256x3 = 196608字节,即192千字节。如果是读取RGBA数据,则总大小就是256x256x4 = 262144字节,即256千字节。

综述:glReadPixels实际上是从缓冲区中读取数据,如果使用了双缓冲区,则默认是从正在显示的缓冲(即前缓冲)中读取,而绘制工作是默认绘制到后缓冲区的。因此,如果需要读取已经绘制好的像素,往往需要先交换前后缓冲。

2) void glUniformMatrix4fv

void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)
通过一致变量(uniform修饰的变量)引用将一致变量值传入渲染管线。
location : uniform的位置。
count : 需要加载数据的数组元素的数量或者需要修改的矩阵的数量。
transpose : 指明矩阵是列优先(column major)矩阵(GL_FALSE)还是行优先(row major)矩阵(GL_TRUE)。
value : 指向由count个元素的数组的指针。