UnityShader入门学习(一)——GPU与Shader

1 GPU的发展历程

1.1 Gpu的前世

1962年MIT的一个博士的画板程序奠定了图形学的基础。但是在随后的20年例,计算机图形学一直在不断发展,不过没有专门的图形处理芯片。

1984年SGI推出了专业的高端图形工作站,有了专门的图形硬件,叫做图形加速器。引入了许多经典的概念,如顶点变换和纹理映射。随后的10多年里,SGI又研发了很多图形工作站,但都是面向专业领域,价格昂贵,没法进入消费级市场。不过消费级市场还是出现了一些2D加速卡。

1995年3dfx公司发布了全球第一款消费级3D图形加速卡voodoo。开山鼻祖。随后几年,NVIDIA和ATI分别分别发布了自己的TNT和Rage系列,从硬件上实现了Z缓存和双缓存,还可以进行光栅化,CPU从繁复的像素填充任务中解脱了。但是顶点变换还是由CPU负责,光栅化也是能力很有限。

1.2 GPU的今生

1999年,NVIDIA发布了Geforce 256, 第一款提出GPU概念,开天辟地的产品。Geforce 256的核心技术有T&L硬件(硬件级的几何与光照转换引擎),纹理压缩,凹凸映射,双重纹理等等。同时期的OpenGL和DirectX7也提供了硬件顶点变化的编程接口。

2001年微软发布DirectX8, 包含了Shader Model1.0标准。遵循该标准的GPU可以支持顶点和像素编程。不过当时N和A两家的产品都不支持像素编程。

2003年微软发布DirectX9.0b,Shader Model更新到2.0, shader成为其标准配置。NVIDIA和ATI的产品都具备了可编程顶点着色器和可编程像素着色器。

2006年微软发布DirectX10,迎来了Shader Model4.0。核心就是着色器采用了统一渲染架构。

2009年微软发布DirectX11,包含了Shader Model5.0。可编程方面支持的更多了,比如计算,Hull和Domain。

2014年微软发布了DirectX12, 目前Windows10有了,但是不能用。充分发挥多核CPU的性能,CPU和GPU的交互效率提升。Shader Model6.0

1.3 GPU的优越性

由于GPU具有高并行结构,所以GPU在处理图形数据和复杂算法方面拥有比CPU更高的效率。CPU大部分面积为控制器和寄存器,与之相比,GPU拥有更多的ALU(Arithmetic Logic Unit,逻辑运算单元)用于数据处理,这样的结构适合对密集型数据进行并行处理。
在这里插入图片描述
GPU采用流式并行计算模式,可对每个数据进行独立的并行结算,所谓“对数据进行独立计算”,即,流内任意元素的计算不依赖于其它同类型数据

4 GPU的缺陷
由于“任意一个元素的计算不依赖于其它同类型数据”,导致“需要知道数据之间相关性”的算法,在GPU上难以得到实现,一个典型的例子是射线与物体的求交运算。GPU中的控制器少于CPU,致使控制能力有限。
在这里插入图片描述

2 Shader三大语言

2.1 三大 Shader 编程语言(CG/HLSL/GLSL)

什么是Shader Language?

Shader Language的发展方向是设计出在便携性方面可以和C++、Java等相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染过程”同时“利用图形硬件的并行性,提高算法效率”。
Shader Language目前主要有3种语言:

基于 OpenGL 的 OpenGL Shading Language,简称 GLSL;
基于 DirectX 的 High Level Shading Language, 简称 HLSL;
还有 NVIDIA 公司的 C for Graphic,简称 Cg 语言。

2.2 OpenGL简介

OpenGL(全写Open Graphics Library)是一个定义了跨编程语言、跨平台的编程接口规格的专业图形程序接口。它用于三维图像(二维亦可),是一个功能强大,调用方便的底层图形库。OpenGL是行业领域中最为广泛接纳的2D/3D图形API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。它独立于视窗操作系统或其他操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业及虚拟现实等行业领域中。OpenGL是一个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。

OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分作出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面世,该版本比1.0的性能有许多提高,并加入了一些新的功能,其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片段着色技术的扩展功能。

2.3 DirectX简介

DirectX(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛适用于Microsoft Windows、Microsoft XBOX、Microsoft XBOX 360和Microsoft XBOX ONE电子游戏开发,并且只能支持这些平台。最新版本为DirextX 12,创建在最新的Windows 10。DirectX是这样一组技术:它们旨在使基于Windows的计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、3D动画和丰富音频)的应用程序的理想平台。DirectX包括安全和性能更新程序,以及许多涵盖所有技术的新功能。应用程序可以通过使用DirectX API来访问这些新功能。

DirectX加强3D图形个声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低了用户安装及设置硬件的复杂度。从字面意义上说,Direct就是直接的意思,而后边的X则代表了很多意思,从这一点上可以看出DirectX的出现就是为了众多软件提供直接服务的。

举例来说,以前在DOS下玩家玩游戏时,并不是安装上就可以玩了,他们往往首先要设置声卡的品牌和型号,然后还要设置IRQ(中断)、I/O(输入和输出)、DMA(存取模式),如果哪项设置不对,那么游戏声音就发不出来。这部分的设置不仅让玩家伤透脑筋,对游戏开发者来说就更为头痛,为了让游戏能够正确运行,开发者必须在游戏制作之初,把市面上所有声卡硬件数据都收集过来,然后根据不同的API(应用编程接口)来写不同的驱动程序。这对于游戏制作公司来说,是很难完成的,所以在当时多媒体游戏很少。微软正是看到了这个问题,为众厂家推出了一个共同的应用程序接口——DirectX。只要游戏是依照DirectX来开发的,不管显卡、声卡型号如何,统统都能玩,而且还能发挥最佳的效果。当然,前提是使用的显卡、声卡的驱动程序必须支持DirectX才行。

2.4 Cg

GLSL与HLSL分别基于OpenGL和Direct3D的接口,两者不能混用,事实上OpenGL和Direct3D一直都是冤家对头,争斗良久。OpenGL在其长期发展中积累下的用户群庞大,这些用户会选择GLSL学习。GLSL继承了OpenGL的良好移植性,一度在Unix等操作系统上独领风骚。但GLSL的语法体系自成一家。微软的HLSL移植性较差,在Windows平台上可谓一家独大,这一点在很大程度上限制了HLSL的推广和发展。但是HLSL用于DX游戏领域却是深入人心。

Cg语言(C for Graphic)是为GPU编程设计的高级着色语言,Cg极力保留C语言的大部分语义,并让开发者从硬件细节中解脱出来,Cg同时也有一个高级语言的其它好处,如代码的易重用性,可读性得到提高,编译器代码优化。Cg是一个可以被OpenGL和Direct3D广泛支持的图形处理器编程语言。Cg语言和OpenGL、Direct3D并不是同一层次的语言,而是OpenGL和DirectX的上层,即Cg程序是运行在OpenGL和DirectX标准顶点和像素着色的基础上的。Cg由NVIDIA公司和微软公司相互协作在标准硬件光照语言的语法和语义上达成了一致开发。所以,HLSL和Cg其实是同一种语言。

猜你喜欢

转载自blog.csdn.net/ithot/article/details/126063699