untiy 3d ShaderLab读后感_1_第 1 章 Shader(着色器)的概念和在 3D 游戏中的作用

shader 的概念

 1 .1 .1虚拟世界中的光明和色彩

       Shader  即着色器,是一款运行在 GPU  上的程序,用来对三维物体进行着色处理,光与影的计算, 纹理颜色的呈现等,从而将游戏引擎中 一个个作为抽象的几何数据存在的模型、场景和特效,以和 真实世界类似的光与影的形式呈现于玩家的眼中。不论是诸如"魔兽世界"这样的大型网游,还是 诸如"愤怒的小鸟"这类大众小游戏,都是因为着色器的功效,我们才能观察、体会,甚至是身临 其境般地沉浸在计算机技术所创造的虚拟世界中 。因此可以说, Shader 就是照亮虚拟世界的"魔法"。 着色器在  GPU   上所做的 工作,的的确确能够称得上是一种"魔法",因为它能够实现各种读者所能想象出来的变化。通过 Shader 可以改变物体的形状、大小、位置、旋转等,更进 一步 ,通 过游戏引擎提供的支持, Shader 还可以用来做 Post Effects 后期处理,功能和 Photoshop 很相似 虚拟世界中的各种超乎想象和不可思议,美丽与邪恶,奇幻与真实,都是通过   Shader 来呈现给玩家的。

 

1.1.2游戏开发人员的终点

Shader 编程是一种对程序员理论基础和想象力的考验和挑战,所以有人说,会写 Shader 的程 序员才是真正的高手。可以开玩笑地说,从各位读者翻开这本书的第 一页开始,你就已经站在游 戏开发者高手的起点上了。

 

1.1.3Shader   (着色器)简史

      伴随着 GPU  硬件性能的提升,  Shader  的编程方式经历了从最初的固定管线 ,到可编程流水 线的发展。 Shader 有顶点 Shader 和段 Shader 两个基本类型,顶点 Shader 有着可以处理、变换 最终会渲染到屏幕上的网格物体的顶点位置的功能,但它不能生成新的顶点。顶点   Shader  的输出 会传递给流水线的下 一步。几何体的网格经过硬件的栅格化后,处于流水线上的片段  Shader 会被 执行,片段 Shader 会对一个片段(预备像素)进行各种测试。  Z 深度测试、 Alpha  比较测试,能 够通过各种测试的片段,最终会被写入渲染的输出帧中,从而成为显示器屏幕上的  一个可见像素 。

      微软公司根据自己所开发的图形软件库 DirectX 系列,定义了 系列的 SM (Shader Model  Shader 模型),用来描述 Shader 的特性和能力 SM 1.0 应于 DirectX 8.0 SM 2.0 对应于 DirectX 9.0b SM 3.0 对应于 DirectX 9.0c SM 4.0  DirectX 10.0 SM 5.0 对应于 DirectX 11.0

      作为另一个可以与 DirectX比肩的图形软件库标准 OpenGL ,因为支持厂商众多,所以这个图 形库在制定 Shader 标准时也很迟钝 。OpenGL 在最初并没有定义 Shader 标准的明显意愿,仅仅是 通过声明配置文件来表明 Shader 的指令集所具有的特性和能力。不过 SM4.0 大致相当于 OpenGL 3.3 标准, SM5.0 当于 OpenGL  4.3标

 

1.2 Shader的实例化

      使用 C# C++ Java  这些面向对象的编程语言时,有程序员经历的读者都知道大多数'情况下 需要实例化一个类,得到此类的对象,通过对象来进行逻辑上不相关的数据处理。刚刚说的是CPU 上的事情,在 GPU  上也有类似的概念,  Shader  就相当于编程语 言中类的概念,当我们需要对某 具体物体使用此  Shader   的定义时,我们需要实例化此 Shader,从而得到它个对象。通过这 种对象,我们可以把同  Shader  的含义通过赋予不同的具体内容,比如贴图、颜色等,从而得 到丰富多彩的变化,而无需重新定义,大大降低我们的工作强度。而且和编程语言中的类   -样, 我们可以在运行时进行实例化。


1.3 Shader的实现语言 

1.3.1 GPU 上的编程

       这个世界是复杂的,当然也是丰富多彩的。

       Shader 作为一款在 GPU  上运行的程序,是和在 CPU 上运行的程序完全不同的 。对于CPU  编 程,想必程序员出身的读者都能对 C、C++耳熟能详,即使作为几种后来者的更高级的进化,  ]ava、 C#这类基于虚拟机运行的语言,也具有 CPU 编程语言的天然基因。 -个成熟的程序员从 一 门 CPU 编程语言迁移到另一门 CPU 编程语言,并不会有太大的难度。

       但是 GPU  之所以被称为 GPU ,而不是多核CPU   中的另一个 CPU ,是因为其有着和CPU  完 全不同的本质,这种本质的不同首先体现在硬件的设计结构上,从而导致其有别于CPU  的处理能 力。硬件方面的东西这里不多讨论,但是反映到程序的编写上, GPU  需要一款完全不同的程序语言。 目前这种面向 GPU   的编程有 3  种高级图像语言可供选择:微软提供了  HLSL   (High   Level Shading Language) ,是通过Direct3D 图形软件库来写 Shader 程序的语言; DirectX的老对手 OpenGL为我们提供了 GLSL (OpenGL Shading Language) 来写 Shader 程序:除此之外,还有 一个 NVIDIA , 因此就研发了 Cg (C for graphics) 语言。 NVIDIA 开发 Cg 的意图是希望能把显卡上的程序开发 独立于 DirectX 和 OpenGL 这类图形软件库,这算是 一个很美好的愿景,但由于 Cg 是由 NVIDIA 和微软公司共同研发的,其实就是以且 SL 为基础开发的,因此 二者很相似。不过 Cg 同时兼容 Direct3D 和 OpenGL 图形接口,这意味着 Cg 编写的 Shader 可以被编译到 Direct3D 和 OpenGL 都 能适应运行的环境。

 

1.3.2 Unitγ 中的着色器编程

在本书所要讲解的 Unity  开发环境中,这个引擎对 Shader 编程语言的支持是很全面的,读者 可以选择 GLSL 来写 Shader 程序。不过为了实现最大化的跨平台支持,  Unity 对 Shader 编程语言 的支持重点是 Cg ,因此本书中所有Shader 的编程代码都是使用 Cg 语言来实现的。 Cg 语言和 CPU 上的 C 语言是很相似的,只不过有了自己的一套关键字和函数库。如果读者是 Shader 编程的新手, 可能对 Cg  很陌生,这个 Shader  程序语言其实井不难,读者只需要了解它的一套关键字和常用函 数就可以了。 Cg 语言的权威和入门教程在 NVIDIA  的官方网站上,这个教程的链接在附录中。如 果读者以前没有 Shader 编程的经历,可能需要先花上一两天时间,把  NVIDIA  官网上的 Cg 入门 教程先看 一下,熟悉 Cg  语言的几个关键字和常用函数;如果读者有过   Shader  编程经验,不论丰 富与否、何种平台  ,都可以把这一步跳过去,按着顺序翻阅本书即可。

你可能感兴趣的:(3D,shaderlab,untiy)