我想首先唠叨下我为什么打算写这一系列的文章及文章的定位。
我写的动力主要来源于如下原因:
- 对之前学习的一些总结、复习和提炼
- 尽可能的填充一些概念上的空白。 有不少关于 Unity shader 的文章只讲 Shaderlab 语法,讲各种光照模型等, 这对于缺乏概念的新手来说是不太好理解的。
- 之前信誓旦旦的跟朋友说以后学了 shader 会写点文章出来,算是允诺。。。
文章定位:
- 这是学习笔记,不是教程。如果内容会有出入,非常感谢和希望您能指正。
- 主要基础概念为主,可能很零散。
之前有前辈说过,学习一门知识前,了解其由来对入门很有好处。我比较赞同这个观点,所以开篇我们来说写历史。
CPU 之外的另外一个 PU - GPU
随着计算机处理图形的计算量越来越来大,CPU难以满足计算速度上的需求, 为了将图形的计算单独拿出来执行,上世纪70年代开始出现了为加速图形绘制的硬件。这些硬件跟大部分刚出来的新事物一样,功能有限,而且不太完善,当然那个时候也不叫 GPU。
1999 年,NVIDIA 公司发布了 GeForce256, 并且提出一个 Graphics Process Unit (GPU) 概念。很多文章都提到这款显卡有划时代的意义,因为它是第一款带有可编程顶点处理能力的显卡,这意味着显卡从之前的只可配置上升到了可编程的高度,开发者从此可以实现自己顶点处理算法。NVIDIA 也是提出 GPU 这个词来对 GeForece256 与之前显卡做区分。
2000 年以后, GPU 技术一直在不断的发展,处理和运算能力不断打变强变大。为了利用 GPU 强大的并行计算能力,出现了 CUDA 并行计算平台。有兴趣的同学可以关注下CUDA官网.
Shader Model
首先我们要提下当今跟 GPU 打交道的形API:Microsoft DirectX、 OPENGL 和转为嵌入式设备设计的OPENGL GS。Directx 是微软提供的图形 API, OPENGL 和 OPENGL ES 现在是由 Khronos Group 团队维护开发的图形API。
这些图形 API 都提供对 GPU 编程的能力,这能力就是我们说的 Shader。图形 API 的更新会提供不同的 shader 的能力 (当然是越来越强大)。微软提出了一个词叫 Shader Model, 并用不同的版本号来区分 Shader 的能力。通常我们也会称 Shader Model 为 SM。
下面列出到现在为止 Shader Model 的各个版本与 DirectX 版本的对应关系:
- Shader Model 1.0(DirectX8.0)
- Shader Model 2.0(DirectX9.0b)
- Shader Model 3.0(DirectX9.0c)
- Shader Model 4.0(DirectX10)
- Shader Model 4.1(DirectX10.1)
- Shader Model 5.0(DirectX11)
我们先不关注各个版本区别,只要知道版本号越高,提供的功能越来越强大。
总结
GPU 为大量图形计算而生,而 Shader 是对 GPU 编程的技术。微软用 Shader Model 的不同版本号来区分不同 Shader 的能力。