一、什么是Shader:
Shader,就是着色器,是一种运行在 GPU 上的程序。GPU —— Programmable Graphics Processing Unit,即可编程图形处理单元,也称为可编程图形硬件。至于 GPU 上的编程,实质上就是 GPU 允许应用程序指定一个序列的指令进行顶点操作控制。Shader 的作用是:
对三维物体进行着色处理、光与影的计算、纹理颜色的呈现等,从而将游戏引擎中一个个作为抽象的几何数据存在的模型、场景和特效,以和真实世界类似的光与影的形式呈现与玩家的眼中。(简单点的理解就是:利用 GPU 编程使得构件出来的对象近似于真实世界中的对象呈现出来的处理)通过 Shader 可以改变物体的形状、大小、位置以及旋转等。
二、Shader发展和架构:
1.发展简史:
学过 OpenGL 的人应该知道,OpenGL 的发展历程就是从固定管线的渲染发展到可编程管线的渲染。其实,Shader 也是相似的,最初的 Shader 编程采用的也是固定管线,如今也发展为可编程流水线。
微软图形软件库DirectX,定义了一系列的 SM,即 Shader Model(Shader 模型),用于描述 Shader 的特性和能力,而且与DirectX的版本具有对应关系如下:
SM 1.0 ——》DirectX 8.0,SM 2.0 ——》DirectX 9.0,
SM 3.0 ——》DirectX 9.0c,SM 4.0 ——》DirectX 10.0,
SM 5.0 ——》DirectX 11.0
说到DirectX我们自然而然地想起与之比肩的另外一个图形软件库标准OpenGL,它对于SM的也具有版本对应关系:
SM 4.0 ——》OpenGL 3.3,SM 5.0 ——》OpenGL 4.3
主流图形 API:OpenGL、OpenGL ES 和 DirectX
近几年推出的新型图形 API:Vulkan 和 Metal
2.内容架构:
Shader 分为两种基础类型:顶点 Shader 和片段 Shader,它们的特点分别是:
顶点 Shader:具有可以处理、变换,最终会渲染到屏幕上的网格物体的顶点位置的功能,但它不能生成新的顶点;
片段 Shader:会对一个片段(预备像素)进行各种测试,如 Z 深度测试、Alpha 比较测试,能通过各种测试的片段,最终会被写入渲染的输出帧中,从而成为屏幕上的一个可见像素。
3.Shader 的实例化:
从上文我们已经知道了 Shader 是 GPU 中的一种编程程序,那么与 CPU 中运行的普通编程语言(C语言、C++等)中的类相似,GPU 中的 Shader 也相当于一个类,能够进行实例化,生成对象,然后可以对此对象进行各种属性的设置,例如设置贴图和颜色。
4.Shader 的实现语言:
GPU 与 CPU 是截然不同的,这不仅仅再其硬件结构的差异上,这也就决定了在两者运行环境下的编程过程也是不同的。目前面向GPU的编程,有3种高级图像语言,分别是:
a.微软的 HLSL(High Level Shading Language),是通过 Direct3D 图形软件库来写 Shader 程序的语言;
b.OpenGL 提供的 GLSL(OpenGL Shading Language) 来写 Shader 程序;
c.NVIDIA 提供的 Cg(C for graphics)语言(以 HLSL 为基础,很相似),兼容 Direct3D 和 OpenGL 图形接口;
考虑到最大化的跨平台支持,选择使用兼容性最高的 Cg 作为编写Shader的语言,但假如只针对 Unity 3D 引擎,也可以选择 GLSL。