OpenGL FrameBufferCopy相关Api比较

glCopyPixels,glReadPixels,glCopyTexImage2D,glFramebufferTexture2D

标题所述的openGL api都是与提取frame buffer中的像素有关,那么它们有何区别呢?

1.void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)

描述:

  将屏幕(opengGL程序窗口)中的指定区域复制到当前光栅位置(glRasterPos)对应的frame buffer中。可以理解为把直接把屏幕上的像素拷贝到frame buffer中,没有经过内存

参数:

  x,y:左下角的窗口坐标,单位是像素。

  width,height:复制矩形的长宽,单位是像素。

  type:GL_COLOR, GL_DEPTH, and GL_STENCIL

2.void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data)

描述:

  从帧缓冲中读取一个像素块到内存data中。

参数:

  x,y:左下角的窗口坐标,单位是像素。

  width,height:复制矩形的长宽,单位是像素。

  format:像素数据的格式,GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA, GL_LUMINANCE, and GL_LUMINANCE_ALPHA.

  type:像素数据的类型,GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT等

  data:返回的像素数据。

3.void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)

描述:

  从frame buffer中复制一个二维纹理子对象,效果相当于glTexImage2D,只是数据源不同。

参数:

  target:指定目标纹理,GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, or GL_TEXTURE_CUBE_MAP_NEGATIVE_Z.

  level:指定层次细节数,一般为0.

  internalformat:纹理的内部格式,GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_ALPHA12, GL_ALPHA16, GL_COMPRESSED_ALPHA, GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_INTENSITY等

  x,y,width,height:确定拷贝的矩形区域。

  border:边界宽度,0or1

4.void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)

描述:

  应用FBO渲染到纹理(glGenTextures),直接绘制到纹理中。glCopyTexImage2D是渲染到FrameBuffer->复制FrameBuffer中的像素产生纹理。glFramebufferTexture2D直接渲染生成纹理,做全屏渲染(比如全屏模糊)时比glCopyTexImage2D高效

的多。FBO可以参考VBO, PBO与FBO(三)

参数:

  target:GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_FRAMEBUFFER.

  attachment:连接点名字,GL_COLOR_ATTACHMENTi, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT or GL_DEPTH_STENCIL_ATTACHMENT.

  textarget:不详

  texture:glGenTextures产生的纹理id

  level:mipmap level of texture to attach.

05-06 20:01