分类: Android平台
2016-08-07 16:14:10
原文地址:GPU openGL 作者:arthursky
显卡
1)GPU所采用的核心技术有T&L(几何转换和光照处理)、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬件T&L技术可以说是GPU的标志。
2)显卡BIOS,与之间的控制程序,另外还储存有显示卡的、规格、生产厂家及出厂时间等信息。打开计算机时,通过显示BIOS 内的一段控制程序,将这些信息反馈到屏幕上。
3)显卡PCB板,就是显卡的,它把显卡上的各个部件连接起来。
4)模块被整合在了GPU内部
视频编码
所谓方式就是指通过特定的,将某个的文件转换成另一种视频格式文件的方式。
是处理视频的前提。信号数字化后数据带宽很高,通常在20MB/秒以上,因此很难对之进行保存和处理。采用以后通常数据带宽降到1-10MB/秒,这样就可以将信号保存在中并作相应的处理。
分辨率->图像大小->编码方式->码率->帧率帧率:影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。
帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,
分辨率:影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。
像素指的是数码相机的。它是由相机里的光电传感器上的光敏元件数目所决定的,一个光敏元件就对应一个像素。因此像素越大,意味着光敏元件越多,相应的成本就越大。 数码相机的图像质量部分是由像素决定的,大过一定尺寸再单纯拿像素来比较就没有意义了,分辨率和图像的像素有直接关系。我们来算一算,一张分辨率为640 x 480的图片,那它的分辨率就达到了307200像素,也就是我们常说的30万像素,而一张分辨率为1600 x 1200的图片,它的像素就是200万。
清晰度
在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。 在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
带宽、帧率
例如在ADSL线路上传输图像,上行带宽只有512Kbps,但要传输4路CIF分辨率的图像。按照常规,CIF分辨率建议码率是512Kbps,那么照此计算就只能传一路,降低码率势必会影响图像质量。那么为了确保图像质量,就必须降低帧率,这样一来,即便降低码率也不会影响图像质量,但在图像的连贯性上会有影响。
硬件->屏幕大小->硬件->分辨率->像素
720P指的是1280*720的分辨率,16:9的比例,宽度一定是1280,高度可以比720小。 1080p指的是1920*1080的分辨率,16:9的比例,宽度一定是1920,高度可以比1080小。
高清电视, 高清台由于不是高清源(16:9 而标清4:3)所以会有黑边,16:9 12:9,左右黑边.
视频封装格式
封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。
播放条件
视频解码有四个步骤,分别是VLD(流处理)、iDCT(频率转换) 、MoComp(运动补偿)和PostProc(显示后处理,解码去块滤波Deblocking)。通常我们所说的硬件加速或硬件解码,就是指视频解码的这几个步骤中,用显卡专用的解码引擎替代CPU的软件计算,降低CPU的计算负荷。
硬件解码:图形芯片厂家提出的用GPU资源解码的方案——与之相对的是软解,也就是传统的用CPU承担解码工作的方案。硬件解码的优点就是效率高,功耗低、热功耗低,缺点是缺乏有力的支持(包括、字幕等),局限性较大(例如打开硬件解码后PC的节能方面的功能失效cnq等),设置较为复杂。“硬解”其实更需要软件的支持,只是基本不需要参与运算,从而为系统节约了很多资源开销。通过降低占用率,可以给用户带来很多实惠:
“”就是通过软件让进行视频解码处理;而“硬解”是指不依赖于,通过专用的设备(子卡)单独完成视频解码,比如曾经的VCD/D、都被冠以“硬解”的称号。现在实现硬解不需要额外的子卡,也不需要额外的投入,因为模块被整合在了GPU内部,而目前主流的(包括整合)都能支持硬解码。
软件配置
3D API能让编程人员所设计的3D软件只要调用其API内的程序,从而让API自动和硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,从而大幅度地提高了3D程序的设计效率。
PBO Pixel Buffer Object
PBO,即Pixel Buffer Object也是用于GPU的扩展()。这里的缓存当然就是GPU的缓存。PBO与VBO扩展类似,只不过它存储的是像素数据而不是顶点数据。PBO借用了VBO框架和所有API函数形式,并加了上两个"target"标志。这两个标识是:
这里的“pack”还是“unpack”,可分别理解为“传给”和“得到”。它们也都可以统一理解为“拷贝”,也就是像素数据的“传递”。
比如说,glReadPixel就是数据从帧缓存(framebuffer)到内存(memory),可理解为“pack”;glDrawPixel是从内存到帧缓存,可理解为“unpack”;glGetTexImage是从纹理对象到内存,可理解为“pack”;glTexImage2d从内存(memory)到纹理对象(texture object),可理解为“unpack”。
下图是PBO与Framebuffer和Text对象之间的传递。
图1 opengl PBO
使用PBO的好处是快速的像素数据传递,它采用了一种叫DMA(Direct Memory Access)的技术,无需CPU介入。另一个PBO的优点是,这种DMA是异步的。我们可以通过下面两张图来比较使用PBO的与传统的纹理传递的过程。
图2是用传统的方法从图像源(如图像文件或视频)载入图像数据到纹理对象的过程。像素数据首先存到系统内存中,接着使用glTexImage2D将数据从系统内存拷贝到纹理对象。包含的两个子过程均需要有CPU执行。而从图3中,我们可以看到像素数据直接载入到PBO中,这个过程仍需要CPU来执行,但是从数据从PBO到纹理对象的过程则由GPU来执行DMA,而不需要CPU参与。而且opengl可安排异步DMA,不必马上进行像素数据的传递。因此,相比而言,图3中的glTexImage2D立即返回而不是马上执行,这样CPU可以执行其它的操作而不需要等待像素数据传递的结束。
图2 不使用PBO的纹理载入
图3 使用PBO的纹理载入
GL_PIXEL_PACK_BUFFER_ARB用于将像素数据从opengl传递给应用程序,GL_PIXEL_UNPACK_BUFFER_ARB则是将像素数据从应用程序传递给opengl。
生成PBO
生成PBO分成3步:
1. 用glGenBuffersARB()生成缓存对象;
2. 用glBindBufferARB()绑定缓存对象;
3. 用glBufferDataARB()将像素数据拷贝到缓存对象。
如果在glBufferDataARB函数中将一个NULL的指针给源数组,PBO只会为之分配一个给定大小的内存空间。glBufferDataARB的另一个参数是关于PBO的性能参数(hint),表明缓存对象如何使用。该参数取GL_STREAM_DRAW_ARB表明是载入,GL_STREAM_READ_ARB表明是异步帧缓存读出。
映射PBO
PBO提供了一种将opengl控制的缓存对象与客户端地址空间进行内存映射的机制。所以客户端可通过glMapBufferARB()和glUnmapbufferARB就可以修改缓存对象的部分或整个数据。
void* glMapBufferARB(GLenum target, GLenum access);
GLboolean glUnmapBufferARB(GLenum target);
要注意:如果GPU正在对缓存对象进行操作,glMapBufferARB不会返回缓存对象直到GPU结束了对缓存对象的处理。为了避免等待,在调用glMapBufferARB之前,先调用glBufferDataARB(用NULL指针作为参数),这时OpenGL将丢弃老的缓存对象,为新的缓存对象分配空间。
在客户端使用PBO后,应调用glUnmapBufferARB来取消映射。glUnmapBufferARB返回GL_TRUE表明成功,否则返回GL_FALSE。
____________________________________________________
Demo
例子程序使用了不同方式来比较将纹理传给OpenGL的模式:
使用一个PBO; 使用两个PBO; 不使用PBO;
通过按空格键,可以不同模式间切换。
在PBO模式下,每帧的纹理源(像素)都是在映射PBO状态下直接写进去的。再通过调用glTexSubImage2D将PBO中的像素传递给纹理对象。通过使用纹理对象可以在PBO和纹理对象间进行异步DMA传递。它能大大提高像素传递的性能。
图4 两个PBO更新纹理
例子程序从窗口的左边读出(pack)像素数据到PBO,在更改它的亮度后,把它在窗口的右边绘制出来。通过按空格键,可以看glReadPixels的性能。
传统使用glReadPixels将阻塞渲染管道(流水线),直到所有的像素数据传递完成,才会将控制权交还给应用程序。相反,使用PBO的glReadPixels可以调度异步DMA传递,能够立即返回而不用等待。因此,CPU可以在OpenGL(GPU)传递像素数据的时候进行其它处理。
例子程序也使用了两个PBO,在第n帧时,应用帧缓存读出像素数据到PBO1中,同时在PBO中对像素数据进行处理。读与写的过程可同时进行,是因为,在调用glReadPixels时立即返回了,而CPU立即处理PBO2而不会有延迟。在下一帧时,PBO1和PBO2的角色互换。