音视频方案,音视频扩展内容(GDI,Direct3D和OpenGL等) (笔记)4

  在Windows平台下的视频播放技术主要有以下三种:GDI,Direct3D和OpenGL;音频播放技术主要是DirectSound。在Windows平台下视频的播放显示主要可以使用以下两种技术:Direct3D和OpenGL。以上两种显示技术是最好的。除了以上两种之外,还有其他的选择。比如说DirectDraw或者GDI。但是微软已经停止了对DirectDraw的支持。而GDI也并不是主要用于视频显示领域(主要用于软件开发)
  三种视频显示技术:GDI,Direct3D,OpenGL。其中Direct3D包含简单和复杂的两种显示方式:使用Surface和使用Texture;OpenGL也包含简单和复杂的两种显示方式:直接画像素和使用Texture。
视频方案,雷霄骅的专栏- http://blog.csdn.net/leixiaohua1020

-- DirectSound播放PCM
 DirectSound是Windows下最常见的音频播放技术。目前大部分的音频播放应用都是通过DirectSound来播放的。DirectSound是微软所开发DirectX的组件之一,可以在Windows 操作系统上录音,并且记录波形音效(waveform sound)。目前DirectSound 是一个成熟的API ,提供许多有用的功能,例如能够在较高的分辨率播放多声道声音。
   DirectSound3D(DS3D)最早是1993年与 DirectX 3 一起发表的。DirectX 8以后的DirectSound和DirectSound3D的(DS3D)被合称DirectX Audio。

> GDI播放视频的技术
  图形设备接口(Graphics Device Interface或Graphical Device Interface,缩写GDI),是微软公司视窗操作系统(Microsoft Windows)的三大核心部件(另外两个是kernel、user)之一。GDI是微软视窗系统表征图形对象及将其传送给诸如显示器、打印机之类输出设备的标准。其他系统也有类似GDI的东西,比如Macintosh的Quartz(传统的QuickDraw),和GTK的GDK/Xlib。
  GDI用来完成一些和绘制有关的工作,像直线或曲线的绘制,文字渲染,调色板控制。它最大的好处是它有可以直接访问硬件设备的能力。通过GDI可以非常容易的在不同类型的设备上绘制图形,像显示屏和打印机或类似的显示设备。这些能力是微软Windows系统“所见即所得”程序的核心。
  视频显示的输入数据一般情况下是非压缩的RGB/YUV数据。像H.264这些压缩码流是不能用于显示的。非压缩的RGB/YUV数据在我们电脑里并不常见,因为它的体积实在是太大了。像素格式必须转换为RGB(即不能是YUV)才能使用GDI画上去。因为BMP存储像素是RGB格式的。
  我们日常生活中比较常见的存储非压缩的RGB像素数据的格式就是BMP。它的文件体(除去文件头)中存储的是RGB数据。很容易发现,BMP文件明显大于JPEG等压缩格式的文件。

> Direct3D(简称D3D)播放视频的技术
  视频播放只是Direct3D的“副业”,它主要用于3D游戏制作。使用Direct3D可以用两种方式渲染视频:Surface和Texture。使用Surface相对来说比使用Texture要简单一些,但是不如使用Texture灵活。鉴于使用Surface更加容易上手.
  Direct3D(简称:D3D)是微软公司在Microsoft Windows系统上开发的一套3D绘图API,是DirectX的一部份,目前广为各家显示卡所支援。
  Direct3D的抽象概念包括:Devices(设备),Swap Chains(交换链)和Resources(资源)。Device(设备)用于渲染3D场景。例如单色设备就会渲染黑白图片,而彩色设备则会渲染彩色图片。Direct3D API定义了一组Vertices(顶点), Textures(纹理), Buffers(缓冲区)转换到屏幕上的流程。这样的流程称为Rendering Pipeline(渲染流水线)。
  在Direct3D中经常会出现“三角形”这个概念。这是因为在3D图形渲染中,所有的物体都是由三角形构成的。因为一个三角形可以表示一个平面,而3D物体就是由一个或多个平面构成的。
  使用Direct3D中的Texture(纹理)渲染视频。渲染与纹理。其实Ditect3D中的很多概念并不是出自于视频领域,而是出自于3D制作。在3D制作过程中,如果单靠计算机绘制生成3D模型,往往达不到很真实的效果。

  Direct3D使用一个纹理坐标系统,它是由用水平方向的u轴和竖直方向v轴构成。注意v轴是向下的(OpenGL的v轴是向上的)。需要注意的是,纹理坐标的取值范围是0-1,而不是像普通坐标那样以像素为单位。它代表了一种图像映射的关系。例如纹理坐标是(0.5,0.0),就是把2D纹理横向二分之一处的点映射到随后定义的物体顶点上去。

 -- 纹理(Texture)和表面(Surface)的区别与联系:
 1.Surfaces是一个存储2D图像的内存。
 2.Textures是一张贴图。Texture的图像数据存储于它的Surface中。一个Texture可以包含多个Surface。

 纹理,如果可以把一张2D图片“贴”到3D模型的表面上,则不但节约了计算机绘图的计算量,而且 也能达到更真实的效果。纹理就是这张“贴图”。
 渲染就是从模型生成图像的过程,通常是3D制作的最后一步。如在经过纹理贴图之后,形成了一个“木箱”模型。但是只有把它作为2D图像输出到屏幕上之后,它才能被我们的看见。这个输出的过程就是渲染。我们也可以调整这个“木箱模型”的参数,达到不同的渲染结果。比如说改变观察角度等等。

> OpenGL播放视频的技术
 OpenGL是一个和Direct3D同一层面的技术。相比于Direct3D,OpenGL具有跨平台的优势。尽管在游戏领域,DirectX的影响力已渐渐超越OpenGL并被大多数PC游戏开发商所采用,但在专业高端绘图领域,OpenGL因为色彩准确,仍然是不能被取代的主角。在高端的图形设备和专业应用方面OpenGL占据着统治地位(Direct3D目前还不支持)。开放源码社区(尤其是Mesa项目)一直致力于提供OpenGL支持。

 - Display List(显示列表)
 显示列表是一组OpenGL命令,被存储(编译)起来用于后续的执行。所有数据,几何(顶点)数据和像素数据都可以存入显示列表。数据和命令缓存到显示列表中可以提高性能。
 - Vertex Operation(顶点处理)
  顶点坐标和法线坐标经过模式视图矩阵从物体坐标系(object coordinates)转换为观察坐标系(eye coordinates)。若启用了光照,对转换后的定点和法线坐标执行光照计算。光照计算更新了顶点的颜色值。Primitive Assembly(图元装配)。
  顶点处理之后,基本图元(点、线、多边形)经过投影矩阵变换,再被视见体裁剪平面裁剪,从观察坐标系转换为裁剪坐标系。之后,进行透视除法(除以w)和视口变换(viewport transform),将3d场景投影到窗口坐标系。

 - Pixel Transfer Operation(像素操作)
  像素从客户内存中解包出来之后,要经过缩放、偏移、映射、箝拉(clamping)。这些处理即为像素转换操作。转换的数据存在纹理内存或直接经过光栅化转为片段(fragment)。
 - Texture Memory(纹理内存)
纹理图像载入到纹理内存中,然后应用到几何对象上。 
 - Raterization(光栅化)
 光栅化就是把几何(顶点坐标等)和像素数据转换为片段(fragment)的过程,每个片段对应于帧缓冲区中的一个像素,该像素对应屏幕上一点的颜色和不透明度信息。片段是一个矩形数组,包含了颜色、深度、线宽、点的大小等信息(反锯齿计算等)。如果渲染模式被设置为GL_FILL,多边形内部的像素信息在这个阶段会被填充。
 - Fragment Operation(片段操作)
 这是将片段转为帧缓冲区中的像素要进行的最后处理。首先是纹理单元(texel)生成。一个纹理单元由纹理内存中的数据生成,然后应用到每个片段上。之后进行雾计算。 雾计算完成后,还要按序进行若干片段测试,依次为蒙板(scissor)测试,alpha测试,模版(stencil)测试,深度测试。最后,执行混合,抖动,逻辑操作和遮蔽操作,最终的像素存入framebuffer。

 输入的YUV420P像素数据通过一个普通的函数转换为RGB数据后,传送给OpenGL播放。也就是像素的转换是通过CPU完成的。
 输入的YUV420P像素数据通过Shader转换为YUV数据,传送给OpenGL播放。像素的转换是通过显卡上的GPU完成的。

 OpenGL的着色器有.fsh和.vsh两个文件。这两个文件在被编译和链接后就可以产生可执行程序与GPU交互。.vsh 是Vertex Shader(顶点着色器),用于顶点计算,可以理解控制顶点的位置,在这个文件中我们通常会传入当前顶点的位置,和纹理的坐标。.fsh 是Fragment Shader(片元着色器),在这里面我可以对于每一个像素点进行重新计算。Vertex Shader是作用于每一个顶点的,如果Vertex有三个点,那么Vertex Shader会被执行三次。Fragment Shader是作用于每个像素的,一个像素运行一次。
  1.Vertex Shader(顶点着色器)主要是传入相应的Attribute变量、Uniforms变量、采样器以及临时变量,最后生成Varying变量,以及gl_Posizion等变量。
  2.Fragment Shade(片元着色器)可以执行纹理的访问、颜色的汇总、雾化等操作,最后生成gl_FragColor变量。有高手总结如下:“vsh负责搞定像素位置,填写gl_Posizion;fsh负责搞定像素外观,填写 gl_FragColor。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值