像素缓冲区对象PBO 记录

和所有的缓冲区对象一样,它们都存储在GPU内存中,我们可以访问和填充PBO,方法和其他的缓冲区一样。

  • 当一个PBO被绑定到GL_PIXEL_PACK_BUFFER,任何读取像素的OpenGL操作都会从PBO中获取它们的数据,如glReadPixels,glGetTexImage和glGetCompressedTexImage。通常的操作会从FBO或纹理中抽取数据,并将它们读取客户端内存中。当PBO绑定到GL_PIXEL_PACK_BUFFER时,像素数据在GPU内存中的PBO,而不会下载到客户端的内存
  • 当一个PBO绑定点是GL_PIXEL_UNPACK_BUFFER,任何绘制像素的OpenGL操作都会向一个绑定的PBO对象写入数据。如glTexImage*D,glTexSubImage*D等等。通常的这些操作将数据和纹理从CPU内存中上传到帧缓冲区中,当PBO绑定到GL_PIXEL_UNPACK_BUFFER时,上传数据和纹理过程经过PBO。如图(from:http://www.songho.ca/opengl/gl_pbo.html

PBO的主要优势:

  • 可以通过DMA (Direct Memory Access) 快速地在显卡上传递像素数据,而不需要耗费CPU的时钟周期。
  • 另一个优势是它还具备异步DMA传输。

左侧图是从图像文件或视频中加载纹理。首先,资源被加载到系统内存(Client)中,然后使用glTexImage2D()函数从系统内存上传到OpenGL纹理对象中(Client->Server)。这两次数据传输(加载和复制)完全由CPU执行。

右侧图中图像可以直接加载到PBO中,而PBO是由OpenGL控制的。虽然CPU有参与加载纹理到PBO,但不涉及将像素数据从PBO传输到纹理对象的工作,而是由GPU(OpenGL驱动)来负责PBO到纹理对象的数据传输的,这也就意味着OpenGL执行DMA传输操作不会占用CPU的时钟周期。此外,OpenGL还可以安排稍后执行的异步DMA传输。所以glTexImage2D立即返回,CPU也无需等待像素数据的传输了,可以继续其他工作

使用

当绘制内容在屏幕上显示时,可能需要在像素彻底消失之前再次取回,原因可能是检查实际的渲染情况,也可能是应用到后续帧的效果需要使用前面帧的像素进行合成;总之这时需要glReadPixels函数发挥作用。 
glReadPixels本身是同步操作,需要操作完成后才返回,这期间对程序性能会有很大冲击,是影响性能的关键点。

//从缓存区中读取像素数据到PBO,避免了复制到客户端的内存上可能带来的性能问题
glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBufferObj[]);
glReadPixels(, , width, height, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glBindBuffer(GL_PIXEL_PACK_BUFFER, ); //接下来将PBO绑定为解包缓冲区,然后直接将像素读取到PBO,然后直接将像素加载到纹理中
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixBufferObj[]);
glActiveTexture(GLTexture0 + X);
glTexImage2D(GL_Texture_2D,
,
GL_RGB8,
width,
height,
,
GL_RGB,
GL_UNSIGNED_BYTE,
NULL);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, );

这样能将像素重定向到GPU中的PBO中,避免复制到客户端内存可能带来的性能问题。

参考

像素缓冲区对象PBO 记录的更多相关文章

  1. [译]OpenGL像素缓冲区对象

    目录概述创建PBO映射PBO例子:Streaming Texture Uploads with PBO例子:Asynchronous Readback with PBO 概述 OpenGL ARB_p ...

  2. OpenGL顶点缓冲区对象(VBO)

    转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO        GL_ARB_vertex_buffer_object 扩展可 ...

  3. OPenGL中的缓冲区对象

    引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...

  4. OpenGL ES 3.0 帧缓冲区对象基础知识

    最近在帧缓冲区对象这里卡了一下,不过前面已经了解了相关的OpenGL ES的知识,现在再去了解就感觉轻松多了.现在就进行总结. 基础知识 我们知道,在应用程序调用任何的OpenGL ES命令之前,需要 ...

  5. WebGl 利用缓冲区对象画多个点

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  7. OpenGL顶点缓冲区对象

    [OpenGL顶点缓冲区对象] 显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码.在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件.在最好的情况下,是编 ...

  8. WebGL简易教程(三):绘制一个三角形(缓冲区对象)

    目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...

  9. node 全局对象global —— 记录在线人员

    最近做毕设的时候,在做查看在线人员这个功能的时候,一直卡顿,我的思路是数据库保存 是否在线 字段,可以在登录时和退出系统修改状态,但如果用户之间关闭窗口时候就没办法向后台发出修改在线状态的请求.我想到 ...

随机推荐

  1. 窥探原理:实现一个简单的前端代码打包器 Roid

    roid roid 是一个极其简单的打包软件,使用 node.js 开发而成,看完本文,你可以实现一个非常简单的,但是又有实际用途的前端代码打包工具. 如果不想看教程,直接看代码的(全部注释):点击地 ...

  2. js中复制功能总结

    目前copy主流有四种方式:ZeroClipboard,Clipboard.js,execCommand,setData,clipboardData 概况: ZeroClipboard 就是常说的Fl ...

  3. HDU 1234 简单模拟题

    题目很简单不多说了,我只是觉得这题目的输入方式还是很有特点的 #include <cstdio> #include <cstring> #include <algorit ...

  4. 常州模拟赛d7t1 亲戚

    分析:把题目换个方式理解,就是把各个点排成一列,并且指定了若干对的先后次序,问你有多少种序列满足要求. 显然是一道dp题,直接推出方程似乎有点点困难,那么先看看数据特点. 1.有一些点满足fi=0,那 ...

  5. 统计单词个数(codevs 1040)

    题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<= ...

  6. Hihocoder 1333 (splay)

    Problem 平衡树 splay2 题目大意 维护一个序列,支持四种操作: 操作1:添加一个数,编号为x,权值为y. 操作2:删除编号在区间[x,y]内的数. 操作3:将编号在区间[x,y]内的数的 ...

  7. Memory+SLES 11/12 OS Tuning & Optimization

    https://www.suse.com/documentation/sles11/book_sle_tuning/data/sec_util_memory.html SLES 11/12 OS Tu ...

  8. Ubuntu 16.04安装Chrome浏览器

    一.先有一个hosts能访问Google 参考:http://www.cnblogs.com/EasonJim/p/5999060.html 二.安装方法有两种,如下所示: 1.下载deb包(推荐) ...

  9. qt自己定义搜索框(超简单,带效果图)

    1. 什么也不要说.先上效果图: 2. 代码 头文件: #ifndef APPSEARCHLINE_H #define APPSEARCHLINE_H #include <QLineEdit&g ...

  10. Windows 9立即公布了

    Windows 9技术预览版可能于今晚在美国旧金山举办的Windows公布会上宣布.下一代的Windows名称最有可能是Windows或Windows 9.网友猜想也可能是WIndows X或Wind ...