Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3514498
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类: 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/秒,这样就可以将信号保存在中并作相应的处理。


楚媒体文件和的区别:文件是既包括又包括、甚至还带有的一个集合,也可以叫容器;
文件当中的和的压缩算法才是具体的。也就是说一个.avi文件,当中的可能是a,也可能是编码b,可能是编码5,也可能是编码6,具体的用那种编码的解码器

视频编码原理有极强的相关性,也就是说有大量的冗余信息。其中冗余信息可分为空域冗余信息和时域冗余信息。就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像、帧间图像数据压缩技术和压缩技术。

视频的分辨率和码率

编码率/比特率直接与文件体积有关。且编码率与编码格式配合是否合适,直接关系到视频文件是否清晰。 
在视频编码领域,比特率常翻译为编码率,单位是Kbps,例如800Kbps 
其中, 1K=1024 1M=1024K 
b 为 比特(bit) 这个就是电脑文件大小的计量单位,1KB=8Kb,区分大小写,B代表字节(Byte) s 为 秒(second) p 为 每(per) 
以800kbps来编码表示经过编码后的数据每秒钟需要用800K比特来表示。 
1MB=8Mb=1024KB=8192Kb 

	
	
	

帧率:影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。

帧率就是在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,左右黑边.

视频封装格式

封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。

播放条件

解码芯片(又叫芯片). 手机播放视频要依赖于解码芯片把画面和声音还原成可以播放的信号, 交由显示屏和喇叭(耳机)输出。 解码芯片的性能是有局限的, 类似于汽车的发动机功率是有极限的. 它能够流畅解码的数据,主要受限于以下几个参数和条件。

1.编码方案

这个是视频真正的格式, 注意不是通常意义上的文件名后缀。 手机解码芯片一般能解码h.263, MPEG-1等编码, 近年的解码芯片多可以解码h.264(又叫MPEG-4 AVC), 画面质量大大提高了。

2.分辨率

这里有2个概念, 分别是:
a. 物理分辨率, 即手机屏幕能显示的像素数, 用W x H个像素表示。常见的手机屏幕分辨率为320x240(QVGA), 随着大屏幕手机的普及, 更高的分辨率也开始出现. 例如: 480x320(iphone),640x360(nHD, 诺基亚触屏系列常见),640x480(VGA, 多普达系列常见), 甚至高达852x480(夏普高端手机常见).
b. 视频文件的分辨率, 这个是指视频画面的实际分辨率, 如, 320x240, 480x272, 640x480等等。
一般来说, 大部分手机的解码芯片不支持超过其屏幕物理分辨率的视频, 部分可以支持超过其屏幕物理分辨率的视频, 例如, 虽然iphone的屏幕物理分辨率为480x320, 但它支持640x480的视频, 此时播放的画面实际是把原视频缩小的.

3.码率

一般用多少kbps(千比特/秒)或者(/秒)来表示。 手机解码芯片所支持的码率一般都在1Mbps以下.

4.帧率

(FPS, 帧/秒), 就是视频画面刷新的速度, 作为参考, 国内电视机一般是25FPS, 电影标准为24FPS. 手机芯片, 最高支持30FPS, 早期型号最大只能15fps.

5.播放器

也就是播放软件。在视频播放过程中, 需要软件来识别各类视频文件封装(即通常所说的'格式'), 将数据'拆封'后, 交由解码芯片去做解码处理, 然后将解码后的数据实现播放。 这个'拆封'和播放的任务, 要由播放软件(播放器)完成.
一般播放器都能识别多种视频封装(即文件格式), 例如, Coreplayer能播放AVI, WMV, MP4等多种格式, RUN播放器能播放rm, rmvb格式的视频。

6.文件格式

大家所看到的文件名后缀, 如: MP4, 3GP, WMV, AVI,RM, RMVB等等. 实际上, 这些都是封装类型, 真正的视频格式不是文件名而是文件内的视频编码方案和音频编码放案。 能够播放哪些文件,实际取决于使用了哪个播放器, 以及硬件解码芯片能否识别该文件内的编码方案.

编辑本段



视频解码有四个步骤,分别是VLD(流处理)iDCT(频率转换MoComp(运动补偿)PostProc(显示后处理,解码去块滤波Deblocking)。通常我们所说的硬件加速或硬件解码,就是指视频解码的这几个步骤中,用显卡专用的解码引擎替代CPU的软件计算,降低CPU的计算负荷。
硬件解码:图形芯片厂家提出的用GPU资源解码的方案——与之相对的是软解,也就是传统的用CPU承担解码工作的方案。硬件解码的优点就是效率高,功耗低、热功耗低,缺点是缺乏有力的支持(包括、字幕等),局限性较大(例如打开硬件解码后PC的节能方面的功能失效cnq等),设置较为复杂。“硬解”其实更需要软件的支持,只是基本不需要参与运算,从而为系统节约了很多资源开销。通过降低占用率,可以给用户带来很多实惠


”就是通过软件让进行视频解码处理;而“硬解”是指不依赖于,通过专用的设备(子卡)单独完成视频解码,比如曾经的VCD/D都被冠以“硬解”的称号。现在实现硬解不需要额外的子卡,也不需要额外的投入,因为模块被整合在了GPU内部,而目前主流的(包括整合)都能支持硬解码。


软件配置

3D API能让编程人员所设计的3D软件只要调用其API内的程序,从而让API自动和硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,从而大幅度地提高了3D程序的设计效率。


滤镜
UV(紫外)镜
该镜能基本消除及杂光对感光的影响,同时对起保护作用。在高原地区摄影更是必需。




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对象之间的传递。

 

(转)openGL PBO Pixel Buffer Object

图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可以执行其它的操作而不需要等待像素数据传递的结束。

(转)openGL PBO Pixel Buffer Object

图2 不使用PBO的纹理载入

(转)openGL PBO Pixel Buffer Object

图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传递。它能大大提高像素传递的性能。

(转)openGL PBO Pixel Buffer Object

图4 两个PBO更新纹理


(转)openGL PBO Pixel Buffer Object

例子程序从窗口的左边读出(pack)像素数据到PBO,在更改它的亮度后,把它在窗口的右边绘制出来。通过按空格键,可以看glReadPixels的性能。

传统使用glReadPixels将阻塞渲染管道(流水线),直到所有的像素数据传递完成,才会将控制权交还给应用程序。相反,使用PBO的glReadPixels可以调度异步DMA传递,能够立即返回而不用等待。因此,CPU可以在OpenGL(GPU)传递像素数据的时候进行其它处理。


例子程序也使用了两个PBO,在第n帧时,应用帧缓存读出像素数据到PBO1中,同时在PBO中对像素数据进行处理。读与写的过程可同时进行,是因为,在调用glReadPixels时立即返回了,而CPU立即处理PBO2而不会有延迟。在下一帧时,PBO1和PBO2的角色互换。

(转)openGL PBO Pixel Buffer Object



  • GL_PIXEL_PACK_BUFFER_ARB 

    • GL_PIXEL_PACK_BUFFER_ARB 
    • 将像素数据传给PBO
    • GL_PIXEL_UNPACK_BUFFER_ARB 
    • 从PBO得到像素数据
       glMapBufferARB返回缓存对象的指针。参数target取GL_PIXEL_PACK_BUFFER_ARB或GL_PIXEL_UNPACK_BUFFER_ARB,参数access是能对映射缓存的操作,可取GL_READ_ONLY_ARB、GL_WRITE_ONLY_ARB和GL_READ_WRITE_ARB,分别表明可从PBO读、可向PBO写,可从PBO读也可向PBO写。
    由于glTexSubImage2D立即返回,因此CPU能够直接进行其它工作,无需等待实际的像素传递。
    为了将像素传递的性能最大化,可以使用多个PBO对象。图4中表明同时使用了两个PBO。在glTexSubImage2D将像素数据从PBO拷贝出来的同时,另一份像素数据写进了另一个PBO。
    在第n帧时,PBO1用于glTexSubImage2D,而PBO2用于生成一个新的纹理对象了。再到n+1帧时,两个PBO则互换了角色。由于异步DMA传递,像素数据的更新和拷贝过程可同时进行,即CPU将纹理源更新到PBO,同时GPU将从另一PBO中拷贝出纹理。
    (转)openGL PBO Pixel Buffer Object




阅读(1424) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~