Unity_Shader开发_认识(一)

图形硬件的简单历史:

       GPU(Graphic Processing Unit) 中文名图形处理器。20世纪六、七十年代,受图形硬件的限制,图形显示器只是计算机输出的一种工具。受硬件的发展水平,人们只是纯粹的从软件角度考虑计算机图形界面的规范问题。此时还没有GPU。

        Programmable Graphics Processing Unit(GPU),即可编程图形处理单元,通常也称之为可编程图形硬件。GPU概念在20世纪70年代末和80年代初被提出,使用单片集成电路(monolithic)作为图形芯片,此时的GPU已经被用于视频游戏和动画方面,它能够很快地进行几张图片的合成(仅限于此)。在20世纪80年代末到90年代初这段时间内,基于数字信号处理芯片(digital signal processor chip)的GPU被研发出来,与前代相比速度更快、功能更强,当然价格是非常的昂贵。在1991年,S3 Graphics公司研制出第一个单芯片2D加速器,到了1995年,主流的PC图形芯片厂商都在自己的芯片上增加了对2D加速器的支持。与此同时,固定功能的视窗加速器(fixed-function Windows accelerators)由于其高昂的价格而慢慢退出PC市场。

      1998年NVIDIA公司宣布modern GPU的研发成功,标志着GPU研发的历史性突破成为现实。通常将20世纪70年代末到1998年的这一段时间称之为pre-GPU时期,而自1998年往后的GPU称之为modern GPU。在pre-GPU时期,一些图形厂商,如SGI、Evans & Sutherland,都研发了各自的GPU,这些GPU在现在并没有被淘汰,依然在持续改进和被广泛的使用,当然价格也是非常的高昂。

modern GPU使用晶体管(transistors)进行计算,在微芯片(microchip)中,GPU所使用的晶体管已经远远超过CPU。例如,Intel在 2.4GHz的Pentium IV上使用5千5百万(55 million)个晶体管;而NVIDIA在GeForce FX GPU上使用超过1亿2千5百万(125 million)个晶体管,在NVIDDIA 7800 GXT上的晶体管达到3亿2百万(302 million)个。

    回顾Modern GPU的发展历史,自1998年后可以分为4个阶段。NVIDIA于1998年宣布Modern GPU研发成功,这标志着第一代Modern GPU的诞生,第一代Modern GPU包括NVIDIA TNT2,ATI的Rage和3Dfx的Voodoo3。这些GPU可以独立于CPU进行像素缓存区的更新,并可以光栅化三角面片以及进行纹理操作,但是缺乏三维顶点的空间坐标变换能力,这意味着“必须依赖于GPU执行顶点坐标变换的计算”。这一时期的GPU功能非常有限,只能用于纹理组合的数学计算或者像素颜色值的计算。

从1999到2000年,是第二代modern GPU的发展时期。这一时期的GPU可以进行三维坐标转换和光照计算(3D Object Transformation and Lighting, T&L),并且OpenGL和DirectX7都提供了开发接口,支持应用程序使用基于硬件的坐标变换。这是一个非常重要的时期,在此之前只有高级工作站(workstation)的图形硬件才支持快速的顶点变换。同时,这一阶段的GPU对于纹理的操作也扩展到了立方体纹理(cube map)。NVIDIA的GeForce256,GeForce MAX,ATI的Radeon 7500等都是在这一阶段研发的。

    2001年是第三代modern GPU的发展时期,这一时期研发的GPU提供vertex programmability(顶点编程能力),如GeForce 3,GeForce 4Ti,ATI的8500等。这些GPU允许应用程序指定一个序列的指令进行顶点操作控制(GPU编程的本质!),这同样是一个具有开创意义的时期,这一时期确立的GPU编程思想一直延续到2009年的今天,不但深入到工程领域帮助改善人类日常生活(医疗、地质勘探、游戏、电影等),而且开创或延伸了计算机科学的诸多研究领域(体绘制、光照模拟、人群动画、通用计算等)。同时,Direct8和OpenGL都本着与时俱进的精神,提供了支持vertex programmability的扩展。不过,这一时期的GPU还不支持像素级的编程能力,即fragment programmability(片段编程能力),在第四代modern GPU时期,我们将迎来同时支持vertex programmability和fragment programmability的GPU。

    第四代modern GPU的发展时期从2002年末到2003年。NVIDIA的GeForce FX和ATI Radeon 9700同时在市场的舞台上闪亮登场,这两种GPU都支持vertex programmability和fragment programmability。同时DirectX和OpenGL也扩展了自身的API,用以支持vertex programmability和fragment programmability。自2003年起,可编程图形硬件正式诞生,并且由于DirectX和OpenGL锲而不舍的追赶潮流,导致基于图形硬件的编程技术,简称GPU编程,也宣告诞生。恭喜GeForce和ATI的硬件研发人员,你们终于可以歇口气了,不用较着劲地出显卡了,同时也恭喜 DirectX和OpenGL的研发人员,你们也可以休息下了,不用斗鸡一般的工作了,最后恭喜广大工作在图形图像领域的程序员,你们可以继续学而不倦。

目前最新的可编程图形硬件已经具备了如下功能:

1.    支持vertex programmability和fragment programmability;

2.    支持IEEE32位浮点运算;

3.    支持4元向量,4阶矩阵计算;

4.    提供分支指令,支持循环控制语句;

5.    具有高带宽的内存传输能力(>27.1GB/s);

6.    支持1D、2D、3D纹理像素查询和使用,且速度极快;

7.    支持绘制到纹理功能(Render to Texture,RTT)。

(摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”第一章。)

可编程GPU

        TL变换 T 指 Transform  ,L指Lighting,也就是对顶点进行变换,对模型进行光照处理,叫做变换光照流水线  。 

        Vertex 即我们熟悉的组成3D图形的顶点,设计3D模型是基于坐标空间内部设计的,Vertex信息包含了3D模型在空间内的坐标等信息。 Vertex Shader 则是对于Vertex信息的运算编程器,可以通过赋予特定的算法而在工作中改变3D模型的外形Vertex Shader顶点运算单元可以直接检索显存中的材质数据。对于复杂的的场景中的大量的材质和多边形,顶点材质技术可以极大的提高GPU在处理复杂的游戏场景时的效率。并且还可以使用Vertex Shader这一特性实现很多炫酷的特效。

GPU的优点和缺点  

  GPU的优越性, 由于GPU具有高并行结构,在GPU处理图形数据和复杂算法方面拥有比CPU更高的效率。CPU大部分面积为控制器和寄存器,GPU拥有更多的ALU(Arithmetic Logic Unit),逻辑运算单元,用于数据处理。这样的结构适合对密集型数据进行并行处理。

GPU采用流式并行计算模式可对每个数据进行独立的并行计算,即流内任意元素的计算不依赖于其它同类型数据如计算一个顶点的世界位置坐标,不依赖于其它顶点的位置。所谓并行计算是指 多个数据并行运算的时间和1个数据单独执行的时间是一样的。所以在顶点处理程序中,可以同时处理N个顶点数据

GPU逻辑单元多 CPU还需要控制器,缓存器。

 GPU 的缺陷  由于“任意一个元素的计算不依赖于其它同类型数据”,导致“需要知道数据之间相关性的”算法,在GPU上很难实现。一个典型的例子就是射线与物理的求交运算。GPU中控制器少于CPU,致使控制能力有限。另外,进行GPU编程必须掌握计算机图形学相关知识,以及图形处理API,入门门槛高,学习周期较长,尤其国内关于GPU编程的质料较为匮乏,这些都导致了学习难度的增加。在早期,GPU编程只能使用汇编语言,开发难度高、效率低,不过,随着高级shader language的兴起,在GPU上编程已经容易多了

终结: 2003年开始正式进入可编程GPU阶段,GPU的并行处理能力强于CPU,目前GPU无法代替CPU

    

原文地址:https://www.cnblogs.com/bambomtan/p/5103423.html