Shader和Material

如果是进行3d游戏开 发的话,想必您对着两个词不会陌生。Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组 合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设 置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的 renderer(渲染器)来进行渲染(输出)了。

所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。

Shader大体上可以分为两类,简单来说

表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。类比卡片机,上手以后不太需要很多努力就能拍出不错的效果。

片段着色器(Fragment Shader) - 可以做的事情更多,但是也比较难写。使用片段着色器的主要目的是可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。

在Unity中材质与Shader的关系很紧密。Shader中的代码定义使用什么样的属性和资源。材质允许我们调整属性以及指定资源。

要创建一个新的材质,可以通过 Material, use Assets->Create->Material ,然后可以把它直接拖到游戏对象上以应用之。

Shader的技术细节

Unity 中大量的 Shader 系统。让我们可以调整游戏的内置图形效果。其工作原理是像这样的:

Shader 从根本上说是为游戏内置的shading外观定义了一个公式。在Shader内部有一些属性(典型地是纹理),Shader是通过材质实现的,材质是直接附加到每个GameObject上的。在材质内部,可以选择一个Shader,然后定义Shader要用到的属性(通常是纹理和颜色,但还有很多其他的)

过程相当复杂,流程是下面这样的

左边的图是Carbody Shader,2个不同的材质通过Blue car Material和Red car Material创建的,这2种材质都各指定了2个纹理:Car Texture 定义了车的主要纹理,另一个纹理是Color FX。Shader的这些属性让车看起来有两种色调。 可以看到红车的前面:面对摄像机的是黄色,然后角度越大就越褪成紫色。材质被附加到两个车上。车轮,灯和车窗没有变色效果,因为要用到不同的材质。 图的底部是一个Simple Metal Shader,Wheel Material 用了这个Shader。 具体地说, Shader 定义了:

  • 渲染物体的方式,包括根据用户的不同的显卡使用不同的方式。
  • 任何用于渲染的顶点和片断的程序。
  • 材质内部可赋值的纹理属性。
  • 材质内部可赋值的颜色和数量设置。

材质定义了:

  • 用哪个纹理渲染。
  • 用哪个颜色渲染。

任何其他资源,比如shader渲染要用到的Cubemap。

Shader是图形程序员的命中注定。用ShaderLab语言创建,非常简单。但是,要让shader很好地运行在各种各样的显卡上就不容易了。

Unity直接内置了大量的 shaders,在 Standard Assets Library 库中还有更多。

其中Legacy Shaders是Unity4.x的Shaders

Shader编程

Unity有三种Shader编程

  • Surface Shader:Unity提供一种简化的支持光照的Shader
  • Vertex & Frag Shader:自己控制整个渲染过程
  • Fixed Shader:采用固定的光照算法,只填写相应的SurfaceOutput和SurfaceOutputStandard的值

results matching ""

    No results matching ""